diff --git a/STYLE.md b/STYLE.md index 36cac0099..502f1c933 100644 --- a/STYLE.md +++ b/STYLE.md @@ -117,7 +117,7 @@ After coding, make sure to trim any trailing white space and convert any tabs to ### For bash ``` bash -find . -name -type f -exec sed -i 's/\t/ /;s/[[:space:]]*$//' {} + +find . -type f -name ! -wholename "./.git/*" ! -name "*.png" ! -wholename "./Bin/*" ! -wholename "./Build/*" -exec sed -i 's/\t/ /g;s/[[:space:]]*$//g' {} + ``` Where `` is `"*.c"` or `"*.(your file extention here)"`\ @@ -127,11 +127,18 @@ Search the `find` man page or tips and tricks for more options.\ Alternatively, for single file(s): ``` bash -sed -i 's/\t/ /;s/[[:space:]]*$//' +sed -i 's/\t/ /g;s/[[:space:]]*$//g' ``` Note: For macOS and BSD related distros, you may need to use `sed -i ''` inplace due to differences with GNU sed. +``` bash +git grep --cached -Ilz '' | while IFS= read -rd '' f; do tail -c1 < "$f" | read -r _ || echo >> "$f"; done +``` + +Use this to auto append a newline to the end of the file for any files that are under git. +Taken from [here](https://unix.stackexchange.com/a/161853) + ### For Powershell/pwsh ``` Powershell diff --git a/Source/API/EbApi.h b/Source/API/EbApi.h index f8ea1bf55..69ad4944c 100644 --- a/Source/API/EbApi.h +++ b/Source/API/EbApi.h @@ -174,12 +174,12 @@ typedef struct EB_H265_ENC_CONFIGURATION /* A preset defining the quality vs density tradeoff point that the encoding * is to be performed at. 0 is the highest quality mode, 11 is the highest - * density mode. - * + * density mode. + * * [0, 11] for >= 4k resolution. * [0, 10] for >= 1080p resolution. * [0, 9] for all resolution. - * + * * Default is 7. */ uint8_t encMode; @@ -190,8 +190,8 @@ typedef struct EB_H265_ENC_CONFIGURATION */ uint8_t tune; - /* Flag to enable for lower latency mode. The change is lossless. - * + /* Flag to enable for lower latency mode. The change is lossless. + * * Default is 0. */ uint8_t latencyMode; @@ -225,7 +225,7 @@ typedef struct EB_H265_ENC_CONFIGURATION /* Prediction structure used to construct GOP. There are two main structures * supported, which are: Low Delay (P or B) and Random Access. - * + * * In Low Delay structure, pictures within a mini GOP refer to the previously * encoded pictures in display order. In other words, pictures with display * order N can only be referenced by pictures with display order greater than @@ -261,7 +261,7 @@ typedef struct EB_H265_ENC_CONFIGURATION * * Default is 0. */ uint32_t sourceHeight; - + /* The frequecy of images being displayed. If the number is less than 1000, * the input frame rate is an integer number between 1 and 60, else the input * number is in Q16 format, shifted by 16 bits, where max allowed is 240 fps. @@ -319,7 +319,7 @@ typedef struct EB_H265_ENC_CONFIGURATION /* Enables subjective quality algorithms to reduce the output bitrate with * minimal or no subjective visual quality impact. Only applicable to tune 0. - * + * * Default is 0. */ uint8_t bitRateReduction; @@ -352,7 +352,7 @@ typedef struct EB_H265_ENC_CONFIGURATION uint32_t qp; /* Path to file that contains qp values. - * + * * Default is null.*/ uint8_t useQpFile; @@ -377,7 +377,7 @@ typedef struct EB_H265_ENC_CONFIGURATION // Motion Estimation Tools - + /* Flag to enable the use of default ME HME parameters. * * Default is 1. */ @@ -412,7 +412,7 @@ typedef struct EB_H265_ENC_CONFIGURATION // Rate Control - + /* Rate control mode. * * 0 = Constant QP. @@ -477,7 +477,7 @@ typedef struct EB_H265_ENC_CONFIGURATION uint32_t highDynamicRangeInput; /* Flag to simplify the detection of boundary between access units. - * + * * Default is 0. */ uint32_t accessUnitDelimiter; @@ -542,24 +542,24 @@ typedef struct EB_H265_ENC_CONFIGURATION // VBV Parameters /* Sets the maximum rate the VBV buffer should be assumed to refill at - * + * * Default is 0. */ uint32_t vbvMaxrate; - /* Sets the size of the VBV buffer in bits. + /* Sets the size of the VBV buffer in bits. * * Default is 0. */ uint32_t vbvBufsize; /* Sets how full the VBV buffer must be before playback starts. If picture - * number is 0, then the initial fill is vbv-init * vbvBufferSize. - * Otherwise, it is interpreted as the initial fill in bits. + * number is 0, then the initial fill is vbv-init * vbvBufferSize. + * Otherwise, it is interpreted as the initial fill in bits. * * Default is 90. */ uint64_t vbvBufInit; /* Enables the buffering period SEI and picture timing SEI to signal the HRD - * parameters. + * parameters. * * 0 = disable. * 1 = enable. @@ -602,16 +602,16 @@ typedef struct EB_H265_ENC_CONFIGURATION uint32_t threadCount; // ASM Type - + /* Assembly instruction set used by encoder. * * 0 = non-AVX2, C only. * 1 = up to AVX512, auto-select highest assembly instruction set supported. - * + * * Default is 1. */ uint32_t asmType; - + // Demo features /* Flag to enable the Speed Control functionality to achieve the real-time @@ -637,7 +637,7 @@ typedef struct EB_H265_ENC_CONFIGURATION // Debug tools - /* Output reconstructed yuv used for debug purposes. The value is set through + /* Output reconstructed yuv used for debug purposes. The value is set through * ReconFile token (-o) and using the feature will affect the speed of encoder. * * Default is 0. */ @@ -683,7 +683,7 @@ EB_API EB_ERRORTYPE EbInitHandle( /* STEP 2: Set all configuration parameters. * * Parameter: - * @ *h265EncComponent Encoder handler. + * @ *h265EncComponent Encoder handler. * @ *pComponentParameterStructure Encoder and buffer configurations will be copied to the library. */ EB_API EB_ERRORTYPE EbH265EncSetParameter( EB_COMPONENTTYPE *h265EncComponent, @@ -699,7 +699,7 @@ EB_API EB_ERRORTYPE EbInitEncoder( /* OPTIONAL: Get VPS / SPS / PPS headers at init time. * * Parameter: - * @ *h265EncComponent Encoder handler. + * @ *h265EncComponent Encoder handler. * @ **outputStreamPtr Output stream. */ EB_API EB_ERRORTYPE EbH265EncStreamHeader( EB_COMPONENTTYPE *h265EncComponent, diff --git a/Source/App/EbAppConfig.c b/Source/App/EbAppConfig.c index 50b05471f..c8b449d00 100644 --- a/Source/App/EbAppConfig.c +++ b/Source/App/EbAppConfig.c @@ -93,13 +93,13 @@ #define HRD_TOKEN "-hrd" #define MAX_QP_TOKEN "-max-qp" #define MIN_QP_TOKEN "-min-qp" -#define TEMPORAL_ID "-temporal-id" // no Eval +#define TEMPORAL_ID "-temporal-id" // no Eval #define LOOK_AHEAD_DIST_TOKEN "-lad" #define SCENE_CHANGE_DETECTION_TOKEN "-scd" #define INJECTOR_TOKEN "-inj" // no Eval #define INJECTOR_FRAMERATE_TOKEN "-inj-frm-rt" // no Eval #define SPEED_CONTROL_TOKEN "-speed-ctrl" -#define ASM_TYPE_TOKEN "-asm" // no Eval +#define ASM_TYPE_TOKEN "-asm" // no Eval #define THREAD_MGMNT "-lp" #define TARGET_SOCKET "-ss" #define THREAD_COUNT "-thread-count" @@ -176,7 +176,7 @@ static void SetCfgSegmentOvFile(const char *value, EbConfig_t *cfg) else printf("Error segment Override file: %s does not exist, won't use\n",value); }; -static void SetCfgDolbyVisionRpuFile (const char *value, EbConfig_t *cfg) +static void SetCfgDolbyVisionRpuFile (const char *value, EbConfig_t *cfg) { if (cfg->dolbyVisionRpuFile) { fclose(cfg->dolbyVisionRpuFile); } FOPEN(cfg->dolbyVisionRpuFile, value, "rb"); @@ -234,10 +234,10 @@ static void SetEnableConstrainedIntra (const char *value, EbConfig_t * static void SetCfgTune (const char *value, EbConfig_t *cfg) {cfg->tune = (uint8_t)strtoul(value, NULL, 0); }; static void SetBitRateReduction (const char *value, EbConfig_t *cfg) {cfg->bitRateReduction = (EB_BOOL)strtol(value, NULL, 0); }; static void SetImproveSharpness (const char *value, EbConfig_t *cfg) {cfg->improveSharpness = (EB_BOOL)strtol(value, NULL, 0);}; -static void SetVbvMaxrate (const char *value, EbConfig_t *cfg) { cfg->vbvMaxRate = strtoul(value, NULL, 0);}; -static void SetVbvBufsize (const char *value, EbConfig_t *cfg) { cfg->vbvBufsize = strtoul(value, NULL, 0);}; -static void SetVbvBufInit (const char *value, EbConfig_t *cfg) { cfg->vbvBufInit = strtoul(value, NULL, 0);}; -static void SetHrdFlag (const char *value, EbConfig_t *cfg) { cfg->hrdFlag = strtoul(value, NULL, 0);}; +static void SetVbvMaxrate (const char *value, EbConfig_t *cfg) { cfg->vbvMaxRate = strtoul(value, NULL, 0);}; +static void SetVbvBufsize (const char *value, EbConfig_t *cfg) { cfg->vbvBufsize = strtoul(value, NULL, 0);}; +static void SetVbvBufInit (const char *value, EbConfig_t *cfg) { cfg->vbvBufInit = strtoul(value, NULL, 0);}; +static void SetHrdFlag (const char *value, EbConfig_t *cfg) { cfg->hrdFlag = strtoul(value, NULL, 0);}; static void SetVideoUsabilityInfo (const char *value, EbConfig_t *cfg) {cfg->videoUsabilityInfo = strtol(value, NULL, 0);}; static void SetHighDynamicRangeInput (const char *value, EbConfig_t *cfg) {cfg->highDynamicRangeInput = strtol(value, NULL, 0);}; static void SetAccessUnitDelimiter (const char *value, EbConfig_t *cfg) {cfg->accessUnitDelimiter = strtol(value, NULL, 0);}; @@ -379,7 +379,7 @@ config_entry_t config_entry[] = { { SINGLE_INPUT, CONSTRAINED_INTRA_ENABLE_TOKEN, "ConstrainedIntra", SetEnableConstrainedIntra }, // Rate Control - { SINGLE_INPUT, RATE_CONTROL_ENABLE_TOKEN, "RateControlMode", SetRateControlMode }, + { SINGLE_INPUT, RATE_CONTROL_ENABLE_TOKEN, "RateControlMode", SetRateControlMode }, { SINGLE_INPUT, TARGET_BIT_RATE_TOKEN, "TargetBitRate", SetTargetBitRate }, { SINGLE_INPUT, MAX_QP_TOKEN, "MaxQpAllowed", SetMaxQpAllowed }, { SINGLE_INPUT, MIN_QP_TOKEN, "MinQpAllowed", SetMinQpAllowed }, @@ -593,7 +593,7 @@ void EbConfigCtor(EbConfig_t *configPtr) configPtr->performanceContext.encodeStartTime[0]= 0; configPtr->performanceContext.encodeStartTime[1]= 0; - + configPtr->performanceContext.totalExecutionTime= 0; configPtr->performanceContext.totalEncodeTime = 0; configPtr->performanceContext.frameCount = 0; @@ -840,7 +840,7 @@ static int32_t FindToken( **********************************/ static int32_t ReadConfigFile( EbConfig_t *config, - char *configPath, + char *configPath, uint32_t instanceIdx) { int32_t return_error = 0; @@ -1217,8 +1217,8 @@ EB_ERRORTYPE ReadCommandLine( { EB_ERRORTYPE return_error = EB_ErrorBadParameter; - char config_string[COMMAND_LINE_MAX_SIZE]; // for one input options - char *config_strings[MAX_CHANNEL_NUMBER]; // for multiple input options + char config_string[COMMAND_LINE_MAX_SIZE]; // for one input options + char *config_strings[MAX_CHANNEL_NUMBER]; // for multiple input options char *cmd_copy[MAX_NUM_TOKENS]; // keep track of extra tokens uint32_t index = 0; int32_t cmd_token_cnt = 0; // total number of tokens diff --git a/Source/App/EbAppConfig.h b/Source/App/EbAppConfig.h index ace7d35e9..fc970162d 100644 --- a/Source/App/EbAppConfig.h +++ b/Source/App/EbAppConfig.h @@ -92,20 +92,20 @@ typedef struct EB_PARAM_PORTDEFINITIONTYPE { pointer = (type)malloc(nElements); \ if (pointer == (type)EB_NULL){ \ return returnType; \ - } \ - else { \ + } \ + else { \ appMemoryMap[*(appMemoryMapIndex)].ptrType = pointerClass; \ appMemoryMap[(*(appMemoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalAppMemory += (nElements); \ - } \ - else { \ - *totalAppMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ - } \ + if (nElements % 8 == 0) { \ + *totalAppMemory += (nElements); \ + } \ + else { \ + *totalAppMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ + } \ if (*(appMemoryMapIndex) >= MAX_APP_NUM_PTR) { \ return returnType; \ - } \ + } \ appMallocCount++; #define EB_APP_MALLOC_NR(type, pointer, nElements, pointerClass,returnType) \ @@ -115,22 +115,22 @@ typedef struct EB_PARAM_PORTDEFINITIONTYPE { returnType = EB_ErrorInsufficientResources; \ printf("Malloc has failed due to insuffucient resources"); \ return; \ - } \ - else { \ + } \ + else { \ appMemoryMap[*(appMemoryMapIndex)].ptrType = pointerClass; \ appMemoryMap[(*(appMemoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalAppMemory += (nElements); \ - } \ - else { \ - *totalAppMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ - } \ + if (nElements % 8 == 0) { \ + *totalAppMemory += (nElements); \ + } \ + else { \ + *totalAppMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ + } \ if (*(appMemoryMapIndex) >= MAX_APP_NUM_PTR) { \ returnType = EB_ErrorInsufficientResources; \ printf("Malloc has failed due to insuffucient resources"); \ return; \ - } \ + } \ appMallocCount++; #define EB_APP_MEMORY() \ @@ -176,7 +176,7 @@ typedef struct EbPerformanceContext_s { double totalEncodeTime; // not including init uint64_t totalLatency; - uint32_t maxLatency; + uint32_t maxLatency; uint64_t startsTime; uint64_t startuTime; @@ -199,7 +199,7 @@ typedef struct EbConfig_s FILE *bitstreamFile; FILE *reconFile; FILE *errorLogFile; - FILE *bufferFile; + FILE *bufferFile; FILE *qpFile; @@ -220,7 +220,7 @@ typedef struct EbConfig_s uint32_t speedControlFlag; uint32_t encoderBitDepth; uint32_t encoderColorFormat; - uint32_t compressedTenBitFormat; + uint32_t compressedTenBitFormat; uint32_t sourceWidth; uint32_t sourceHeight; @@ -247,8 +247,8 @@ typedef struct EbConfig_s uint8_t encMode; int32_t intraPeriod; int32_t intraRefreshType; - uint32_t hierarchicalLevels; - uint32_t predStructure; + uint32_t hierarchicalLevels; + uint32_t predStructure; /**************************************** @@ -305,7 +305,7 @@ typedef struct EbConfig_s * Optional Features ****************************************/ - EB_BOOL bitRateReduction; + EB_BOOL bitRateReduction; EB_BOOL improveSharpness; uint32_t videoUsabilityInfo; uint32_t highDynamicRangeInput; @@ -331,13 +331,13 @@ typedef struct EbConfig_s /**************************************** * On-the-fly Testing ****************************************/ - uint32_t testUserData; - EB_BOOL eosFlag; + uint32_t testUserData; + EB_BOOL eosFlag; /**************************************** * Optimization Type ****************************************/ - uint32_t asmType; + uint32_t asmType; /**************************************** * Computational Performance Data @@ -382,9 +382,9 @@ typedef struct EbConfig_s extern void EbConfigCtor(EbConfig_t *configPtr); extern void EbConfigDtor(EbConfig_t *configPtr); -extern EB_ERRORTYPE ReadCommandLine(int32_t argc, char *const argv[], EbConfig_t **config, uint32_t numChannels, EB_ERRORTYPE *return_errors); +extern EB_ERRORTYPE ReadCommandLine(int32_t argc, char *const argv[], EbConfig_t **config, uint32_t numChannels, EB_ERRORTYPE *return_errors); extern uint32_t GetHelp(int32_t argc, char *const argv[]); extern uint32_t GetSVTVersion(int32_t argc, char *const argv[]); -extern uint32_t GetNumberOfChannels(int32_t argc, char *const argv[]); +extern uint32_t GetNumberOfChannels(int32_t argc, char *const argv[]); #endif //EbAppConfig_h diff --git a/Source/App/EbAppContext.c b/Source/App/EbAppContext.c index a4bf3f630..f1fde2597 100644 --- a/Source/App/EbAppContext.c +++ b/Source/App/EbAppContext.c @@ -13,11 +13,11 @@ #include "EbAppConfig.h" -#define INPUT_SIZE_576p_TH 0x90000 // 0.58 Million -#define INPUT_SIZE_1080i_TH 0xB71B0 // 0.75 Million -#define INPUT_SIZE_1080p_TH 0x1AB3F0 // 1.75 Million -#define INPUT_SIZE_4K_TH 0x29F630 // 2.75 Million -#define INPUT_SIZE_8K_TH 0xB71B00 // 12 Million +#define INPUT_SIZE_576p_TH 0x90000 // 0.58 Million +#define INPUT_SIZE_1080i_TH 0xB71B0 // 0.75 Million +#define INPUT_SIZE_1080p_TH 0x1AB3F0 // 1.75 Million +#define INPUT_SIZE_4K_TH 0x29F630 // 2.75 Million +#define INPUT_SIZE_8K_TH 0xB71B00 // 12 Million #define SIZE_OF_ONE_FRAME_IN_BYTES(width, height,is16bit) ( ( ((width)*(height)*3)>>1 )<ebEncParameters.frameRate = config->frameRate; callbackData->ebEncParameters.frameRateDenominator = config->frameRateDenominator; callbackData->ebEncParameters.frameRateNumerator = config->frameRateNumerator; - callbackData->ebEncParameters.hierarchicalLevels = config->hierarchicalLevels; - callbackData->ebEncParameters.predStructure = (uint8_t)config->predStructure; + callbackData->ebEncParameters.hierarchicalLevels = config->hierarchicalLevels; + callbackData->ebEncParameters.predStructure = (uint8_t)config->predStructure; callbackData->ebEncParameters.sceneChangeDetection = config->sceneChangeDetection; callbackData->ebEncParameters.lookAheadDistance = config->lookAheadDistance; callbackData->ebEncParameters.framesToBeEncoded = config->framesToBeEncoded; @@ -358,8 +358,8 @@ EB_ERRORTYPE AllocateInputBuffer( EB_ERRORTYPE AllocateInputBuffers( - EbConfig_t *config, - EbAppContext_t *callbackData) + EbConfig_t *config, + EbAppContext_t *callbackData) { EB_ERRORTYPE return_error = EB_ErrorNone; { @@ -393,8 +393,8 @@ EB_ERRORTYPE AllocateInputBuffers( return return_error; } EB_ERRORTYPE AllocateOutputReconBuffers( - EbConfig_t *config, - EbAppContext_t *callbackData) + EbConfig_t *config, + EbAppContext_t *callbackData) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -418,12 +418,12 @@ EB_ERRORTYPE AllocateOutputReconBuffers( } EB_ERRORTYPE AllocateOutputBuffers( - EbConfig_t *config, - EbAppContext_t *callbackData) + EbConfig_t *config, + EbAppContext_t *callbackData) { EB_ERRORTYPE return_error = EB_ErrorNone; - uint32_t outputStreamBufferSize = (uint32_t)(EB_OUTPUTSTREAMBUFFERSIZE_MACRO(config->inputPaddedHeight * config->inputPaddedWidth));; + uint32_t outputStreamBufferSize = (uint32_t)(EB_OUTPUTSTREAMBUFFERSIZE_MACRO(config->inputPaddedHeight * config->inputPaddedWidth));; { EB_APP_MALLOC(EB_BUFFERHEADERTYPE*, callbackData->streamBufferPool, sizeof(EB_BUFFERHEADERTYPE), EB_N_PTR, EB_ErrorInsufficientResources); @@ -440,7 +440,7 @@ EB_ERRORTYPE AllocateOutputBuffers( } EB_ERRORTYPE PreloadFramesIntoRam( - EbConfig_t *config) + EbConfig_t *config) { EB_ERRORTYPE return_error = EB_ErrorNone; int32_t processedFrameCount; @@ -612,9 +612,9 @@ EB_ERRORTYPE PreloadFramesIntoRam( * Initialize Core & Component ***********************************/ EB_ERRORTYPE InitEncoder( - EbConfig_t *config, - EbAppContext_t *callbackData, - uint32_t instanceIdx) + EbConfig_t *config, + EbAppContext_t *callbackData, + uint32_t instanceIdx) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -683,7 +683,7 @@ EB_ERRORTYPE InitEncoder( return return_error; } - // Allocate the Sequence Buffer + // Allocate the Sequence Buffer if (config->bufferedInput != -1) { // Preload frames into the ram for a faster yuv access time diff --git a/Source/App/EbAppContext.h b/Source/App/EbAppContext.h index 666455d5b..cf5cbe422 100644 --- a/Source/App/EbAppContext.h +++ b/Source/App/EbAppContext.h @@ -30,8 +30,8 @@ typedef struct EbAppContext_s { EB_BUFFERHEADERTYPE *streamBufferPool; EB_BUFFERHEADERTYPE *reconBuffer; - // Instance Index - uint8_t instanceIdx; + // Instance Index + uint8_t instanceIdx; } EbAppContext_t; diff --git a/Source/App/EbAppInputy4m.c b/Source/App/EbAppInputy4m.c index ff941ef88..b98c8f89d 100644 --- a/Source/App/EbAppInputy4m.c +++ b/Source/App/EbAppInputy4m.c @@ -45,7 +45,7 @@ int32_t read_y4m_header(EbConfig_t *cfg) { /* get first line after YUV4MPEG2 */ fresult = fgets(buffer, sizeof(buffer), ptr_in); - if (fresult== NULL) { + if (fresult== NULL) { return EB_ErrorBadParameter; } diff --git a/Source/App/EbAppProcessCmd.c b/Source/App/EbAppProcessCmd.c index c69c0a2b7..ead7ac573 100644 --- a/Source/App/EbAppProcessCmd.c +++ b/Source/App/EbAppProcessCmd.c @@ -765,7 +765,7 @@ static void ReadInputFrames( const uint32_t inputPaddedWidth = config->inputPaddedWidth; const uint32_t inputPaddedHeight = config->inputPaddedHeight; FILE *inputFile = config->inputFile; - uint8_t *ebInputPtr; + uint8_t *ebInputPtr; EB_H265_ENC_INPUT* inputPtr = (EB_H265_ENC_INPUT*)headerPtr->pBuffer; const EB_COLOR_FORMAT colorFormat = (EB_COLOR_FORMAT)config->encoderColorFormat; const uint8_t subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; @@ -1230,8 +1230,8 @@ APPEXITCONDITIONTYPE ProcessInputBuffer(EbConfig_t *config, EbAppContext_t *appC EbInjector(config->processedFrameCount, config->injectorFrameRate); } - totalBytesToProcessCount = (framesToBeEncoded < 0) ? -1 : (config->encoderBitDepth == 10 && config->compressedTenBitFormat == 1) ? - framesToBeEncoded * compressed10bitFrameSize: + totalBytesToProcessCount = (framesToBeEncoded < 0) ? -1 : (config->encoderBitDepth == 10 && config->compressedTenBitFormat == 1) ? + framesToBeEncoded * compressed10bitFrameSize: framesToBeEncoded * SIZE_OF_ONE_FRAME_IN_BYTES(inputPaddedWidth, inputPaddedHeight, colorFormat, is16bit); @@ -1420,7 +1420,7 @@ APPEXITCONDITIONTYPE ProcessOutputStreamBuffer( } } } - return return_value; + return return_value; } APPEXITCONDITIONTYPE ProcessOutputReconBuffer( EbConfig_t *config, diff --git a/Source/App/EbAppString.c b/Source/App/EbAppString.c index 9761b8bed..d33e5354d 100644 --- a/Source/App/EbAppString.c +++ b/Source/App/EbAppString.c @@ -10,271 +10,271 @@ invoke_safe_str_constraint_handler(const char *msg, void *ptr, errno_t error) { - if (NULL != str_handler) { - str_handler(msg, ptr, error); - } - else { - sl_default_handler(msg, ptr, error); - } + if (NULL != str_handler) { + str_handler(msg, ptr, error); + } + else { + sl_default_handler(msg, ptr, error); + } } void ignore_handler_s(const char *msg, void *ptr, errno_t error) { - (void)msg; - (void)ptr; - (void)error; - sldebug_printf("IGNORE CONSTRAINT HANDLER: (%u) %s\n", error, - (msg) ? msg : "Null message"); - return; + (void)msg; + (void)ptr; + (void)error; + sldebug_printf("IGNORE CONSTRAINT HANDLER: (%u) %s\n", error, + (msg) ? msg : "Null message"); + return; } errno_t strncpy_ss(char *dest, rsize_t dmax, const char *src, rsize_t slen) { - rsize_t orig_dmax; - char *orig_dest; - const char *overlap_bumper; - - if (dest == NULL) { - invoke_safe_str_constraint_handler("strncpy_ss: dest is null", - NULL, ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (dmax == 0) { - invoke_safe_str_constraint_handler("strncpy_ss: dmax is 0", - NULL, ESZEROL); - return RCNEGATE(ESZEROL); - } - - if (dmax > RSIZE_MAX_STR) { - invoke_safe_str_constraint_handler("strncpy_ss: dmax exceeds max", - NULL, ESLEMAX); - return RCNEGATE(ESLEMAX); - } - - /* hold base in case src was not copied */ - orig_dmax = dmax; - orig_dest = dest; - - if (src == NULL) { - handle_error(orig_dest, orig_dmax, (char*) ("strncpy_ss: " - "src is null"), - ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (slen == 0) { - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " - "slen is zero"), - ESZEROL); - return RCNEGATE(ESZEROL); - } - - if (slen > RSIZE_MAX_STR) { - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " - "slen exceeds max"), - ESLEMAX); - return RCNEGATE(ESLEMAX); - } - - - if (dest < src) { - overlap_bumper = src; - - while (dmax > 0) { - if (dest == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - if (slen == 0) { - /* - * Copying truncated to slen chars. Note that the TR says to - * copy slen chars plus the null char. We null the slack. - */ - *dest = '\0'; - return RCNEGATE(EOK); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - slen--; - dest++; - src++; - } - - } - else { - overlap_bumper = dest; - - while (dmax > 0) { - if (src == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)( "strncpy_s: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - if (slen == 0) { - /* - * Copying truncated to slen chars. Note that the TR says to - * copy slen chars plus the null char. We null the slack. - */ - *dest = '\0'; - return RCNEGATE(EOK); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - slen--; - dest++; - src++; - } - } - - /* - * the entire src was not copied, so zero the string - */ - handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: not enough " - "space for src"), - ESNOSPC); - return RCNEGATE(ESNOSPC); + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; + + if (dest == NULL) { + invoke_safe_str_constraint_handler("strncpy_ss: dest is null", + NULL, ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (dmax == 0) { + invoke_safe_str_constraint_handler("strncpy_ss: dmax is 0", + NULL, ESZEROL); + return RCNEGATE(ESZEROL); + } + + if (dmax > RSIZE_MAX_STR) { + invoke_safe_str_constraint_handler("strncpy_ss: dmax exceeds max", + NULL, ESLEMAX); + return RCNEGATE(ESLEMAX); + } + + /* hold base in case src was not copied */ + orig_dmax = dmax; + orig_dest = dest; + + if (src == NULL) { + handle_error(orig_dest, orig_dmax, (char*) ("strncpy_ss: " + "src is null"), + ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (slen == 0) { + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " + "slen is zero"), + ESZEROL); + return RCNEGATE(ESZEROL); + } + + if (slen > RSIZE_MAX_STR) { + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " + "slen exceeds max"), + ESLEMAX); + return RCNEGATE(ESLEMAX); + } + + + if (dest < src) { + overlap_bumper = src; + + while (dmax > 0) { + if (dest == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + if (slen == 0) { + /* + * Copying truncated to slen chars. Note that the TR says to + * copy slen chars plus the null char. We null the slack. + */ + *dest = '\0'; + return RCNEGATE(EOK); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + slen--; + dest++; + src++; + } + + } + else { + overlap_bumper = dest; + + while (dmax > 0) { + if (src == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)( "strncpy_s: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + if (slen == 0) { + /* + * Copying truncated to slen chars. Note that the TR says to + * copy slen chars plus the null char. We null the slack. + */ + *dest = '\0'; + return RCNEGATE(EOK); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + slen--; + dest++; + src++; + } + } + + /* + * the entire src was not copied, so zero the string + */ + handle_error(orig_dest, orig_dmax, (char*)("strncpy_ss: not enough " + "space for src"), + ESNOSPC); + return RCNEGATE(ESNOSPC); } errno_t strcpy_ss(char *dest, rsize_t dmax, const char *src) { - rsize_t orig_dmax; - char *orig_dest; - const char *overlap_bumper; - - if (dest == NULL) { - invoke_safe_str_constraint_handler((char*)("strcpy_ss: dest is null"), - NULL, ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (dmax == 0) { - invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax is 0"), - NULL, ESZEROL); - return RCNEGATE(ESZEROL); - } - - if (dmax > RSIZE_MAX_STR) { - invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax exceeds max"), - NULL, ESLEMAX); - return RCNEGATE(ESLEMAX); - } - - if (src == NULL) { - *dest = '\0'; - invoke_safe_str_constraint_handler((char*)("strcpy_ss: src is null"), - NULL, ESNULLP); - return RCNEGATE(ESNULLP); - } - - if (dest == src) { - return RCNEGATE(EOK); - } - - /* hold base of dest in case src was not copied */ - orig_dmax = dmax; - orig_dest = dest; - - if (dest < src) { - overlap_bumper = src; - - while (dmax > 0) { - if (dest == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - dest++; - src++; - } - - } - else { - overlap_bumper = dest; - - while (dmax > 0) { - if (src == overlap_bumper) { - handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " - "overlapping objects"), - ESOVRLP); - return RCNEGATE(ESOVRLP); - } - - *dest = *src; - if (*dest == '\0') { - return RCNEGATE(EOK); - } - - dmax--; - dest++; - src++; - } - } - - /* - * the entire src must have been copied, if not reset dest - * to null the string. - */ - handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: not " - "enough space for src"), - ESNOSPC); - return RCNEGATE(ESNOSPC); + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; + + if (dest == NULL) { + invoke_safe_str_constraint_handler((char*)("strcpy_ss: dest is null"), + NULL, ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (dmax == 0) { + invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax is 0"), + NULL, ESZEROL); + return RCNEGATE(ESZEROL); + } + + if (dmax > RSIZE_MAX_STR) { + invoke_safe_str_constraint_handler((char*)("strcpy_ss: dmax exceeds max"), + NULL, ESLEMAX); + return RCNEGATE(ESLEMAX); + } + + if (src == NULL) { + *dest = '\0'; + invoke_safe_str_constraint_handler((char*)("strcpy_ss: src is null"), + NULL, ESNULLP); + return RCNEGATE(ESNULLP); + } + + if (dest == src) { + return RCNEGATE(EOK); + } + + /* hold base of dest in case src was not copied */ + orig_dmax = dmax; + orig_dest = dest; + + if (dest < src) { + overlap_bumper = src; + + while (dmax > 0) { + if (dest == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + dest++; + src++; + } + + } + else { + overlap_bumper = dest; + + while (dmax > 0) { + if (src == overlap_bumper) { + handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: " + "overlapping objects"), + ESOVRLP); + return RCNEGATE(ESOVRLP); + } + + *dest = *src; + if (*dest == '\0') { + return RCNEGATE(EOK); + } + + dmax--; + dest++; + src++; + } + } + + /* + * the entire src must have been copied, if not reset dest + * to null the string. + */ + handle_error(orig_dest, orig_dmax, (char*)("strcpy_ss: not " + "enough space for src"), + ESNOSPC); + return RCNEGATE(ESNOSPC); } rsize_t strnlen_ss(const char *dest, rsize_t dmax) { - rsize_t count; - - if (dest == NULL) { - return RCNEGATE(0); - } - - if (dmax == 0) { - invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax is 0"), - NULL, ESZEROL); - return RCNEGATE(0); - } - - if (dmax > RSIZE_MAX_STR) { - invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax exceeds max"), - NULL, ESLEMAX); - return RCNEGATE(0); - } - - count = 0; - while (*dest && dmax) { - count++; - dmax--; - dest++; - } - - return RCNEGATE(count); + rsize_t count; + + if (dest == NULL) { + return RCNEGATE(0); + } + + if (dmax == 0) { + invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax is 0"), + NULL, ESZEROL); + return RCNEGATE(0); + } + + if (dmax > RSIZE_MAX_STR) { + invoke_safe_str_constraint_handler((char*)("strnlen_ss: dmax exceeds max"), + NULL, ESLEMAX); + return RCNEGATE(0); + } + + count = 0; + while (*dest && dmax) { + count++; + dmax--; + dest++; + } + + return RCNEGATE(count); } /* SAFE STRING LIBRARY */ diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c index a753646b8..c150b6799 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.c @@ -16,35 +16,35 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( EB_U32 inputAreaWidth, // input parameter, input area width EB_U32 inputAreaHeight) // input parameter, input area height { - __m256i sum,sum2 ,xmm2, xmm1, sum1, xmm0 = _mm256_setzero_si256(); - __m128i upper, lower, mean = _mm_setzero_si128() ; - EB_U64 result; - xmm1=_mm256_sad_epu8( xmm0 ,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )); - xmm2= _mm256_sad_epu8(xmm0,_mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ) ; - sum1 = _mm256_add_epi16(xmm1, xmm2); - - inputSamples += 4 * inputStride; - - xmm1= _mm256_sad_epu8(xmm0,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )) ; - xmm2= _mm256_sad_epu8(xmm0, _mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ); - sum2 = _mm256_add_epi16(xmm1, xmm2); - + __m256i sum,sum2 ,xmm2, xmm1, sum1, xmm0 = _mm256_setzero_si256(); + __m128i upper, lower, mean = _mm_setzero_si128() ; + EB_U64 result; + xmm1=_mm256_sad_epu8( xmm0 ,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )); + xmm2= _mm256_sad_epu8(xmm0,_mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ) ; + sum1 = _mm256_add_epi16(xmm1, xmm2); + + inputSamples += 4 * inputStride; + + xmm1= _mm256_sad_epu8(xmm0,_mm256_set_m128i( _mm_loadl_epi64((__m128i *)(inputSamples+inputStride)) , _mm_loadl_epi64((__m128i *)(inputSamples)) )) ; + xmm2= _mm256_sad_epu8(xmm0, _mm256_set_m128i(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)) ,_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)) ) ); + sum2 = _mm256_add_epi16(xmm1, xmm2); + sum = _mm256_add_epi16(sum1, sum2); - upper = _mm256_extractf128_si256(sum,1) ; //extract upper 128 bit - upper = _mm_add_epi32(upper, _mm_srli_si128(upper, 8)); // shift 2nd 16 bits to the 1st and sum both - - lower = _mm256_extractf128_si256(sum,0) ; //extract lower 128 bit - lower = _mm_add_epi32(lower, _mm_srli_si128(lower, 8)); // shift 2nd 16 bits to the 1st and sum both - - mean = _mm_add_epi32(lower,upper); - - (void)inputAreaWidth; + upper = _mm256_extractf128_si256(sum,1) ; //extract upper 128 bit + upper = _mm_add_epi32(upper, _mm_srli_si128(upper, 8)); // shift 2nd 16 bits to the 1st and sum both + + lower = _mm256_extractf128_si256(sum,0) ; //extract lower 128 bit + lower = _mm_add_epi32(lower, _mm_srli_si128(lower, 8)); // shift 2nd 16 bits to the 1st and sum both + + mean = _mm_add_epi32(lower,upper); + + (void)inputAreaWidth; (void)inputAreaHeight; - + result = (EB_U64)_mm_cvtsi128_si32(mean) << 2; return result; - -} + +} /********************************************************************************************************************************/ void ComputeIntermVarFour8x8_AVX2_INTRIN( @@ -57,15 +57,15 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( __m256i ymm1, ymm2, ymm3, ymm4, ymm_sum1, ymm_sum2, ymm_FinalSum,ymm_shift,/* ymm_blockMeanSquared*///, ymm_in,ymm_in_2S,ymm_in_second,ymm_in_2S_second,ymm_shiftSquared,ymm_permute8, ymm_result,ymm_blockMeanSquaredlow,ymm_blockMeanSquaredHi,ymm_inputlo,ymm_inputhi; - + __m128i ymm_blockMeanSquaredlo,ymm_blockMeanSquaredhi,ymm_resultlo,ymm_resulthi; - + __m256i ymm_zero = _mm256_setzero_si256(); __m128i xmm_zero = _mm_setzero_si128(); ymm_in = _mm256_loadu_si256((__m256i *) inputSamples); ymm_in_2S = _mm256_loadu_si256((__m256i *)(inputSamples + 2 * inputStride)); - + ymm1 = _mm256_sad_epu8(ymm_in, ymm_zero); ymm2 = _mm256_sad_epu8(ymm_in_2S, ymm_zero); @@ -88,33 +88,33 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( _mm256_storeu_si256((__m256i *)(meanOf8x8Blocks), ymm_FinalSum); /*******************************Squared Mean******************************/ - + ymm_inputlo = _mm256_unpacklo_epi8(ymm_in, ymm_zero); ymm_inputhi = _mm256_unpackhi_epi8(ymm_in, ymm_zero); - + ymm_blockMeanSquaredlow = _mm256_madd_epi16(ymm_inputlo, ymm_inputlo); ymm_blockMeanSquaredHi = _mm256_madd_epi16(ymm_inputhi, ymm_inputhi); ymm_inputlo = _mm256_unpacklo_epi8(ymm_in_2S, ymm_zero); - ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_2S, ymm_zero); - + ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_2S, ymm_zero); + ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_madd_epi16(ymm_inputlo, ymm_inputlo)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_madd_epi16(ymm_inputhi, ymm_inputhi)); ymm_inputlo = _mm256_unpacklo_epi8(ymm_in_second, ymm_zero); - ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_second, ymm_zero); - + ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_second, ymm_zero); + ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_madd_epi16(ymm_inputlo, ymm_inputlo)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_madd_epi16(ymm_inputhi, ymm_inputhi)); ymm_inputlo = _mm256_unpacklo_epi8(ymm_in_2S_second, ymm_zero); ymm_inputhi = _mm256_unpackhi_epi8(ymm_in_2S_second, ymm_zero); - + ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_madd_epi16(ymm_inputlo, ymm_inputlo)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_madd_epi16(ymm_inputhi, ymm_inputhi)); ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_srli_si256(ymm_blockMeanSquaredlow, 8)); - ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_srli_si256(ymm_blockMeanSquaredHi, 8)); + ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_srli_si256(ymm_blockMeanSquaredHi, 8)); ymm_blockMeanSquaredlow = _mm256_add_epi32(ymm_blockMeanSquaredlow, _mm256_srli_si256(ymm_blockMeanSquaredlow, 4)); ymm_blockMeanSquaredHi = _mm256_add_epi32(ymm_blockMeanSquaredHi, _mm256_srli_si256(ymm_blockMeanSquaredHi, 4)); @@ -122,24 +122,24 @@ EB_U64 ComputeMean8x8_AVX2_INTRIN( ymm_permute8 = _mm256_set_epi32(0,0,0,0,0,0,4,0); ymm_blockMeanSquaredlow = _mm256_permutevar8x32_epi32(ymm_blockMeanSquaredlow,ymm_permute8/*8*/); ymm_blockMeanSquaredHi = _mm256_permutevar8x32_epi32(ymm_blockMeanSquaredHi,ymm_permute8); - + ymm_blockMeanSquaredlo = _mm256_extracti128_si256(ymm_blockMeanSquaredlow,0); //lower 128 ymm_blockMeanSquaredhi = _mm256_extracti128_si256(ymm_blockMeanSquaredHi,0); //lower 128 ymm_result = _mm256_unpacklo_epi32(_mm256_castsi128_si256(ymm_blockMeanSquaredlo),_mm256_castsi128_si256(ymm_blockMeanSquaredhi)); ymm_resultlo = _mm_unpacklo_epi64(_mm256_castsi256_si128(ymm_result),xmm_zero); ymm_resulthi = _mm_unpackhi_epi64(_mm256_castsi256_si128(ymm_result),xmm_zero); - - + + ymm_result = _mm256_set_m128i(ymm_resulthi,ymm_resultlo); - + ymm_permute8 = _mm256_set_epi32(7,5,6,4,3,1,2,0); ymm_result = _mm256_permutevar8x32_epi32(ymm_result,ymm_permute8); - + ymm_shiftSquared = _mm256_set1_epi64x (11 ); ymm_result = _mm256_sllv_epi64(ymm_result,ymm_shiftSquared); - + _mm256_storeu_si256((__m256i *)(meanOfSquared8x8Blocks), ymm_result); diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h index a31682186..70a953eca 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX2.h @@ -12,10 +12,10 @@ extern "C" { #endif EB_U64 ComputeMean8x8_AVX2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputStride, // input parameter, input stride - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputStride, // input parameter, input stride + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight); void ComputeIntermVarFour8x8_AVX2_INTRIN( EB_U8 * inputSamples, @@ -25,5 +25,5 @@ extern "C" { #ifdef __cplusplus } -#endif +#endif #endif diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c index 496be024f..7c7a3fbf0 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.c @@ -14,164 +14,164 @@ #ifndef NON_AVX512_SUPPORT AVX512_FUNC_TARGET void BiPredAverageKernel_AVX512_INTRIN( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6; - __m256i xmm_avg1_256, xmm_avg3_256; - EB_U32 y; - - if (areaWidth > 16) - { - if (areaWidth == 24) - { - for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 32) - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)src0), _mm256_loadu_si256((__m256i*)src1)); - xmm_avg3_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)(src0 + src0Stride)), _mm256_loadu_si256((__m256i*)(src1 + src1Stride))); - - _mm256_storeu_si256((__m256i *) dst, xmm_avg1_256); - _mm256_storeu_si256((__m256i *) (dst + dstStride), xmm_avg3_256); - - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 48) - { - for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); - _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - - } - } - else - { - EB_U32 src0Stride1 = src0Stride << 1; - EB_U32 src1Stride1 = src1Stride << 1; - EB_U32 dstStride1 = dstStride << 1; - - __m512i xmm_avg1_512, xmm_avg3_512; - - for (EB_U32 y = 0; y < areaHeight; y += 2, src0 += src0Stride1, src1 += src1Stride1, dst += dstStride1) { - xmm_avg1_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)src0), _mm512_loadu_si512((__m512i *)src1)); - xmm_avg3_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)(src0 + src0Stride)), _mm512_loadu_si512((__m512i *)(src1 + src1Stride))); - - _mm512_storeu_si512((__m512i *)dst, xmm_avg1_512); - _mm512_storeu_si512((__m512i *)(dst + dstStride), xmm_avg3_512); - } - - } - } - else - { - if (areaWidth == 16) - { - for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 4) - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); - - *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); - *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 8) - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else - { - for (y = 0; y < areaHeight; y += 2) { - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); - - xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); - *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - } + __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6; + __m256i xmm_avg1_256, xmm_avg3_256; + EB_U32 y; + + if (areaWidth > 16) + { + if (areaWidth == 24) + { + for (y = 0; y < areaHeight; y += 2) { + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 32) + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)src0), _mm256_loadu_si256((__m256i*)src1)); + xmm_avg3_256 = _mm256_avg_epu8(_mm256_loadu_si256((__m256i*)(src0 + src0Stride)), _mm256_loadu_si256((__m256i*)(src1 + src1Stride))); + + _mm256_storeu_si256((__m256i *) dst, xmm_avg1_256); + _mm256_storeu_si256((__m256i *) (dst + dstStride), xmm_avg3_256); + + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 48) + { + for (y = 0; y < areaHeight; y += 2) { + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); + _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + + } + } + else + { + EB_U32 src0Stride1 = src0Stride << 1; + EB_U32 src1Stride1 = src1Stride << 1; + EB_U32 dstStride1 = dstStride << 1; + + __m512i xmm_avg1_512, xmm_avg3_512; + + for (EB_U32 y = 0; y < areaHeight; y += 2, src0 += src0Stride1, src1 += src1Stride1, dst += dstStride1) { + xmm_avg1_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)src0), _mm512_loadu_si512((__m512i *)src1)); + xmm_avg3_512 = _mm512_avg_epu8(_mm512_loadu_si512((__m512i *)(src0 + src0Stride)), _mm512_loadu_si512((__m512i *)(src1 + src1Stride))); + + _mm512_storeu_si512((__m512i *)dst, xmm_avg1_512); + _mm512_storeu_si512((__m512i *)(dst + dstStride), xmm_avg3_512); + } + + } + } + else + { + if (areaWidth == 16) + { + for (y = 0; y < areaHeight; y += 2) { + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 4) + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); + + *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); + *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 8) + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else + { + for (y = 0; y < areaHeight; y += 2) { + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); + + xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); + *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + } } #else diff --git a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h index b760f1aca..b85feacf5 100644 --- a/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h +++ b/Source/Lib/ASM_AVX2/EbCombinedAveragingSAD_Intrinsic_AVX512.h @@ -13,26 +13,26 @@ extern "C" { #endif EB_U64 ComputeMean8x8_AVX2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputStride, // input parameter, input stride - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputStride, // input parameter, input stride + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight); void ComputeIntermVarFour8x8_AVX2_INTRIN( - EB_U8 * inputSamples, - EB_U16 inputStride, - EB_U64 * meanOf8x8Blocks, // mean of four 8x8 - EB_U64 * meanOfSquared8x8Blocks); + EB_U8 * inputSamples, + EB_U16 inputStride, + EB_U64 * meanOf8x8Blocks, // mean of four 8x8 + EB_U64 * meanOfSquared8x8Blocks); #ifndef NON_AVX512_SUPPORT void BiPredAverageKernel_AVX512_INTRIN( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); #else void BiPredAverageKernel_AVX2_INTRIN( EB_BYTE src0, @@ -47,5 +47,5 @@ void BiPredAverageKernel_AVX2_INTRIN( #ifdef __cplusplus } -#endif +#endif #endif diff --git a/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h b/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h index 57091cd83..1bd4da18a 100644 --- a/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbComputeSAD_AVX2.h @@ -12,68 +12,68 @@ extern "C" { #endif EB_U32 Compute24xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute32xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute40xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute48xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute56xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) EB_U32 Compute64xMSad_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) void SadLoopKernel_AVX2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width, // input parameter, block width (N) - EB_U64 *bestSad, - EB_S16 *xSearchCenter, - EB_S16 *ySearchCenter, - EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) - EB_S16 searchAreaWidth, - EB_S16 searchAreaHeight); + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width, // input parameter, block width (N) + EB_U64 *bestSad, + EB_S16 *xSearchCenter, + EB_S16 *ySearchCenter, + EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) + EB_S16 searchAreaWidth, + EB_S16 searchAreaHeight); #ifdef NON_AVX512_SUPPORT void GetEightHorizontalSearchPointResults_8x8_16x16_PU_AVX2_INTRIN( @@ -100,6 +100,6 @@ void GetEightHorizontalSearchPointResults_32x32_64x64_PU_AVX2_INTRIN( #ifdef __cplusplus } -#endif +#endif #endif // EbComputeSAD_AVX2_h diff --git a/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c index 9c5edbeec..d1ad3fc18 100644 --- a/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbComputeSAD_Intrinsic_AVX2.c @@ -67,9 +67,9 @@ void SadLoopKernel_AVX2_INTRIN( pRef = ref + j; ss3 = ss5 = _mm256_setzero_si256(); for (k=0; k> 4; // searchAreaWidth / 16; - - __m512i ss3sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), - _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; - __m512i ss7sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), - _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; - - const EB_U8 *pRef1 = ref; - - ss3 = ss7 = _mm256_setzero_si256(); - pSrc = src; - pRef = ref; - - for (k = 0; k < height; k += 2) - { - __m256i ref0temp, ref1temp, ref4temp, ref3temp; - - __m256i temp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)pSrc)), _mm_loadu_si128((__m128i*)(pSrc + srcStride)), 0x1); - ref0temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x( 0x0, 0x0, 0x0004000400040004, 0x0004000400040004)); - ref1temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0001000100010001, 0x0001000100010001, 0x0005000500050005, 0x0005000500050005)); - ref3temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0002000200020002, 0x0002000200020002, 0x0006000600060006, 0x0006000600060006)); - ref4temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0003000300030003, 0x0003000300030003, 0x0007000700070007, 0x0007000700070007)); - - __m512i ref1ftemp = _mm512_broadcast_i64x4(ref0temp); - __m512i ref2ftemp = _mm512_broadcast_i64x4(ref1temp); - __m512i ref3ftemp = _mm512_broadcast_i64x4(ref3temp); - __m512i ref4ftemp = _mm512_broadcast_i64x4(ref4temp); - - for (j = 0, pRef = pRef1; j < n; j++, pRef += 16) - { - __m256i ss0 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef ))), _mm_loadu_si128((__m128i*)(pRef + refStride )), 0x1); - __m256i ss1 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 8 ))), _mm_loadu_si128((__m128i*)(pRef + refStride + 8 )), 0x1); - ss2 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 16))), _mm_loadu_si128((__m128i*)(pRef + refStride + 16)), 0x1); - - __m512i ss1ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss0), ss1, 0x1); - __m512i ss2ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss1), ss2, 0x1); - - ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref1ftemp, ss1ftemp, 0x94)); - ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref2ftemp, ss1ftemp, 0xE9)); - ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref3ftemp, ss2ftemp, 0x94)); - ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref4ftemp, ss2ftemp, 0xE9)); - - } - - pSrc += 2 * srcStride; - pRef1 += 2 * refStride; - - } - - for (j = 0; j < n; j++) - { - //Code performing better then original code - __m512i result1 = _mm512_adds_epu16(ss3sum1_aaray[j], ss7sum1_aaray[j]); - __m256i ss5 = _mm512_castsi512_si256(result1); - __m256i ss6 = _mm512_extracti64x4_epi64(result1, 1); - __m128i s3cum = _mm_adds_epu16(_mm256_castsi256_si128(ss5), _mm256_extracti128_si256(ss5, 1)); - __m128i s7cum = _mm_adds_epu16(_mm256_castsi256_si128(ss6), _mm256_extracti128_si256(ss6, 1)); - s3cum = _mm_minpos_epu16(s3cum); - s7cum = _mm_minpos_epu16(s7cum); - temSum1 = _mm_extract_epi16(s3cum, 0); - if (temSum1 < lowSum) { - lowSum = temSum1; - xBest = (EB_S16)((16 * j) + _mm_extract_epi16(s3cum, 1)); - yBest = i; - } - - temSum1 = _mm_extract_epi16(s7cum, 0); - if (temSum1 < lowSum) { - lowSum = temSum1; - xBest = (EB_S16)((16 * j) + 8 + _mm_extract_epi16(s7cum, 1)); - yBest = i; - } - - } - - ref += srcStrideRaw; - } - } - else if (height <= 32) { - for (i = 0; i> 4; // searchAreaWidth / 16; + + __m512i ss3sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), + _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; + __m512i ss7sum1_aaray[8] = { _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), + _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512(), _mm512_setzero_si512() }; + + const EB_U8 *pRef1 = ref; + + ss3 = ss7 = _mm256_setzero_si256(); + pSrc = src; + pRef = ref; + + for (k = 0; k < height; k += 2) + { + __m256i ref0temp, ref1temp, ref4temp, ref3temp; + + __m256i temp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)pSrc)), _mm_loadu_si128((__m128i*)(pSrc + srcStride)), 0x1); + ref0temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x( 0x0, 0x0, 0x0004000400040004, 0x0004000400040004)); + ref1temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0001000100010001, 0x0001000100010001, 0x0005000500050005, 0x0005000500050005)); + ref3temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0002000200020002, 0x0002000200020002, 0x0006000600060006, 0x0006000600060006)); + ref4temp = _mm256_permutevar8x32_epi32(temp, _mm256_setr_epi64x(0x0003000300030003, 0x0003000300030003, 0x0007000700070007, 0x0007000700070007)); + + __m512i ref1ftemp = _mm512_broadcast_i64x4(ref0temp); + __m512i ref2ftemp = _mm512_broadcast_i64x4(ref1temp); + __m512i ref3ftemp = _mm512_broadcast_i64x4(ref3temp); + __m512i ref4ftemp = _mm512_broadcast_i64x4(ref4temp); + + for (j = 0, pRef = pRef1; j < n; j++, pRef += 16) + { + __m256i ss0 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef ))), _mm_loadu_si128((__m128i*)(pRef + refStride )), 0x1); + __m256i ss1 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 8 ))), _mm_loadu_si128((__m128i*)(pRef + refStride + 8 )), 0x1); + ss2 = _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(pRef + 16))), _mm_loadu_si128((__m128i*)(pRef + refStride + 16)), 0x1); + + __m512i ss1ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss0), ss1, 0x1); + __m512i ss2ftemp = _mm512_inserti64x4(_mm512_castsi256_si512(ss1), ss2, 0x1); + + ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref1ftemp, ss1ftemp, 0x94)); + ss3sum1_aaray[j] = _mm512_adds_epu16(ss3sum1_aaray[j], _mm512_dbsad_epu8(ref2ftemp, ss1ftemp, 0xE9)); + ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref3ftemp, ss2ftemp, 0x94)); + ss7sum1_aaray[j] = _mm512_adds_epu16(ss7sum1_aaray[j], _mm512_dbsad_epu8(ref4ftemp, ss2ftemp, 0xE9)); + + } + + pSrc += 2 * srcStride; + pRef1 += 2 * refStride; + + } + + for (j = 0; j < n; j++) + { + //Code performing better then original code + __m512i result1 = _mm512_adds_epu16(ss3sum1_aaray[j], ss7sum1_aaray[j]); + __m256i ss5 = _mm512_castsi512_si256(result1); + __m256i ss6 = _mm512_extracti64x4_epi64(result1, 1); + __m128i s3cum = _mm_adds_epu16(_mm256_castsi256_si128(ss5), _mm256_extracti128_si256(ss5, 1)); + __m128i s7cum = _mm_adds_epu16(_mm256_castsi256_si128(ss6), _mm256_extracti128_si256(ss6, 1)); + s3cum = _mm_minpos_epu16(s3cum); + s7cum = _mm_minpos_epu16(s7cum); + temSum1 = _mm_extract_epi16(s3cum, 0); + if (temSum1 < lowSum) { + lowSum = temSum1; + xBest = (EB_S16)((16 * j) + _mm_extract_epi16(s3cum, 1)); + yBest = i; + } + + temSum1 = _mm_extract_epi16(s7cum, 0); + if (temSum1 < lowSum) { + lowSum = temSum1; + xBest = (EB_S16)((16 * j) + 8 + _mm_extract_epi16(s7cum, 1)); + yBest = i; + } + + } + + ref += srcStrideRaw; + } + } + else if (height <= 32) { + for (i = 0; i (-1) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | - // > (-1) | > (-3) | <= (0) | a1 | -1 | 0 | -1 | - // > (-1) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | - // > (-1) | <= (-2) | <= (0) | a1 | -1 | 0 | -1 | - // <= (0) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | - // <= (0) | > (-3) | <= (0) | a0 | 0 | 0 | 0 | - // <= (0) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | - // <= (0) | <= (-2) | <= (0) | a0 | 0 | 0 | 0 | - - // *** 8 search points per position *** - - // ss0: Search Pos 0,4 for blocks 0,1,2,3 - // ss1: Search Pos 1,5 for blocks 0,1,2,3 - // ss2: Search Pos 2,6 for blocks 0,1,2,3 - // ss3: Search Pos 3,7 for blocks 0,1,2,3 - - ss4 = _mm256_cmpgt_epi32(ss0, ss1); - // not different SVT_LOG("%d\n", _mm_extract_epi32(_mm256_extracti128_si256(ss4, 0), 0)); // DEBUG - //ss4 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss1), _mm256_cmpeq_epi32(ss0, ss1)); - ss0 = _mm256_min_epi32(ss0, ss1); - ss5 = _mm256_cmpgt_epi32(ss2, ss3); - //ss5 = _mm256_or_si256(_mm256_cmpgt_epi32(ss2, ss3), _mm256_cmpeq_epi32(ss2, ss3)); - ss2 = _mm256_min_epi32(ss2, ss3); - ss5 = _mm256_sub_epi32(ss5, _mm256_set1_epi32(2)); // ss5-2 - - - // *** 4 search points per position *** - ss6 = _mm256_cmpgt_epi32(ss0, ss2); - //ss6 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss2), _mm256_cmpeq_epi32(ss0, ss2)); - ss0 = _mm256_min_epi32(ss0, ss2); - ss5 = _mm256_and_si256(ss5, ss6); // (ss5-2) & ss6 - ss4 = _mm256_andnot_si256(ss6, ss4); // ss4 & !ss6 - ss4 = _mm256_or_si256(ss4, ss5); // (ss4 & !ss6) | ((ss5-2) & ss6) - - // *** 2 search points per position *** - s0 = _mm_setzero_si128(); - s1 = _mm_setzero_si128(); - s2 = _mm_setzero_si128(); - s3 = _mm_setzero_si128(); - s4 = _mm_setzero_si128(); - s5 = _mm_setzero_si128(); - s6 = _mm_setzero_si128(); - s7 = _mm_setzero_si128(); - - // ss0 = 8 SADs, two search points for each 32x32 - // ss4 = 8 MVs, two search points for each 32x32 - // - // XY - // X: 32x32 block [0..3] - // Y: search position [0..1] - // Format: 00 10 20 30 01 11 21 31 - - // Each 128 bits contains 4 32x32 32bit block results + //32x32_0 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 0 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 1 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 2 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 3 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_01 = _mm_add_epi32(s0, s2); + sad_00 = _mm_add_epi32(s1, s3); + + //32x32_1 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 4 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 5 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 6 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 7 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_11 = _mm_add_epi32(s0, s2); + sad_10 = _mm_add_epi32(s1, s3); + + //32x32_2 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 8 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 9 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 10 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 11 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_21 = _mm_add_epi32(s0, s2); + sad_20 = _mm_add_epi32(s1, s3); + + //32x32_3 + s0 = _mm_loadu_si128((__m128i*)(pSad16x16 + 12 * 8)); + s1 = _mm_loadu_si128((__m128i*)(pSad16x16 + 13 * 8)); + s2 = _mm_loadu_si128((__m128i*)(pSad16x16 + 14 * 8)); + s3 = _mm_loadu_si128((__m128i*)(pSad16x16 + 15 * 8)); + + s4 = _mm_unpackhi_epi16(s0, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s0, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s1, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s1, _mm_setzero_si128()); + s0 = _mm_add_epi32(s4, s6); + s1 = _mm_add_epi32(s5, s7); + + s4 = _mm_unpackhi_epi16(s2, _mm_setzero_si128()); + s5 = _mm_unpacklo_epi16(s2, _mm_setzero_si128()); + s6 = _mm_unpackhi_epi16(s3, _mm_setzero_si128()); + s7 = _mm_unpacklo_epi16(s3, _mm_setzero_si128()); + s2 = _mm_add_epi32(s4, s6); + s3 = _mm_add_epi32(s5, s7); + + sad_31 = _mm_add_epi32(s0, s2); + sad_30 = _mm_add_epi32(s1, s3); + + sad_0 = _mm_add_epi32(_mm_add_epi32(sad_00, sad_10), _mm_add_epi32(sad_20, sad_30)); + sad_1 = _mm_add_epi32(_mm_add_epi32(sad_01, sad_11), _mm_add_epi32(sad_21, sad_31)); + sad_0 = _mm_slli_epi32(sad_0, 1); + sad_1 = _mm_slli_epi32(sad_1, 1); + + bestSad64x64 = pBestSad64x64[0]; + bestMV64x64 = 0; + //sad_0 + temSum = _mm_extract_epi32(sad_0, 0); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + } + temSum = _mm_extract_epi32(sad_0, 1); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 1 * 4; + } + temSum = _mm_extract_epi32(sad_0, 2); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 2 * 4; + } + temSum = _mm_extract_epi32(sad_0, 3); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 3 * 4; + } + + //sad_1 + temSum = _mm_extract_epi32(sad_1, 0); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 4 * 4; + } + temSum = _mm_extract_epi32(sad_1, 1); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 5 * 4; + } + temSum = _mm_extract_epi32(sad_1, 2); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 6 * 4; + } + temSum = _mm_extract_epi32(sad_1, 3); + if (temSum < bestSad64x64){ + bestSad64x64 = temSum; + bestMV64x64 = 7 * 4; + } + if (pBestSad64x64[0] != bestSad64x64) { + pBestSad64x64[0] = bestSad64x64; + xMv = _MVXT(mv) + (EB_S16) bestMV64x64; yMv = _MVYT(mv); + pBestMV64x64[0] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); + } + + // ****CODE PAST HERE IS BUGGY FOR GCC**** + + // XY + // X: 32x32 block [0..3] + // Y: Search position [0..7] + ss0 = _mm256_setr_m128i(sad_00, sad_01); // 07 06 05 04 03 02 01 00 + ss1 = _mm256_setr_m128i(sad_10, sad_11); // 17 16 15 14 13 12 11 10 + ss2 = _mm256_setr_m128i(sad_20, sad_21); // 27 26 25 24 23 22 21 20 + ss3 = _mm256_setr_m128i(sad_30, sad_31); // 37 36 35 34 33 32 31 30 + ss4 = _mm256_unpacklo_epi32(ss0, ss1); // 15 05 14 04 11 01 10 00 + ss5 = _mm256_unpacklo_epi32(ss2, ss3); // 35 25 34 24 31 21 30 20 + ss6 = _mm256_unpackhi_epi32(ss0, ss1); // 17 07 16 06 13 03 12 02 + ss7 = _mm256_unpackhi_epi32(ss2, ss3); // 37 27 36 26 33 23 32 22 + ss0 = _mm256_unpacklo_epi64(ss4, ss5); // 34 24 14 04 30 20 10 00 + ss1 = _mm256_unpackhi_epi64(ss4, ss5); // 35 25 15 05 31 21 11 01 + ss2 = _mm256_unpacklo_epi64(ss6, ss7); // 36 26 16 06 32 22 12 02 + ss3 = _mm256_unpackhi_epi64(ss6, ss7); // 37 27 17 07 33 23 13 03 + + // ss4 | ss5-2 | ss6 | + // a0 : a1 | a2 : a3 | min(a0, a1) : min(a2, a3) | | (ss4 & !ss6) | ((ss5-2) & ss6) | ((ss4 & !ss6) | ((ss5-2) & ss6)) | + // > (-1) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | + // > (-1) | > (-3) | <= (0) | a1 | -1 | 0 | -1 | + // > (-1) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | + // > (-1) | <= (-2) | <= (0) | a1 | -1 | 0 | -1 | + // <= (0) | > (-3) | > (-1) | a3 | 0 | -3 | -3 | + // <= (0) | > (-3) | <= (0) | a0 | 0 | 0 | 0 | + // <= (0) | <= (-2) | > (-1) | a2 | 0 | -2 | -2 | + // <= (0) | <= (-2) | <= (0) | a0 | 0 | 0 | 0 | + + // *** 8 search points per position *** + + // ss0: Search Pos 0,4 for blocks 0,1,2,3 + // ss1: Search Pos 1,5 for blocks 0,1,2,3 + // ss2: Search Pos 2,6 for blocks 0,1,2,3 + // ss3: Search Pos 3,7 for blocks 0,1,2,3 + + ss4 = _mm256_cmpgt_epi32(ss0, ss1); + // not different SVT_LOG("%d\n", _mm_extract_epi32(_mm256_extracti128_si256(ss4, 0), 0)); // DEBUG + //ss4 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss1), _mm256_cmpeq_epi32(ss0, ss1)); + ss0 = _mm256_min_epi32(ss0, ss1); + ss5 = _mm256_cmpgt_epi32(ss2, ss3); + //ss5 = _mm256_or_si256(_mm256_cmpgt_epi32(ss2, ss3), _mm256_cmpeq_epi32(ss2, ss3)); + ss2 = _mm256_min_epi32(ss2, ss3); + ss5 = _mm256_sub_epi32(ss5, _mm256_set1_epi32(2)); // ss5-2 + + + // *** 4 search points per position *** + ss6 = _mm256_cmpgt_epi32(ss0, ss2); + //ss6 = _mm256_or_si256(_mm256_cmpgt_epi32(ss0, ss2), _mm256_cmpeq_epi32(ss0, ss2)); + ss0 = _mm256_min_epi32(ss0, ss2); + ss5 = _mm256_and_si256(ss5, ss6); // (ss5-2) & ss6 + ss4 = _mm256_andnot_si256(ss6, ss4); // ss4 & !ss6 + ss4 = _mm256_or_si256(ss4, ss5); // (ss4 & !ss6) | ((ss5-2) & ss6) + + // *** 2 search points per position *** + s0 = _mm_setzero_si128(); + s1 = _mm_setzero_si128(); + s2 = _mm_setzero_si128(); + s3 = _mm_setzero_si128(); + s4 = _mm_setzero_si128(); + s5 = _mm_setzero_si128(); + s6 = _mm_setzero_si128(); + s7 = _mm_setzero_si128(); + + // ss0 = 8 SADs, two search points for each 32x32 + // ss4 = 8 MVs, two search points for each 32x32 + // + // XY + // X: 32x32 block [0..3] + // Y: search position [0..1] + // Format: 00 10 20 30 01 11 21 31 + + // Each 128 bits contains 4 32x32 32bit block results #ifdef __GNUC__ - // SAD - s0 = _mm256_extracti128_si256(ss0, 1); - s1 = _mm256_extracti128_si256(ss0, 0); - // MV - s2 = _mm256_extracti128_si256(ss4, 1); - s3 = _mm256_extracti128_si256(ss4, 0); + // SAD + s0 = _mm256_extracti128_si256(ss0, 1); + s1 = _mm256_extracti128_si256(ss0, 0); + // MV + s2 = _mm256_extracti128_si256(ss4, 1); + s3 = _mm256_extracti128_si256(ss4, 0); #else - // SAD - s0 = _mm256_extracti128_si256(ss0, 0); - s1 = _mm256_extracti128_si256(ss0, 1); - // MV - s2 = _mm256_extracti128_si256(ss4, 0); - s3 = _mm256_extracti128_si256(ss4, 1); + // SAD + s0 = _mm256_extracti128_si256(ss0, 0); + s1 = _mm256_extracti128_si256(ss0, 1); + // MV + s2 = _mm256_extracti128_si256(ss4, 0); + s3 = _mm256_extracti128_si256(ss4, 1); #endif - //// Should be fine - //SVT_LOG("sad0 %d, %d, %d, %d\n", _mm_extract_epi32(s0, 0), _mm_extract_epi32(s0, 1), _mm_extract_epi32(s0, 2), _mm_extract_epi32(s0, 3)); // DEBUG - //SVT_LOG("sad1 %d, %d, %d, %d\n", _mm_extract_epi32(s1, 0), _mm_extract_epi32(s1, 1), _mm_extract_epi32(s1, 2), _mm_extract_epi32(s1, 3)); // DEBUG - //SVT_LOG("mv0 %d, %d, %d, %d\n", _mm_extract_epi32(s2, 0), _mm_extract_epi32(s2, 1), _mm_extract_epi32(s2, 2), _mm_extract_epi32(s2, 3)); // DEBUG - //SVT_LOG("mv1 %d, %d, %d, %d\n", _mm_extract_epi32(s3, 0), _mm_extract_epi32(s3, 1), _mm_extract_epi32(s3, 2), _mm_extract_epi32(s3, 3)); // DEBUG - - - // Choose the best MV out of the two, use s4 to hold results of min - s4 = _mm_cmpgt_epi32(s0, s1); - - // DIFFERENT BETWEEN VS AND GCC - // SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG - - //s4 = _mm_or_si128(_mm_cmpgt_epi32(s0, s1), _mm_cmpeq_epi32(s0, s1)); - s0 = _mm_min_epi32(s0, s1); - - - - // Extract MV's based on the blocks to s2 - s3 = _mm_sub_epi32(s3, _mm_set1_epi32(4)); // s3-4 - // Remove the MV's are not used from s2 - s2 = _mm_andnot_si128(s4, s2); - // Remove the MV's that are not used from s3 (inverse from s2 above operation) - s3 = _mm_and_si128(s4, s3); - // Combine the remaining candidates into s2 - s2 = _mm_or_si128(s2, s3); - // Convert MV's into encoders format - s2 = _mm_sub_epi32(_mm_setzero_si128(), s2); - s2 = _mm_slli_epi32(s2, 2); // mv info - - - // ***SAD*** - // s0: current SAD candidates for each 32x32 - // s1: best SAD's for 32x32 - - // << 1 to compensate for every other line - s0 = _mm_slli_epi32(s0, 1); // best sad info - // Load best SAD's - s1 = _mm_loadu_si128((__m128i*)pBestSad32x32); - - // Determine which candidates are better than the current best SAD's. - // s4 is used to determine the MV's of the new best SAD's - s4 = _mm_cmpgt_epi32(s1, s0); - // not different SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG - //s4 = _mm_or_si128(_mm_cmpgt_epi32(s1, s0), _mm_cmpeq_epi32(s1, s0)); - // Combine old and new min SAD's - s0 = _mm_min_epu32(s0, s1); - // Store new best SAD's back to memory - _mm_storeu_si128((__m128i*)pBestSad32x32, s0); - - - // ***Motion Vectors*** - // Load best MV's - // s3: candidate MV's - // s4: results of comparing SAD's - // s5: previous best MV's - - // Load previous best MV's - s5 = _mm_loadu_si128((__m128i*)pBestMV32x32); - // Remove the MV's that are being replaced - s5 = _mm_andnot_si128(s4, s5); - // Set s3 to the base MV - s3 = _mm_set1_epi32(mv); - // Add candidate MV's to base MV - s3 = _mm_add_epi16(s3, s2); - // Remove non-candidate's - s3 = _mm_and_si128(s3, s4); - // Combine remaining candidates with remaining best MVs - s3 = _mm_or_si128(s3, s5); - // Store back to memory - _mm_storeu_si128((__m128i*)pBestMV32x32, s3); + //// Should be fine + //SVT_LOG("sad0 %d, %d, %d, %d\n", _mm_extract_epi32(s0, 0), _mm_extract_epi32(s0, 1), _mm_extract_epi32(s0, 2), _mm_extract_epi32(s0, 3)); // DEBUG + //SVT_LOG("sad1 %d, %d, %d, %d\n", _mm_extract_epi32(s1, 0), _mm_extract_epi32(s1, 1), _mm_extract_epi32(s1, 2), _mm_extract_epi32(s1, 3)); // DEBUG + //SVT_LOG("mv0 %d, %d, %d, %d\n", _mm_extract_epi32(s2, 0), _mm_extract_epi32(s2, 1), _mm_extract_epi32(s2, 2), _mm_extract_epi32(s2, 3)); // DEBUG + //SVT_LOG("mv1 %d, %d, %d, %d\n", _mm_extract_epi32(s3, 0), _mm_extract_epi32(s3, 1), _mm_extract_epi32(s3, 2), _mm_extract_epi32(s3, 3)); // DEBUG + + + // Choose the best MV out of the two, use s4 to hold results of min + s4 = _mm_cmpgt_epi32(s0, s1); + + // DIFFERENT BETWEEN VS AND GCC + // SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG + + //s4 = _mm_or_si128(_mm_cmpgt_epi32(s0, s1), _mm_cmpeq_epi32(s0, s1)); + s0 = _mm_min_epi32(s0, s1); + + + + // Extract MV's based on the blocks to s2 + s3 = _mm_sub_epi32(s3, _mm_set1_epi32(4)); // s3-4 + // Remove the MV's are not used from s2 + s2 = _mm_andnot_si128(s4, s2); + // Remove the MV's that are not used from s3 (inverse from s2 above operation) + s3 = _mm_and_si128(s4, s3); + // Combine the remaining candidates into s2 + s2 = _mm_or_si128(s2, s3); + // Convert MV's into encoders format + s2 = _mm_sub_epi32(_mm_setzero_si128(), s2); + s2 = _mm_slli_epi32(s2, 2); // mv info + + + // ***SAD*** + // s0: current SAD candidates for each 32x32 + // s1: best SAD's for 32x32 + + // << 1 to compensate for every other line + s0 = _mm_slli_epi32(s0, 1); // best sad info + // Load best SAD's + s1 = _mm_loadu_si128((__m128i*)pBestSad32x32); + + // Determine which candidates are better than the current best SAD's. + // s4 is used to determine the MV's of the new best SAD's + s4 = _mm_cmpgt_epi32(s1, s0); + // not different SVT_LOG("%d, %d, %d, %d\n", _mm_extract_epi32(s4, 0), _mm_extract_epi32(s4, 1), _mm_extract_epi32(s4, 2), _mm_extract_epi32(s4, 3)); // DEBUG + //s4 = _mm_or_si128(_mm_cmpgt_epi32(s1, s0), _mm_cmpeq_epi32(s1, s0)); + // Combine old and new min SAD's + s0 = _mm_min_epu32(s0, s1); + // Store new best SAD's back to memory + _mm_storeu_si128((__m128i*)pBestSad32x32, s0); + + + // ***Motion Vectors*** + // Load best MV's + // s3: candidate MV's + // s4: results of comparing SAD's + // s5: previous best MV's + + // Load previous best MV's + s5 = _mm_loadu_si128((__m128i*)pBestMV32x32); + // Remove the MV's that are being replaced + s5 = _mm_andnot_si128(s4, s5); + // Set s3 to the base MV + s3 = _mm_set1_epi32(mv); + // Add candidate MV's to base MV + s3 = _mm_add_epi16(s3, s2); + // Remove non-candidate's + s3 = _mm_and_si128(s3, s4); + // Combine remaining candidates with remaining best MVs + s3 = _mm_or_si128(s3, s5); + // Store back to memory + _mm_storeu_si128((__m128i*)pBestMV32x32, s3); } AVX512_FUNC_TARGET void GetEightHorizontalSearchPointResultsAll85PUs_AVX512_INTRIN( - MeContext_t *contextPtr, - EB_U32 listIndex, - EB_U32 searchRegionIndex, - EB_U32 xSearchIndex, - EB_U32 ySearchIndex + MeContext_t *contextPtr, + EB_U32 listIndex, + EB_U32 searchRegionIndex, + EB_U32 xSearchIndex, + EB_U32 ySearchIndex ) { - EB_U8 *srcPtr = contextPtr->lcuSrcPtr; - EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); - EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; - - EB_U32 searchPositionTLIndex = searchRegionIndex; - - EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); - EB_U32 refNext16x16Offset = (reflumaStride << 4); - - EB_U32 currMVy = (((EB_U16)ySearchIndex) << 18); - EB_U16 currMVx = (((EB_U16)xSearchIndex << 2)); - EB_U32 currMV = currMVy | currMVx; - - EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; - EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; - EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; - EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; - - EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; - EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; - EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; - EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; - - EB_U16 *pSad16x16 = contextPtr->pEightPosSad16x16; - - /* - ---------------------- ---------------------- - | 16x16_0 | 16x16_1 | 16x16_4 | 16x16_5 | - ---------------------- ---------------------- - | 16x16_2 | 16x16_3 | 16x16_6 | 16x16_7 | - ----------------------- ----------------------- - | 16x16_8 | 16x16_9 | 16x16_12 | 16x16_13 | - ---------------------- ---------------------- - | 16x16_10 | 16x16_11 | 16x16_14 | 16x16_15 | - ----------------------- ----------------------- - */ - - const EB_U32 srcStride = contextPtr->lcuSrcStride; - const char c_blknum_tbl[16] = { 0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15 }; - - EB_U32 searchPositionIndex = searchPositionTLIndex; - EB_U32 blockIndex = 0; - - srcNext16x16Offset = srcStride << 4; - - for (int j = 0; j < 16; j += 4) - { - int i = j, blockIndex_l = blockIndex, searchPositionIndex_l = searchPositionIndex; - for ( ; i < (j+4); ++i, blockIndex_l += 16, searchPositionIndex_l += 16) - { - int blck = c_blknum_tbl[i]; - // for best performance this function is inlined - GetEightHorizontalSearchPointResults_8x8_16x16_PU_AVX512_INTRIN(srcPtr + blockIndex_l, srcStride, - refPtr + searchPositionIndex_l, reflumaStride, - &pBestSad8x8[4 * blck], - &pBestMV8x8[4 * blck], - &pBestSad16x16[blck], - &pBestMV16x16[blck], - currMV, - &pSad16x16[8 * blck]); - } - blockIndex += srcNext16x16Offset; - searchPositionIndex += refNext16x16Offset; - } - - ////32x32 and 64x64 - GetEightHorizontalSearchPointResults_32x32_64x64_PU_AVX2_INTRIN(pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); + EB_U8 *srcPtr = contextPtr->lcuSrcPtr; + EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); + EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; + + EB_U32 searchPositionTLIndex = searchRegionIndex; + + EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); + EB_U32 refNext16x16Offset = (reflumaStride << 4); + + EB_U32 currMVy = (((EB_U16)ySearchIndex) << 18); + EB_U16 currMVx = (((EB_U16)xSearchIndex << 2)); + EB_U32 currMV = currMVy | currMVx; + + EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; + EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; + EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; + EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; + + EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; + EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; + EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; + EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; + + EB_U16 *pSad16x16 = contextPtr->pEightPosSad16x16; + + /* + ---------------------- ---------------------- + | 16x16_0 | 16x16_1 | 16x16_4 | 16x16_5 | + ---------------------- ---------------------- + | 16x16_2 | 16x16_3 | 16x16_6 | 16x16_7 | + ----------------------- ----------------------- + | 16x16_8 | 16x16_9 | 16x16_12 | 16x16_13 | + ---------------------- ---------------------- + | 16x16_10 | 16x16_11 | 16x16_14 | 16x16_15 | + ----------------------- ----------------------- + */ + + const EB_U32 srcStride = contextPtr->lcuSrcStride; + const char c_blknum_tbl[16] = { 0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15 }; + + EB_U32 searchPositionIndex = searchPositionTLIndex; + EB_U32 blockIndex = 0; + + srcNext16x16Offset = srcStride << 4; + + for (int j = 0; j < 16; j += 4) + { + int i = j, blockIndex_l = blockIndex, searchPositionIndex_l = searchPositionIndex; + for ( ; i < (j+4); ++i, blockIndex_l += 16, searchPositionIndex_l += 16) + { + int blck = c_blknum_tbl[i]; + // for best performance this function is inlined + GetEightHorizontalSearchPointResults_8x8_16x16_PU_AVX512_INTRIN(srcPtr + blockIndex_l, srcStride, + refPtr + searchPositionIndex_l, reflumaStride, + &pBestSad8x8[4 * blck], + &pBestMV8x8[4 * blck], + &pBestSad16x16[blck], + &pBestMV16x16[blck], + currMV, + &pSad16x16[8 * blck]); + } + blockIndex += srcNext16x16Offset; + searchPositionIndex += refNext16x16Offset; + } + + ////32x32 and 64x64 + GetEightHorizontalSearchPointResults_32x32_64x64_PU_AVX2_INTRIN(pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); } #endif diff --git a/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h b/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h index 567e869ad..34b418480 100644 --- a/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h +++ b/Source/Lib/ASM_AVX2/EbComputeSAD_SadLoopKernel_AVX512.h @@ -56,6 +56,6 @@ extern void GetEightHorizontalSearchPointResultsAll85PUs_AVX512_INTRIN( #ifdef __cplusplus } -#endif +#endif #endif // EbComputeSAD_AVX512_h diff --git a/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h b/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h index 1a9b4db74..a87c1505d 100644 --- a/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbIntraPrediction_AVX2.h @@ -12,27 +12,27 @@ extern "C" { #endif extern void IntraModePlanar_AVX2_INTRIN( - const EB_U32 size, //input parameter, denotes the size of the current PU - EB_U8 *refSamples, //input parameter, pointer to the reference samples - EB_U8 *predictionPtr, //output parameter, pointer to the prediction - const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); + const EB_U32 size, //input parameter, denotes the size of the current PU + EB_U8 *refSamples, //input parameter, pointer to the reference samples + EB_U8 *predictionPtr, //output parameter, pointer to the prediction + const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip); extern void IntraModeAngular_Vertical_Kernel_AVX2_INTRIN( - EB_U32 size, //input parameter, denotes the size of the current PU - EB_U8 *refSampMain, //input parameter, pointer to the reference samples - EB_U8 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 size, //input parameter, denotes the size of the current PU + EB_U8 *refSampMain, //input parameter, pointer to the reference samples + EB_U8 *predictionPtr, //output parameter, pointer to the prediction + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); extern void IntraModeAngular_Horizontal_Kernel_AVX2_INTRIN( - EB_U32 size, //input parameter, denotes the size of the current PU - EB_U8 *refSampMain, //input parameter, pointer to the reference samples - EB_U8 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 size, //input parameter, denotes the size of the current PU + EB_U8 *refSampMain, //input parameter, pointer to the reference samples + EB_U8 *predictionPtr, //output parameter, pointer to the prediction + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); extern void IntraModeVerticalLuma_AVX2_INTRIN( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -96,7 +96,7 @@ EB_U32 UpdateNeighborDcIntraPred_AVX2_INTRIN( EB_U16 originX, EB_U32 srcOriginX, EB_U32 srcOriginY, - EB_U32 blockSize); + EB_U32 blockSize); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c index 67477d0f4..7d86bd4cb 100644 --- a/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbIntraPrediction_Intrinsic_AVX2.c @@ -1,4 +1,4 @@ -/* +/* * Copyright(c) 2018 Intel Corporation * SPDX - License - Identifier: BSD - 2 - Clause - Patent */ @@ -820,7 +820,7 @@ void IntraModeVerticalLuma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ) { EB_U32 topLeftOffset = size << 1; @@ -834,31 +834,31 @@ void IntraModeVerticalLuma_AVX2_INTRIN( xmm0 = _mm_setzero_si128(); xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); - xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); - + xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); + xmm_topLeft = _mm_set_epi16((signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, (signed short)0xffff, *(EB_U16*)(refSamples + topLeftOffset)); - xmm_topLeft = _mm_unpacklo_epi8(xmm_topLeft, xmm0); - xmm_topLeft = _mm_unpacklo_epi16(xmm_topLeft, xmm_topLeft); - xmm_topLeft = _mm_unpacklo_epi32(xmm_topLeft, xmm_topLeft); - xmm_topLeft_hi = _mm_unpackhi_epi64(xmm_topLeft, xmm_topLeft); - xmm_topLeft_lo = _mm_unpacklo_epi64(xmm_topLeft, xmm_topLeft); - + xmm_topLeft = _mm_unpacklo_epi8(xmm_topLeft, xmm0); + xmm_topLeft = _mm_unpacklo_epi16(xmm_topLeft, xmm_topLeft); + xmm_topLeft = _mm_unpacklo_epi32(xmm_topLeft, xmm_topLeft); + xmm_topLeft_hi = _mm_unpackhi_epi64(xmm_topLeft, xmm_topLeft); + xmm_topLeft_lo = _mm_unpacklo_epi64(xmm_topLeft, xmm_topLeft); + if (!skip) { if (size == 8) { - - xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); + + xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); + xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_top) - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_top) } - else if (size == 16) { - xmm_left = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); - xmm_left_lo = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); - xmm_left_hi = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); - xmm_left = _mm_packus_epi16(xmm_left_lo, xmm_left_hi); - xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); + else if (size == 16) { + xmm_left = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); + xmm_left_lo = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); + xmm_left_hi = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(xmm_left, xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi); + xmm_left = _mm_packus_epi16(xmm_left_lo, xmm_left_hi); + xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) @@ -869,31 +869,31 @@ void IntraModeVerticalLuma_AVX2_INTRIN( } else { xmm_left = _mm_packus_epi16(_mm_add_epi16( _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm0), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); + xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_4(xmm_left, xmm_mask2, xmm_top) - predictionPtr += (pStride << 1); + predictionPtr += (pStride << 1); MACRO_VERTICAL_LUMA_4(xmm_left, xmm_mask2, xmm_top) } } - else{ - pStride <<= 1; + else{ + pStride <<= 1; xmm_mask_skip = _mm_set1_epi16(0x00FF); if (size == 8) { xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); + xmm_top = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_top); } else if (size == 16) { xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); + xmm_top = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_16(xmm_left, xmm_mask2, xmm_top) } else { - xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); - xmm_top = _mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_mask1); + xmm_left = _mm_packus_epi16(_mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm_mask_skip), xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm0); + xmm_top = _mm_and_si128(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_4(xmm_left, xmm_mask2, xmm_top) } } @@ -909,20 +909,20 @@ void IntraModeVerticalLuma_AVX2_INTRIN( pStride = pStride << (skip ? 1 : 0); xmm0 = _mm256_loadu_si256((__m256i *)(refSamples + topOffset)); - - for (count = 0; count < size_to_write; count ++) { - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); + + for (count = 0; count < size_to_write; count ++) { + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); } } @@ -934,7 +934,7 @@ void IntraModeDCLuma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { __m128i xmm0 = _mm_setzero_si128(); EB_U32 pStride = predictionBufferStride; @@ -943,7 +943,7 @@ void IntraModeDCLuma_AVX2_INTRIN( if (size != 32) { - __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); + __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); __m128i xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); __m128i xmm_C2 = _mm_set1_epi16(0x0002); @@ -958,9 +958,9 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); xmm_left_hi = _mm_unpackhi_epi8(xmm_left, xmm0); - - xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); - + + xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); + xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sum, 8), xmm_sum), _mm_cvtsi32_si128(16)), 5); xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); @@ -970,12 +970,12 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); - xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)); - xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), 1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), _mm_and_si128(xmm_top, xmm_mask1)); @@ -1011,22 +1011,22 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - + xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); - xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); _mm_storel_epi64((__m128i *)(predictionPtr), xmm_predictionPtr_0); - + _mm_storel_epi64((__m128i *)(predictionPtr+pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); @@ -1036,14 +1036,14 @@ void IntraModeDCLuma_AVX2_INTRIN( predictionPtr += (pStride << 2); MACRO_VERTICAL_LUMA_8(xmm_left, xmm_mask2, xmm_predictionDcValue) - + } else { __m128i xmm_left, xmm_top, xmm_top_lo, xmm_left_lo, xmm_predictionDcValue, xmm_predictionDcValue_16; __m128i xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3, xmm_predictionPtr_0; xmm_top = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)); xmm_left = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)); - + xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)), _mm_cvtsi32_si128(4)), 3); @@ -1056,15 +1056,15 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - + xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); - + xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); *(EB_U32*)predictionPtr = _mm_cvtsi128_si32(xmm_predictionPtr_0); - + *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); @@ -1085,7 +1085,7 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); - + xmm_left_skipped = _mm_and_si128(xmm_skip_mask, xmm_left); xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); @@ -1095,22 +1095,22 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_skipped, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_skipped, xmm_predictionDcValue_16_x3), xmm_C2), 2); xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); - - xmm_top = _mm_and_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + + xmm_top = _mm_and_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), xmm_mask1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_skipped), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); - _mm_storeu_si128((__m128i *)predictionPtr, xmm_predictionPtr_0); - + _mm_storeu_si128((__m128i *)predictionPtr, xmm_predictionPtr_0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); @@ -1135,10 +1135,10 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); @@ -1149,10 +1149,10 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(xmm_predictionPtr_0, xmm_mask2), _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1)); _mm_storel_epi64((__m128i *)predictionPtr, xmm_predictionPtr_0); - + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); xmm_left = _mm_srli_si128(xmm_left, 1); - + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue)); _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_or_si128(_mm_and_si128(_mm_srli_si128(xmm_left, 1), xmm_mask2), xmm_predictionDcValue)); @@ -1160,29 +1160,29 @@ void IntraModeDCLuma_AVX2_INTRIN( } } } - - + + /*************************************************************************************************************************************************************************************************************/ else { - __m256i xmm_sum,xmm_sadleft,xmm_sadtop,xmm_toptmp,xmm_lefttmp ,xmm_set,xmm_sum128_2,xmm_sum256,xmm_predictionDcValue; - __m256i xmm1 = _mm256_setzero_si256(); + __m256i xmm_sum,xmm_sadleft,xmm_sadtop,xmm_toptmp,xmm_lefttmp ,xmm_set,xmm_sum128_2,xmm_sum256,xmm_predictionDcValue; + __m256i xmm1 = _mm256_setzero_si256(); __m128i xmm_sumhi,xmm_sumlo,xmm_sum1,xmm_sum128,xmm_sumhitmp,xmm_sumlotmp,xmm_movelotmp,xmm_movehitmp; - + xmm_sumhi = xmm_sumlo = xmm_sum128 = xmm_sumhitmp = xmm_sumlotmp = _mm_setzero_si128(); xmm_sum = xmm_sadleft = xmm_sadtop = xmm_toptmp = xmm_lefttmp = _mm256_setzero_si256(); - + xmm_toptmp =_mm256_sad_epu8( _mm256_set_m128i ( _mm_loadu_si128( (__m128i *)(refSamples + topOffset +16) ),_mm_loadu_si128((__m128i *)(refSamples + topOffset))),xmm1); xmm_lefttmp =_mm256_sad_epu8( _mm256_set_m128i( _mm_loadu_si128((__m128i *)(refSamples + leftOffset+16)),_mm_loadu_si128((__m128i *)(refSamples + leftOffset))),xmm1); - - xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp ) ; - xmm_sum = _mm256_hadd_epi32 (xmm_sum,xmm_sum); - xmm_sumlo = _mm256_extracti128_si256(xmm_sum,0); - xmm_sumhi = _mm256_extracti128_si256(xmm_sum,1); - - xmm_movelotmp = _mm_move_epi64 (xmm_sumlo); + + xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp ) ; + xmm_sum = _mm256_hadd_epi32 (xmm_sum,xmm_sum); + xmm_sumlo = _mm256_extracti128_si256(xmm_sum,0); + xmm_sumhi = _mm256_extracti128_si256(xmm_sum,1); + + xmm_movelotmp = _mm_move_epi64 (xmm_sumlo); xmm_movehitmp = _mm_move_epi64 (xmm_sumhi); - + xmm_sum1 = _mm_add_epi32(xmm_movelotmp,xmm_movehitmp); xmm_sum1 = _mm_hadd_epi32(xmm_sum1,xmm_sum1); @@ -1190,15 +1190,15 @@ void IntraModeDCLuma_AVX2_INTRIN( xmm_sum256 = _mm256_castsi128_si256(xmm_sum1); -//#endif +//#endif xmm_set = _mm256_castsi128_si256(_mm_set1_epi32(32)); - - xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset + + xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2,6); //_mm256_srli_epi32 - - __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); - + + __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); + EB_U8 dc = _mm_cvtsi128_si32 (dc128); xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 @@ -1207,35 +1207,35 @@ void IntraModeDCLuma_AVX2_INTRIN( for (count = 0; count < 2; ++count) { - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); - + predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); - + predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); - + predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - + } @@ -1251,7 +1251,7 @@ void IntraModeAngular_2_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; @@ -1259,13 +1259,13 @@ void IntraModeAngular_2_AVX2_INTRIN( if (!skip) { if (size == 32) { - EB_U32 count; + EB_U32 count; for (count = 0; count < 8; ++count){ _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 1))); _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 2))); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 3))); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 4))); - + refSamples += 4; predictionPtr += (pStride << 2); } @@ -1317,7 +1317,7 @@ void IntraModeAngular_2_AVX2_INTRIN( EB_U32 count; for (count = 0; count < 4; ++count) { - + _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 1))); _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 3))); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + leftOffset + 5))); @@ -1327,7 +1327,7 @@ void IntraModeAngular_2_AVX2_INTRIN( } } else if (size == 16) { - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); @@ -1342,7 +1342,7 @@ void IntraModeAngular_2_AVX2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 1))); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 3))); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 5))); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 7))); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + leftOffset + 7))); } } else { @@ -1355,287 +1355,287 @@ void IntraModeAngular_2_AVX2_INTRIN( #define MIDRANGE_VALUE_8BIT 128 EB_U32 UpdateNeighborDcIntraPred_AVX2_INTRIN( - EB_U8 *yIntraReferenceArrayReverse, + EB_U8 *yIntraReferenceArrayReverse, EB_U16 inputHeight, EB_U16 strideY, EB_BYTE bufferY, EB_U16 originY, EB_U16 originX, - EB_U32 srcOriginX, - EB_U32 srcOriginY, - EB_U32 blockSize) + EB_U32 srcOriginX, + EB_U32 srcOriginY, + EB_U32 blockSize) { - EB_U32 idx; - EB_U8 *srcPtr; - EB_U8 *dstPtr; - EB_U8 *readPtr; + EB_U32 idx; + EB_U8 *srcPtr; + EB_U8 *dstPtr; + EB_U8 *readPtr; - //EB_U32 count; + //EB_U32 count; (void) inputHeight; - EB_U8 *yBorderReverse = yIntraReferenceArrayReverse; - //EB_U32 height = inputHeight; - //EB_U32 blockSizeHalf = blockSize << 1; - EB_U32 topOffset = (blockSize << 1) + 1; - EB_U32 leftOffset = 0; - EB_U32 stride = strideY; - __m128i xmm0 = _mm_setzero_si128(); - __m256i xmm1 = _mm256_setzero_si256(); - __m256i ymm0; + EB_U8 *yBorderReverse = yIntraReferenceArrayReverse; + //EB_U32 height = inputHeight; + //EB_U32 blockSizeHalf = blockSize << 1; + EB_U32 topOffset = (blockSize << 1) + 1; + EB_U32 leftOffset = 0; + EB_U32 stride = strideY; + __m128i xmm0 = _mm_setzero_si128(); + __m256i xmm1 = _mm256_setzero_si256(); + __m256i ymm0; - __m128i xmm_sad = _mm_setzero_si128(); + __m128i xmm_sad = _mm_setzero_si128(); - // Adjust the Source ptr to start at the origin of the block being updated - srcPtr = bufferY + (((srcOriginY + originY) * stride) + (srcOriginX + originX)); + // Adjust the Source ptr to start at the origin of the block being updated + srcPtr = bufferY + (((srcOriginY + originY) * stride) + (srcOriginX + originX)); - // Adjust the Destination ptr to start at the origin of the Intra reference array - dstPtr = yBorderReverse; + // Adjust the Destination ptr to start at the origin of the Intra reference array + dstPtr = yBorderReverse; //CHKn here we need ref on Top+Left only. and memset is done only for border CUs - //Initialise the Luma Intra Reference Array to the mid range value 128 (for CUs at the picture boundaries) - memset(dstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); + //Initialise the Luma Intra Reference Array to the mid range value 128 (for CUs at the picture boundaries) + memset(dstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); - // Get the left-column - //count = blockSizeHalf; + // Get the left-column + //count = blockSizeHalf; - readPtr = srcPtr - 1; + readPtr = srcPtr - 1; - if (blockSize != 32) { + if (blockSize != 32) { - __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); - __m128i xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); - __m128i xmm_C2 = _mm_set1_epi16(0x0002); + __m128i xmm_mask1 = _mm_slli_si128(_mm_set1_epi8((signed char)0xFF), 1); + __m128i xmm_mask2 = _mm_srli_si128(xmm_mask1, 15); + __m128i xmm_C2 = _mm_set1_epi16(0x0002); - if (blockSize == 16) { - __m128i xmm_predictionDcValue, xmm_top, xmm_left, xmm_sum, xmm_predictionPtr_0; - __m128i xmm_top_lo, xmm_top_hi, xmm_left_lo, xmm_left_hi, xmm_predictionDcValue_16, xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3; - if (srcOriginY != 0) - { - xmm_top = _mm_loadu_si128((__m128i *)(srcPtr - stride)); - } - else - { - xmm_top = _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128); - } + if (blockSize == 16) { + __m128i xmm_predictionDcValue, xmm_top, xmm_left, xmm_sum, xmm_predictionPtr_0; + __m128i xmm_top_lo, xmm_top_hi, xmm_left_lo, xmm_left_hi, xmm_predictionDcValue_16, xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3; + if (srcOriginY != 0) + { + xmm_top = _mm_loadu_si128((__m128i *)(srcPtr - stride)); + } + else + { + xmm_top = _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128); + } - if (srcOriginX != 0) { - xmm_left = _mm_set_epi8(*(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); - } - else - { - xmm_left = _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); - } + if (srcOriginX != 0) { + xmm_left = _mm_set_epi8(*(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); + } + else + { + xmm_left = _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); + } - xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); - xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); - xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); - xmm_left_hi = _mm_unpackhi_epi8(xmm_left, xmm0); + xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); + xmm_top_hi = _mm_unpackhi_epi8(xmm_top, xmm0); + xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); + xmm_left_hi = _mm_unpackhi_epi8(xmm_left, xmm0); - xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); + xmm_sum = _mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)); - xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sum, 8), xmm_sum), _mm_cvtsi32_si128(16)), 5); - xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sum, 8), xmm_sum), _mm_cvtsi32_si128(16)), 5); + xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); - xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); - xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); + xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), - _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)); + xmm_top = _mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)); - xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), - _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), 1); + xmm_left = _mm_srli_si128(_mm_packus_epi16(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2), + _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_hi, xmm_predictionDcValue_16_x3), xmm_C2), 2)), 1); - xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), _mm_and_si128(xmm_top, xmm_mask1)); + xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), _mm_and_si128(xmm_top, xmm_mask1)); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - for (idx = 4; idx < blockSize; idx += 4){ - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + for (idx = 4; idx < blockSize; idx += 4){ + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - } + } - xmm_sad = _mm_add_epi32(xmm_sad, _mm_srli_si128(xmm_sad, 8)); - return _mm_cvtsi128_si32(xmm_sad); - } + xmm_sad = _mm_add_epi32(xmm_sad, _mm_srli_si128(xmm_sad, 8)); + return _mm_cvtsi128_si32(xmm_sad); + } else { - __m128i xmm_left, xmm_top, xmm_top_lo, xmm_left_lo, xmm_predictionDcValue, xmm_predictionDcValue_16; - __m128i xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3, xmm_predictionPtr_0; - if (srcOriginY != 0) - { - xmm_top = _mm_loadl_epi64((__m128i *)(srcPtr - stride)); - } - else - { - xmm_top = _mm_loadl_epi64((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128);// - } + __m128i xmm_left, xmm_top, xmm_top_lo, xmm_left_lo, xmm_predictionDcValue, xmm_predictionDcValue_16; + __m128i xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16_x3, xmm_predictionPtr_0; + if (srcOriginY != 0) + { + xmm_top = _mm_loadl_epi64((__m128i *)(srcPtr - stride)); + } + else + { + xmm_top = _mm_loadl_epi64((__m128i *)(yBorderReverse + topOffset));//_mm_set1_epi8(128);// + } - if (srcOriginX != 0) { - xmm_left = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); - } - else - { - xmm_left = _mm_loadl_epi64((__m128i *)(yBorderReverse + leftOffset)); - } + if (srcOriginX != 0) { + xmm_left = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr); //_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset)); + } + else + { + xmm_left = _mm_loadl_epi64((__m128i *)(yBorderReverse + leftOffset)); + } - xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); - xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); + xmm_top_lo = _mm_unpacklo_epi8(xmm_top, xmm0); + xmm_left_lo = _mm_unpacklo_epi8(xmm_left, xmm0); - xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)), _mm_cvtsi32_si128(8)), 4); - xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_sad_epu8(xmm_top, xmm0), _mm_sad_epu8(xmm_left, xmm0)), _mm_cvtsi32_si128(8)), 4); + xmm_predictionDcValue = _mm_unpacklo_epi8(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi16(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi32(xmm_predictionDcValue, xmm_predictionDcValue); + xmm_predictionDcValue = _mm_unpacklo_epi64(xmm_predictionDcValue, xmm_predictionDcValue); - xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); - xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); + xmm_predictionDcValue_16 = _mm_srli_epi16(xmm_predictionDcValue, 8); + xmm_predictionDcValue = _mm_and_si128(xmm_predictionDcValue, xmm_mask1); - xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); - xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x2 = _mm_add_epi16(xmm_predictionDcValue_16, xmm_predictionDcValue_16); + xmm_predictionDcValue_16_x3 = _mm_add_epi16(xmm_predictionDcValue_16_x2, xmm_predictionDcValue_16); - xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); - xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_top = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); + xmm_left = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(xmm_left_lo, xmm_predictionDcValue_16_x3), xmm_C2), 2); - xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); - xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); + xmm_left = _mm_srli_si128(_mm_packus_epi16(xmm_left, xmm_left), 1); + xmm_top = _mm_and_si128(_mm_packus_epi16(xmm_top, xmm_top), xmm_mask1); - xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); + xmm_predictionPtr_0 = _mm_or_si128(_mm_and_si128(_mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(xmm_top_lo, xmm_left_lo), xmm_predictionDcValue_16_x2), xmm_C2), 2), xmm_mask2), xmm_top); - xmm_sad = _mm_setzero_si128(); + xmm_sad = _mm_setzero_si128(); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), xmm_predictionPtr_0)); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - for (idx = 4; idx < blockSize; idx += 4){ - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); - xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); - xmm_left = _mm_srli_si128(xmm_left, 1); + for (idx = 4; idx < blockSize; idx += 4){ + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + (stride << 1))), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(srcPtr + 3 * stride)), _mm_or_si128(_mm_and_si128(xmm_left, xmm_mask2), xmm_predictionDcValue))); + xmm_left = _mm_srli_si128(xmm_left, 1); - srcPtr += (stride << 2); + srcPtr += (stride << 2); - } + } - return _mm_cvtsi128_si32(xmm_sad); + return _mm_cvtsi128_si32(xmm_sad); - } - } + } + } - /*************************************************************************************************************************************************************************************************************/ - else { - __m256i xmm_sum, xmm_sadleft, xmm_sadtop, xmm_toptmp, xmm_lefttmp, xmm_set, xmm_sum128_2, xmm_sum256, xmm_predictionDcValue; - __m128i xmm_sumhi, xmm_sumlo, xmm_sum1, xmm_sum128, xmm_sumhitmp, xmm_sumlotmp, xmm_movelotmp, xmm_movehitmp; + /*************************************************************************************************************************************************************************************************************/ + else { + __m256i xmm_sum, xmm_sadleft, xmm_sadtop, xmm_toptmp, xmm_lefttmp, xmm_set, xmm_sum128_2, xmm_sum256, xmm_predictionDcValue; + __m128i xmm_sumhi, xmm_sumlo, xmm_sum1, xmm_sum128, xmm_sumhitmp, xmm_sumlotmp, xmm_movelotmp, xmm_movehitmp; - xmm_sumhi = xmm_sumlo = xmm_sum128 = xmm_sumhitmp = xmm_sumlotmp = _mm_setzero_si128(); - xmm_sum = xmm_sadleft = xmm_sadtop = xmm_toptmp = xmm_lefttmp = _mm256_setzero_si256(); + xmm_sumhi = xmm_sumlo = xmm_sum128 = xmm_sumhitmp = xmm_sumlotmp = _mm_setzero_si128(); + xmm_sum = xmm_sadleft = xmm_sadtop = xmm_toptmp = xmm_lefttmp = _mm256_setzero_si256(); - if (srcOriginY != 0) - { - xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(srcPtr - stride + 16)), _mm_loadu_si128((__m128i *)(srcPtr - stride))), xmm1); + if (srcOriginY != 0) + { + xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(srcPtr - stride + 16)), _mm_loadu_si128((__m128i *)(srcPtr - stride))), xmm1); - } - else - { - xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + topOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset))), xmm1); + } + else + { + xmm_toptmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + topOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + topOffset))), xmm1); - } - if (srcOriginX != 0) { - xmm_lefttmp = _mm256_sad_epu8(_mm256_set_epi8(*(readPtr + 31 * stride), *(readPtr + 30 * stride), *(readPtr + 29 * stride), *(readPtr + 28 * stride), *(readPtr + 27 * stride), *(readPtr + 26 * stride), *(readPtr + 25 * stride), *(readPtr + 24 * stride), *(readPtr + 23 * stride), *(readPtr + 22 * stride), *(readPtr + 21 * stride), *(readPtr + 20 * stride), - *(readPtr + 19 * stride), *(readPtr + 18 * stride), *(readPtr + 17 * stride), *(readPtr + 16 * stride), *(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr) - , xmm1); + } + if (srcOriginX != 0) { + xmm_lefttmp = _mm256_sad_epu8(_mm256_set_epi8(*(readPtr + 31 * stride), *(readPtr + 30 * stride), *(readPtr + 29 * stride), *(readPtr + 28 * stride), *(readPtr + 27 * stride), *(readPtr + 26 * stride), *(readPtr + 25 * stride), *(readPtr + 24 * stride), *(readPtr + 23 * stride), *(readPtr + 22 * stride), *(readPtr + 21 * stride), *(readPtr + 20 * stride), + *(readPtr + 19 * stride), *(readPtr + 18 * stride), *(readPtr + 17 * stride), *(readPtr + 16 * stride), *(readPtr + 15 * stride), *(readPtr + 14 * stride), *(readPtr + 13 * stride), *(readPtr + 12 * stride), *(readPtr + 11 * stride), *(readPtr + 10 * stride), *(readPtr + 9 * stride), *(readPtr + 8 * stride), *(readPtr + 7 * stride), *(readPtr + 6 * stride), *(readPtr + 5 * stride), *(readPtr + 4 * stride), *(readPtr + 3 * stride), *(readPtr + 2 * stride), *(readPtr + stride), *readPtr) + , xmm1); - } - else - { - xmm_lefttmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset))), xmm1); + } + else + { + xmm_lefttmp = _mm256_sad_epu8(_mm256_set_m128i(_mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset + 16)), _mm_loadu_si128((__m128i *)(yBorderReverse + leftOffset))), xmm1); - } + } - xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp); - xmm_sum = _mm256_hadd_epi32(xmm_sum, xmm_sum); + xmm_sum = _mm256_add_epi32(xmm_toptmp, xmm_lefttmp); + xmm_sum = _mm256_hadd_epi32(xmm_sum, xmm_sum); - xmm_sumlo = _mm256_extracti128_si256(xmm_sum, 0); - xmm_sumhi = _mm256_extracti128_si256(xmm_sum, 1); + xmm_sumlo = _mm256_extracti128_si256(xmm_sum, 0); + xmm_sumhi = _mm256_extracti128_si256(xmm_sum, 1); - xmm_movelotmp = _mm_move_epi64(xmm_sumlo); - xmm_movehitmp = _mm_move_epi64(xmm_sumhi); + xmm_movelotmp = _mm_move_epi64(xmm_sumlo); + xmm_movehitmp = _mm_move_epi64(xmm_sumhi); - xmm_sum1 = _mm_add_epi32(xmm_movelotmp, xmm_movehitmp); + xmm_sum1 = _mm_add_epi32(xmm_movelotmp, xmm_movehitmp); - xmm_sum1 = _mm_hadd_epi32(xmm_sum1, xmm_sum1); + xmm_sum1 = _mm_hadd_epi32(xmm_sum1, xmm_sum1); - xmm_sum256 = _mm256_castsi128_si256(xmm_sum1); + xmm_sum256 = _mm256_castsi128_si256(xmm_sum1); - xmm_set = _mm256_castsi128_si256(_mm_set1_epi32(32)); + xmm_set = _mm256_castsi128_si256(_mm_set1_epi32(32)); - xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset - xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2, 6); //_mm256_srli_epi32 + xmm_sum128_2 = _mm256_add_epi32(xmm_sum256, xmm_set); // add offset + xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2, 6); //_mm256_srli_epi32 - __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); + __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); - EB_U8 dc = _mm_cvtsi128_si32(dc128); - xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 + EB_U8 dc = _mm_cvtsi128_si32(dc128); + xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 - // SAD - ymm0 = _mm256_setzero_si256(); - for (idx = 0; idx < blockSize; idx += 2) { - ymm0 = _mm256_add_epi32(ymm0, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)srcPtr), xmm_predictionDcValue)); - xmm1 = _mm256_add_epi32(xmm1, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)(srcPtr + stride)), xmm_predictionDcValue)); - srcPtr += stride << 1; - } - ymm0 = _mm256_add_epi32(ymm0, xmm1); - xmm0 = _mm_add_epi32(_mm256_extracti128_si256(ymm0, 0), _mm256_extracti128_si256(ymm0, 1)); - xmm0 = _mm_add_epi32(xmm0, _mm_srli_si128(xmm0, 8)); - return (EB_U32)_mm_cvtsi128_si32(xmm0); + // SAD + ymm0 = _mm256_setzero_si256(); + for (idx = 0; idx < blockSize; idx += 2) { + ymm0 = _mm256_add_epi32(ymm0, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)srcPtr), xmm_predictionDcValue)); + xmm1 = _mm256_add_epi32(xmm1, _mm256_sad_epu8(_mm256_loadu_si256((__m256i*)(srcPtr + stride)), xmm_predictionDcValue)); + srcPtr += stride << 1; + } + ymm0 = _mm256_add_epi32(ymm0, xmm1); + xmm0 = _mm_add_epi32(_mm256_extracti128_si256(ymm0, 0), _mm256_extracti128_si256(ymm0, 1)); + xmm0 = _mm_add_epi32(xmm0, _mm_srli_si128(xmm0, 8)); + return (EB_U32)_mm_cvtsi128_si32(xmm0); - } + } } /*********************************************************************************************************************************************************************************************** @@ -1646,7 +1646,7 @@ void IntraModeAngular_18_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 topLeftOffset = (size << 1); @@ -1655,7 +1655,7 @@ void IntraModeAngular_18_AVX2_INTRIN( if (size == 32) { - EB_U32 count; + EB_U32 count; for (count = 0; count < 8; ++count){ _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset))); @@ -1714,10 +1714,10 @@ void IntraModeAngular_18_AVX2_INTRIN( EB_U32 count; for (count = 0; count < 4; ++count) { - + _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset ))); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 2))); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 4))); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 2))); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 4))); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topLeftOffset - 6))); refSamples -= 8; @@ -1739,7 +1739,7 @@ void IntraModeAngular_18_AVX2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset ))); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 2))); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 4))); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 6))); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topLeftOffset - 6))); } } else { @@ -1758,7 +1758,7 @@ void IntraModeAngular_34_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = ((size << 1) + 1); @@ -1766,13 +1766,13 @@ void IntraModeAngular_34_AVX2_INTRIN( if (!skip) { if (size == 32) { - - EB_U32 count; + + EB_U32 count; for (count = 0; count < 8; ++count){ - - _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 1))); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 2))); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 3))); + + _mm256_storeu_si256((__m256i *)predictionPtr, _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 1))); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 2))); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 3))); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), _mm256_loadu_si256((__m256i *)(refSamples + topOffset + 4))); refSamples += 4; @@ -1851,7 +1851,7 @@ void IntraModeAngular_34_AVX2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 1))); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 3))); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 5))); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 7))); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_loadl_epi64((__m128i *)(refSamples + topOffset + 7))); } } else { @@ -1866,12 +1866,12 @@ void IntraModeVerticalChroma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = (size << 1) + 1; - // Jing: + // Jing: // TODO: add size == 32 for 444 if (!skip) { if (size == 32) { @@ -1887,55 +1887,55 @@ void IntraModeVerticalChroma_AVX2_INTRIN( xmm0 = _mm256_loadu_si256((__m256i *)(refSamples + topOffset)); for (count = 0; count < size_to_write; count ++) { - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); - _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); - - predictionPtr += (pStride << 2); + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); + _mm256_storeu_si256((__m256i *)(predictionPtr), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm0); + _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm0); + + predictionPtr += (pStride << 2); } } else if (size == 16) { - __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else if (size == 8) { - __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); - _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storel_epi64((__m128i *)predictionPtr, xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); + __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); + _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storel_epi64((__m128i *)predictionPtr, xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else { - EB_U32 top = *(EB_U32*)(refSamples + topOffset); + EB_U32 top = *(EB_U32*)(refSamples + topOffset); *(EB_U32*)(predictionPtr) = top; *(EB_U32*)(predictionPtr + pStride) = top; *(EB_U32*)(predictionPtr + 2 * pStride) = top; @@ -1958,28 +1958,28 @@ void IntraModeVerticalChroma_AVX2_INTRIN( } } } else if (size == 16) { - - __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + + __m128i xmm0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)(predictionPtr), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else if (size == 8) { - - __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); - _mm_storel_epi64((__m128i *)predictionPtr, xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); + + __m128i xmm0 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); + _mm_storel_epi64((__m128i *)predictionPtr, xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), xmm0); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), xmm0); } else { - EB_U32 top = *(EB_U32*)(refSamples + topOffset); + EB_U32 top = *(EB_U32*)(refSamples + topOffset); *(EB_U32*)(predictionPtr) = top; *(EB_U32*)(predictionPtr + pStride) = top; } @@ -1991,13 +1991,13 @@ void IntraModeDCChroma_AVX2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { __m128i xmm0 = _mm_setzero_si128(); EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = (size << 1) + 1; EB_U32 leftOffset = 0; - + //Jing: //TODO: add size == 32 for 444 if (!skip) { @@ -2032,7 +2032,7 @@ void IntraModeDCChroma_AVX2_INTRIN( xmm_predictionDcValue = _mm256_srli_epi32(xmm_sum128_2,6); //_mm256_srli_epi32 - __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); + __m128i dc128 = _mm256_castsi256_si128(xmm_predictionDcValue); EB_U8 dc = _mm_cvtsi128_si32 (dc128); xmm_predictionDcValue = _mm256_set1_epi8(dc);//_mm_broadcastb_epi8 @@ -2042,28 +2042,28 @@ void IntraModeDCChroma_AVX2_INTRIN( for (count = 0; count < 2; ++count) { - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); predictionPtr += (pStride << 2); - _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); + _mm256_storeu_si256((__m256i *) predictionPtr, xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 1 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 2 * pStride), xmm_predictionDcValue); _mm256_storeu_si256((__m256i *)(predictionPtr + 3 * pStride), xmm_predictionDcValue); @@ -2072,7 +2072,7 @@ void IntraModeDCChroma_AVX2_INTRIN( } } else if (size == 16) { __m128i sum, predictionDcValue; - + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm0)); @@ -2105,10 +2105,10 @@ void IntraModeDCChroma_AVX2_INTRIN( } else if (size == 8) { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0)); - + predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(8)), 4); predictionDcValue = _mm_unpacklo_epi8(predictionDcValue, predictionDcValue); predictionDcValue = _mm_unpacklo_epi16(predictionDcValue, predictionDcValue); @@ -2126,10 +2126,10 @@ void IntraModeDCChroma_AVX2_INTRIN( } else { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm0)); - + predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(4)), 3); predictionDcValue = _mm_unpacklo_epi8(predictionDcValue, predictionDcValue); predictionDcValue = _mm_unpacklo_epi16(predictionDcValue, predictionDcValue); @@ -2177,8 +2177,8 @@ void IntraModeDCChroma_AVX2_INTRIN( } else if (size == 16) { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm0)); predictionDcValue = _mm_srli_epi32(_mm_add_epi32(_mm_add_epi32(_mm_srli_si128(sum, 8), sum), _mm_cvtsi32_si128(16)), 5); @@ -2199,10 +2199,10 @@ void IntraModeDCChroma_AVX2_INTRIN( } else if (size == 8) { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), xmm0)); - + predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(8)), 4); predictionDcValue = _mm_unpacklo_epi8(predictionDcValue, predictionDcValue); predictionDcValue = _mm_unpacklo_epi16(predictionDcValue, predictionDcValue); @@ -2215,8 +2215,8 @@ void IntraModeDCChroma_AVX2_INTRIN( } else { __m128i sum, predictionDcValue; - - sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), + + sum = _mm_add_epi32(_mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm0), _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)), xmm0)); predictionDcValue = _mm_srli_epi32(_mm_add_epi32(sum, _mm_cvtsi32_si128(4)), 3); diff --git a/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c index 9b80f006e..a5b4101bc 100644 --- a/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbMCP16bit_Intrinsic_AVX2.c @@ -69,201 +69,201 @@ void ChromaInterpolationFilterTwoDOutRaw16bit_AVX2_INTRIN( void ChromaInterpolationFilterOneDOutRaw16bitHorizontal_AVX2_INTRIN( - EB_U16 *refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_U16 *refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; - - __m256i e0, e1, e2, e3; - EB_U32 remain = 0, height = 0; - EB_S16 *dst2, *dst_cpy; - - (void)firstPassIFDst; - (void)fracPosy; - - refPic--; - //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); - - c0 = _mm_loadl_epi64((__m128i *)EbHevcChromaFilterCoeffSR1_AVX[fracPosx]); - c0 = _mm_unpacklo_epi16(c0, c0); - c3 = _mm_shuffle_epi32(c0, 0xff); - c2 = _mm_shuffle_epi32(c0, 0xaa); - c1 = _mm_shuffle_epi32(c0, 0x55); - c0 = _mm_shuffle_epi32(c0, 0x00); - - if (puWidth & 2) { - ptr = refPic; - for (rowCount = 0; rowCount> 1); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); - sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); - sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, sum); - dst += 8; - } - - puWidth -= 2; - if (!puWidth) { - return; - } - refPic += 2; - } - - if (puWidth & 4) { - ptr = refPic; - for (rowCount = 0; rowCount> 1); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(b0, c0)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(b1, c1)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(b3, c3)); - sum = _mm_adds_epi16(sum, _mm_mullo_epi16(b2, c2)); - sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, sum); - dst += 8; - } - - puWidth -= 4; - if (puWidth == 0) { - return; - } - refPic += 4; - } - - e0 = _mm256_insertf128_si256(_mm256_castsi128_si256(c0), c0, 1); - e1 = _mm256_insertf128_si256(_mm256_castsi128_si256(c1), c1, 1); - e2 = _mm256_insertf128_si256(_mm256_castsi128_si256(c2), c2, 1); - e3 = _mm256_insertf128_si256(_mm256_castsi128_si256(c3), c3, 1); - - if (puWidth >= 16 && !(puWidth & 15)) { - dst_cpy = dst; - - for (colCount = 0; colCount> 1); - ptr += srcStride; - - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); - sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); - sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, _mm256_castsi256_si128(sum1)); - _mm_storeu_si128((__m128i *)dst2, _mm256_extracti128_si256(sum1, 1)); // suboptimal code-gen of a cross-lane shuffle by MSVC, no way to fix - dst += 8; - dst2 += 8; - } - refPic += 16; - } - } - else { - remain = puHeight & 1; - height = puHeight - remain; - - for (colCount = 0; colCount < puWidth; colCount += 8) { - ptr = refPic; - for (rowCount = 0; rowCount < height; rowCount += 2) { - __m256i d0 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)ptr)); - __m256i d1 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 1))); - __m256i d2 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 2))); - __m256i d3 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 3))); - __m256i sum1 = _mm256_set1_epi16(OFFSET2D1_10BIT >> 1); - ptr += srcStride; - - { // fixing MSVC code-gen of reg-mem VINSERT instructions - EB_U16 *ptr_ = ptr; - ptr += srcStride; - d0 = _mm256_inserti128_si256(d0, _mm_loadu_si128((__m128i *)ptr_), 1); - d1 = _mm256_inserti128_si256(d1, _mm_loadu_si128((__m128i *)(ptr_ + 1)), 1); - d2 = _mm256_inserti128_si256(d2, _mm_loadu_si128((__m128i *)(ptr_ + 2)), 1); - d3 = _mm256_inserti128_si256(d3, _mm_loadu_si128((__m128i *)(ptr_ + 3)), 1); - } - - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); - sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); - sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); - sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); - - _mm256_storeu_si256((__m256i *)dst, sum1); - dst += 16; - } - - for (rowCount = 0; rowCount < remain; rowCount++) { - a0 = _mm_loadu_si128((__m128i *)ptr); - a1 = _mm_loadu_si128((__m128i *)(ptr + 1)); - a2 = _mm_loadu_si128((__m128i *)(ptr + 2)); - a3 = _mm_loadu_si128((__m128i *)(ptr + 3)); - ptr += srcStride; - - sum = _mm_set1_epi16(OFFSET2D1_10BIT >> 1); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); - sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); - sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); - sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); - - _mm_storeu_si128((__m128i *)dst, sum); - dst += 8; - } - refPic += 8; - } - } + EB_U32 rowCount, colCount; + EB_U16 *ptr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; + + __m256i e0, e1, e2, e3; + EB_U32 remain = 0, height = 0; + EB_S16 *dst2, *dst_cpy; + + (void)firstPassIFDst; + (void)fracPosy; + + refPic--; + //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); + + c0 = _mm_loadl_epi64((__m128i *)EbHevcChromaFilterCoeffSR1_AVX[fracPosx]); + c0 = _mm_unpacklo_epi16(c0, c0); + c3 = _mm_shuffle_epi32(c0, 0xff); + c2 = _mm_shuffle_epi32(c0, 0xaa); + c1 = _mm_shuffle_epi32(c0, 0x55); + c0 = _mm_shuffle_epi32(c0, 0x00); + + if (puWidth & 2) { + ptr = refPic; + for (rowCount = 0; rowCount> 1); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); + sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); + sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, sum); + dst += 8; + } + + puWidth -= 2; + if (!puWidth) { + return; + } + refPic += 2; + } + + if (puWidth & 4) { + ptr = refPic; + for (rowCount = 0; rowCount> 1); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(b0, c0)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(b1, c1)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(b3, c3)); + sum = _mm_adds_epi16(sum, _mm_mullo_epi16(b2, c2)); + sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, sum); + dst += 8; + } + + puWidth -= 4; + if (puWidth == 0) { + return; + } + refPic += 4; + } + + e0 = _mm256_insertf128_si256(_mm256_castsi128_si256(c0), c0, 1); + e1 = _mm256_insertf128_si256(_mm256_castsi128_si256(c1), c1, 1); + e2 = _mm256_insertf128_si256(_mm256_castsi128_si256(c2), c2, 1); + e3 = _mm256_insertf128_si256(_mm256_castsi128_si256(c3), c3, 1); + + if (puWidth >= 16 && !(puWidth & 15)) { + dst_cpy = dst; + + for (colCount = 0; colCount> 1); + ptr += srcStride; + + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); + sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); + sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, _mm256_castsi256_si128(sum1)); + _mm_storeu_si128((__m128i *)dst2, _mm256_extracti128_si256(sum1, 1)); // suboptimal code-gen of a cross-lane shuffle by MSVC, no way to fix + dst += 8; + dst2 += 8; + } + refPic += 16; + } + } + else { + remain = puHeight & 1; + height = puHeight - remain; + + for (colCount = 0; colCount < puWidth; colCount += 8) { + ptr = refPic; + for (rowCount = 0; rowCount < height; rowCount += 2) { + __m256i d0 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)ptr)); + __m256i d1 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 1))); + __m256i d2 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 2))); + __m256i d3 = _mm256_castsi128_si256(_mm_loadu_si128((__m128i *)(ptr + 3))); + __m256i sum1 = _mm256_set1_epi16(OFFSET2D1_10BIT >> 1); + ptr += srcStride; + + { // fixing MSVC code-gen of reg-mem VINSERT instructions + EB_U16 *ptr_ = ptr; + ptr += srcStride; + d0 = _mm256_inserti128_si256(d0, _mm_loadu_si128((__m128i *)ptr_), 1); + d1 = _mm256_inserti128_si256(d1, _mm_loadu_si128((__m128i *)(ptr_ + 1)), 1); + d2 = _mm256_inserti128_si256(d2, _mm_loadu_si128((__m128i *)(ptr_ + 2)), 1); + d3 = _mm256_inserti128_si256(d3, _mm_loadu_si128((__m128i *)(ptr_ + 3)), 1); + } + + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d0, e0)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d1, e1)); + sum1 = _mm256_add_epi16(sum1, _mm256_mullo_epi16(d3, e3)); + sum1 = _mm256_adds_epi16(sum1, _mm256_mullo_epi16(d2, e2)); + sum1 = _mm256_srai_epi16(sum1, SHIFT2D1_10BIT - 1); + + _mm256_storeu_si256((__m256i *)dst, sum1); + dst += 16; + } + + for (rowCount = 0; rowCount < remain; rowCount++) { + a0 = _mm_loadu_si128((__m128i *)ptr); + a1 = _mm_loadu_si128((__m128i *)(ptr + 1)); + a2 = _mm_loadu_si128((__m128i *)(ptr + 2)); + a3 = _mm_loadu_si128((__m128i *)(ptr + 3)); + ptr += srcStride; + + sum = _mm_set1_epi16(OFFSET2D1_10BIT >> 1); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a0, c0)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a1, c1)); + sum = _mm_add_epi16(sum, _mm_mullo_epi16(a3, c3)); + sum = _mm_adds_epi16(sum, _mm_mullo_epi16(a2, c2)); + sum = _mm_srai_epi16(sum, SHIFT2D1_10BIT - 1); + + _mm_storeu_si128((__m128i *)dst, sum); + dst += 8; + } + refPic += 8; + } + } } diff --git a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c index 31c487f81..69a9768f7 100644 --- a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c +++ b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.c @@ -10,243 +10,243 @@ #include "EbUtility.h" EB_EXTERN EB_ALIGN(16) const EB_U8 EbHevcFilterType[] = { - 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4 + 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4 }; EB_EXTERN EB_ALIGN(16) const EB_U8 EbHevcWeakChromafilter[2][32] = { - { 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4 }, - { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 }, + { 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4 }, + { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 }, }; inline void lumaWeakFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - EB_U8 *ptrDenoised, - EB_U8 *ptrNoise - ) + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + EB_U8 *ptrDenoised, + EB_U8 *ptrNoise + ) { - __m256i topFirstHalf, bottomFirstHalf, - filterFirstHalf, filterSecondHalf, - currNextFirstHalf, currNextSecondHalf, - weights, currLeftMidFirstHalfWeight, - currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, - topPermutation, bottomPermutation; - - currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); - currPermutation = _mm256_permute4x64_epi64(curr, 216); - currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); - weights = _mm256_loadu_si256((__m256i*)EbHevcFilterType); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); - currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); - currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); - - currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); - currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); - currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); - - - topPermutation = _mm256_permute4x64_epi64(top, 216); - topFirstHalf = _mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()); - bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); - bottomFirstHalf = _mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()); - filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalflo); - filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 3); - - - topFirstHalf = _mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()); - bottomFirstHalf = _mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()); - filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalfhi); - filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 3); - - filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); - _mm256_storeu_si256((__m256i *)(ptrDenoised ), filterFirstHalf); - - _mm256_storeu_si256((__m256i *)(ptrNoise), _mm256_subs_epu8(curr, filterFirstHalf)); + __m256i topFirstHalf, bottomFirstHalf, + filterFirstHalf, filterSecondHalf, + currNextFirstHalf, currNextSecondHalf, + weights, currLeftMidFirstHalfWeight, + currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, + topPermutation, bottomPermutation; + + currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); + currPermutation = _mm256_permute4x64_epi64(curr, 216); + currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); + weights = _mm256_loadu_si256((__m256i*)EbHevcFilterType); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); + currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); + currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); + + currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); + currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); + currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); + + + topPermutation = _mm256_permute4x64_epi64(top, 216); + topFirstHalf = _mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()); + bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); + bottomFirstHalf = _mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()); + filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalflo); + filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 3); + + + topFirstHalf = _mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()); + bottomFirstHalf = _mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()); + filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomFirstHalf, topFirstHalf), currLeftMidFirstHalfhi); + filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 3); + + filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); + _mm256_storeu_si256((__m256i *)(ptrDenoised ), filterFirstHalf); + + _mm256_storeu_si256((__m256i *)(ptrNoise), _mm256_subs_epu8(curr, filterFirstHalf)); } inline void chromaWeakLumaStrongFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised - ) + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised + ) { - __m256i filterFirstHalf, filterSecondHalf, - currNextFirstHalf, currNextSecondHalf, - weights, currLeftMidFirstHalfWeight, - currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, - topPermutation, bottomPermutation, - topPrevPermutation, topLeftMidFirstHalflo, topLeftMidFirstHalfWeight, topNextFirstHalf, - topNextPermutation, topLeftMidFirstHalfhi, topNextSecondHalf, - bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomLeftMidFirstHalfWeight, bottomNextPermutation, - bottomNextFirstHalf, bottomLeftMidFirstHalfhi, bottomNextSecondHalf; - - - // Curr - currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); - currPermutation = _mm256_permute4x64_epi64(curr, 216); - currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); - weights = _mm256_loadu_si256((__m256i*)EbHevcWeakChromafilter[0]); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); - currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); - currNextFirstHalf = _mm256_slli_epi16(currNextFirstHalf, 1); - currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); - - currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); - currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); - currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); - currNextSecondHalf = _mm256_slli_epi16(currNextSecondHalf, 1); - currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); - - // Top - topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); - topPermutation = _mm256_permute4x64_epi64(top, 216); - topLeftMidFirstHalflo = _mm256_unpacklo_epi8(topPrevPermutation, topPermutation); - weights = _mm256_loadu_si256((__m256i*)EbHevcWeakChromafilter[1]); - topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalflo, weights); - topNextPermutation = _mm256_permute4x64_epi64(topNext, 88); - topNextFirstHalf = _mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()); - topLeftMidFirstHalflo = _mm256_add_epi16(topNextFirstHalf, topLeftMidFirstHalfWeight); - - topLeftMidFirstHalfhi = _mm256_unpackhi_epi8(topPrevPermutation, topPermutation); - topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalfhi, weights); - topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); - topNextSecondHalf = _mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()); - topLeftMidFirstHalfhi = _mm256_add_epi16(topNextSecondHalf, topLeftMidFirstHalfWeight); - - - // Bottom - bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); - bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); - bottomLeftMidFirstHalflo = _mm256_unpacklo_epi8(bottomPrevPermutation, bottomPermutation); - weights = _mm256_loadu_si256((__m256i*)EbHevcWeakChromafilter[1]); - bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalflo, weights); - bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 88); - bottomNextFirstHalf = _mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()); - bottomLeftMidFirstHalflo = _mm256_add_epi16(bottomNextFirstHalf, bottomLeftMidFirstHalfWeight); - - bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi8(bottomPrevPermutation, bottomPermutation); - bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalfhi, weights); - bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); - bottomNextSecondHalf = _mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()); - bottomLeftMidFirstHalfhi = _mm256_add_epi16(bottomNextSecondHalf, bottomLeftMidFirstHalfWeight); - - - filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalflo, topLeftMidFirstHalflo), currLeftMidFirstHalflo); - filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 4); - filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalfhi, topLeftMidFirstHalfhi), currLeftMidFirstHalfhi); - filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 4); - - - filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); - _mm256_storeu_si256((__m256i *)(ptrDenoised), filterFirstHalf); + __m256i filterFirstHalf, filterSecondHalf, + currNextFirstHalf, currNextSecondHalf, + weights, currLeftMidFirstHalfWeight, + currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, + topPermutation, bottomPermutation, + topPrevPermutation, topLeftMidFirstHalflo, topLeftMidFirstHalfWeight, topNextFirstHalf, + topNextPermutation, topLeftMidFirstHalfhi, topNextSecondHalf, + bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomLeftMidFirstHalfWeight, bottomNextPermutation, + bottomNextFirstHalf, bottomLeftMidFirstHalfhi, bottomNextSecondHalf; + + + // Curr + currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); + currPermutation = _mm256_permute4x64_epi64(curr, 216); + currLeftMidFirstHalflo = _mm256_unpacklo_epi8(currPrevPermutation, currPermutation); + weights = _mm256_loadu_si256((__m256i*)EbHevcWeakChromafilter[0]); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalflo, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 88); + currNextFirstHalf = _mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()); + currNextFirstHalf = _mm256_slli_epi16(currNextFirstHalf, 1); + currLeftMidFirstHalflo = _mm256_add_epi16(currNextFirstHalf, currLeftMidFirstHalfWeight); + + currLeftMidFirstHalfhi = _mm256_unpackhi_epi8(currPrevPermutation, currPermutation); + currLeftMidFirstHalfWeight = _mm256_maddubs_epi16(currLeftMidFirstHalfhi, weights); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); + currNextSecondHalf = _mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()); + currNextSecondHalf = _mm256_slli_epi16(currNextSecondHalf, 1); + currLeftMidFirstHalfhi = _mm256_add_epi16(currNextSecondHalf, currLeftMidFirstHalfWeight); + + // Top + topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); + topPermutation = _mm256_permute4x64_epi64(top, 216); + topLeftMidFirstHalflo = _mm256_unpacklo_epi8(topPrevPermutation, topPermutation); + weights = _mm256_loadu_si256((__m256i*)EbHevcWeakChromafilter[1]); + topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalflo, weights); + topNextPermutation = _mm256_permute4x64_epi64(topNext, 88); + topNextFirstHalf = _mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()); + topLeftMidFirstHalflo = _mm256_add_epi16(topNextFirstHalf, topLeftMidFirstHalfWeight); + + topLeftMidFirstHalfhi = _mm256_unpackhi_epi8(topPrevPermutation, topPermutation); + topLeftMidFirstHalfWeight = _mm256_maddubs_epi16(topLeftMidFirstHalfhi, weights); + topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); + topNextSecondHalf = _mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()); + topLeftMidFirstHalfhi = _mm256_add_epi16(topNextSecondHalf, topLeftMidFirstHalfWeight); + + + // Bottom + bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); + bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); + bottomLeftMidFirstHalflo = _mm256_unpacklo_epi8(bottomPrevPermutation, bottomPermutation); + weights = _mm256_loadu_si256((__m256i*)EbHevcWeakChromafilter[1]); + bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalflo, weights); + bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 88); + bottomNextFirstHalf = _mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()); + bottomLeftMidFirstHalflo = _mm256_add_epi16(bottomNextFirstHalf, bottomLeftMidFirstHalfWeight); + + bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi8(bottomPrevPermutation, bottomPermutation); + bottomLeftMidFirstHalfWeight = _mm256_maddubs_epi16(bottomLeftMidFirstHalfhi, weights); + bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); + bottomNextSecondHalf = _mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()); + bottomLeftMidFirstHalfhi = _mm256_add_epi16(bottomNextSecondHalf, bottomLeftMidFirstHalfWeight); + + + filterFirstHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalflo, topLeftMidFirstHalflo), currLeftMidFirstHalflo); + filterFirstHalf = _mm256_srli_epi16(filterFirstHalf, 4); + filterSecondHalf = _mm256_adds_epi16(_mm256_adds_epi16(bottomLeftMidFirstHalfhi, topLeftMidFirstHalfhi), currLeftMidFirstHalfhi); + filterSecondHalf = _mm256_srli_epi16(filterSecondHalf, 4); + + + filterFirstHalf = _mm256_permute4x64_epi64(_mm256_packus_epi16(filterFirstHalf, filterSecondHalf), 216); + _mm256_storeu_si256((__m256i *)(ptrDenoised), filterFirstHalf); } inline void ChromaStrong_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised - ) + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised + ) { - __m256i currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, - topPermutation, topPrevPermutation, topLeftMidFirstHalflo, topNextPermutation, topLeftMidFirstHalfhi, - bottomPermutation, bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomNextPermutation, bottomLeftMidFirstHalfhi; + __m256i currLeftMidFirstHalflo, currLeftMidFirstHalfhi, currPrevPermutation, currPermutation, currNextPermutation, + topPermutation, topPrevPermutation, topLeftMidFirstHalflo, topNextPermutation, topLeftMidFirstHalfhi, + bottomPermutation, bottomPrevPermutation, bottomLeftMidFirstHalflo, bottomNextPermutation, bottomLeftMidFirstHalfhi; - currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); - currPermutation = _mm256_permute4x64_epi64(curr, 216); - currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); + currPrevPermutation = _mm256_permute4x64_epi64(currPrev, 216); + currPermutation = _mm256_permute4x64_epi64(curr, 216); + currNextPermutation = _mm256_permute4x64_epi64(currNext, 216); - currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currPermutation, _mm256_setzero_si256()), - _mm256_unpacklo_epi8(currPrevPermutation, _mm256_setzero_si256())); - currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalflo); + currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currPermutation, _mm256_setzero_si256()), + _mm256_unpacklo_epi8(currPrevPermutation, _mm256_setzero_si256())); + currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalflo); - currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currPermutation, _mm256_setzero_si256()), - _mm256_unpackhi_epi8(currPrevPermutation, _mm256_setzero_si256())); - currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalfhi); + currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currPermutation, _mm256_setzero_si256()), + _mm256_unpackhi_epi8(currPrevPermutation, _mm256_setzero_si256())); + currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(currNextPermutation, _mm256_setzero_si256()), currLeftMidFirstHalfhi); - topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); - topPermutation = _mm256_permute4x64_epi64(top, 216); - topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); + topPrevPermutation = _mm256_permute4x64_epi64(topPrev, 216); + topPermutation = _mm256_permute4x64_epi64(top, 216); + topNextPermutation = _mm256_permute4x64_epi64(topNext, 216); - topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()), - _mm256_unpacklo_epi8(topPrevPermutation, _mm256_setzero_si256())); - topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalflo); + topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topPermutation, _mm256_setzero_si256()), + _mm256_unpacklo_epi8(topPrevPermutation, _mm256_setzero_si256())); + topLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalflo); - topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()), - _mm256_unpackhi_epi8(topPrevPermutation, _mm256_setzero_si256())); - topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalfhi); + topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topPermutation, _mm256_setzero_si256()), + _mm256_unpackhi_epi8(topPrevPermutation, _mm256_setzero_si256())); + topLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(topNextPermutation, _mm256_setzero_si256()), topLeftMidFirstHalfhi); - bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); - bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); - bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); + bottomPrevPermutation = _mm256_permute4x64_epi64(bottomPrev, 216); + bottomPermutation = _mm256_permute4x64_epi64(bottom, 216); + bottomNextPermutation = _mm256_permute4x64_epi64(bottomNext, 216); - bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()), - _mm256_unpacklo_epi8(bottomPrevPermutation, _mm256_setzero_si256())); - bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalflo); + bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomPermutation, _mm256_setzero_si256()), + _mm256_unpacklo_epi8(bottomPrevPermutation, _mm256_setzero_si256())); + bottomLeftMidFirstHalflo = _mm256_add_epi16(_mm256_unpacklo_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalflo); - bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()), - _mm256_unpackhi_epi8(bottomPrevPermutation, _mm256_setzero_si256())); - bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalfhi); + bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomPermutation, _mm256_setzero_si256()), + _mm256_unpackhi_epi8(bottomPrevPermutation, _mm256_setzero_si256())); + bottomLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_unpackhi_epi8(bottomNextPermutation, _mm256_setzero_si256()), bottomLeftMidFirstHalfhi); - currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalflo, topLeftMidFirstHalflo), bottomLeftMidFirstHalflo); - currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalfhi, topLeftMidFirstHalfhi), bottomLeftMidFirstHalfhi); + currLeftMidFirstHalflo = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalflo, topLeftMidFirstHalflo), bottomLeftMidFirstHalflo); + currLeftMidFirstHalfhi = _mm256_add_epi16(_mm256_add_epi16(currLeftMidFirstHalfhi, topLeftMidFirstHalfhi), bottomLeftMidFirstHalfhi); - topLeftMidFirstHalflo = _mm256_unpacklo_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); - topLeftMidFirstHalflo = _mm256_mullo_epi32(topLeftMidFirstHalflo, _mm256_set1_epi32(7282)); - topLeftMidFirstHalflo = _mm256_srli_epi32(topLeftMidFirstHalflo, 16); - bottomLeftMidFirstHalflo = _mm256_unpackhi_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); - bottomLeftMidFirstHalflo = _mm256_mullo_epi32(bottomLeftMidFirstHalflo, _mm256_set1_epi32(7282)); - bottomLeftMidFirstHalflo = _mm256_srli_epi32(bottomLeftMidFirstHalflo, 16); - currLeftMidFirstHalflo = _mm256_packus_epi32(topLeftMidFirstHalflo, bottomLeftMidFirstHalflo); + topLeftMidFirstHalflo = _mm256_unpacklo_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); + topLeftMidFirstHalflo = _mm256_mullo_epi32(topLeftMidFirstHalflo, _mm256_set1_epi32(7282)); + topLeftMidFirstHalflo = _mm256_srli_epi32(topLeftMidFirstHalflo, 16); + bottomLeftMidFirstHalflo = _mm256_unpackhi_epi16(currLeftMidFirstHalflo, _mm256_setzero_si256()); + bottomLeftMidFirstHalflo = _mm256_mullo_epi32(bottomLeftMidFirstHalflo, _mm256_set1_epi32(7282)); + bottomLeftMidFirstHalflo = _mm256_srli_epi32(bottomLeftMidFirstHalflo, 16); + currLeftMidFirstHalflo = _mm256_packus_epi32(topLeftMidFirstHalflo, bottomLeftMidFirstHalflo); - currLeftMidFirstHalflo = _mm256_insertf128_si256(_mm256_setzero_si256(), _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalflo, 0), _mm256_extracti128_si256(currLeftMidFirstHalflo, 1)), 0); + currLeftMidFirstHalflo = _mm256_insertf128_si256(_mm256_setzero_si256(), _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalflo, 0), _mm256_extracti128_si256(currLeftMidFirstHalflo, 1)), 0); - topLeftMidFirstHalfhi = _mm256_unpacklo_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); - topLeftMidFirstHalfhi = _mm256_mullo_epi32(topLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); - topLeftMidFirstHalfhi = _mm256_srli_epi32(topLeftMidFirstHalfhi, 16); + topLeftMidFirstHalfhi = _mm256_unpacklo_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); + topLeftMidFirstHalfhi = _mm256_mullo_epi32(topLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); + topLeftMidFirstHalfhi = _mm256_srli_epi32(topLeftMidFirstHalfhi, 16); - bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); - bottomLeftMidFirstHalfhi = _mm256_mullo_epi32(bottomLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); - bottomLeftMidFirstHalfhi = _mm256_srli_epi32(bottomLeftMidFirstHalfhi, 16); - currLeftMidFirstHalfhi = _mm256_packus_epi32(topLeftMidFirstHalfhi, bottomLeftMidFirstHalfhi); + bottomLeftMidFirstHalfhi = _mm256_unpackhi_epi16(currLeftMidFirstHalfhi, _mm256_setzero_si256()); + bottomLeftMidFirstHalfhi = _mm256_mullo_epi32(bottomLeftMidFirstHalfhi, _mm256_set1_epi32(7282)); + bottomLeftMidFirstHalfhi = _mm256_srli_epi32(bottomLeftMidFirstHalfhi, 16); + currLeftMidFirstHalfhi = _mm256_packus_epi32(topLeftMidFirstHalfhi, bottomLeftMidFirstHalfhi); - currLeftMidFirstHalflo = _mm256_insertf128_si256(currLeftMidFirstHalflo, _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalfhi, 0), _mm256_extracti128_si256(currLeftMidFirstHalfhi, 1)), 1); - _mm256_storeu_si256((__m256i *)(ptrDenoised), currLeftMidFirstHalflo); + currLeftMidFirstHalflo = _mm256_insertf128_si256(currLeftMidFirstHalflo, _mm_packus_epi16(_mm256_extracti128_si256(currLeftMidFirstHalfhi, 0), _mm256_extracti128_si256(currLeftMidFirstHalfhi, 1)), 1); + _mm256_storeu_si256((__m256i *)(ptrDenoised), currLeftMidFirstHalflo); } @@ -255,293 +255,293 @@ inline void ChromaStrong_AVX2_INTRIN( * weak filter Luma and store noise. *******************************************/ void noiseExtractLumaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; - - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised, *ptrDenoisedInterm; - - EB_U8 *ptrNoise, *ptrNoiseInterm; - EB_U32 strideOut; - - __m256i top, curr, bottom, currPrev, currNext, - secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; - (void)lcuOriginX; - - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; - - noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - ptrNoiseInterm = ptrNoise; - - ////Luma - //a = (p[1] + - // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + - // p[1 + 2 * stride]) / 8; - - top = curr = secondtop = secondcurr = _mm256_setzero_si256(); - - for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) - { - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); - _mm256_storeu_si256((__m256i *)(ptrNoise + kk), _mm256_setzero_si256()); - _mm256_storeu_si256((__m256i *)(ptrNoise + kk + 32), _mm256_setzero_si256()); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - ptrNoiseInterm = ptrNoise + kk + ((1 + jj)*strideOut); - - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj *strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn - strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn - strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - ptrNoiseInterm = ptrNoise + kk + jj*strideOut; - - } - - lumaWeakFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - ptrDenoisedInterm, - ptrNoiseInterm); - - lumaWeakFilter_AVX2_INTRIN( - secondtop, - secondcurr, - secondbottom, - secondcurrPrev, - secondcurrNext, - ptrDenoisedInterm + 32, - ptrNoiseInterm + 32); - - top = curr; - curr = bottom; - secondtop = secondcurr; - secondcurr = secondbottom; - - } - - - } - - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ - - if (!((jj0 && ii < picWidth - 1)){ - - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } - - } - } - - } + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; + + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised, *ptrDenoisedInterm; + + EB_U8 *ptrNoise, *ptrNoiseInterm; + EB_U32 strideOut; + + __m256i top, curr, bottom, currPrev, currNext, + secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; + (void)lcuOriginX; + + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; + + noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + ptrNoiseInterm = ptrNoise; + + ////Luma + //a = (p[1] + + // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + + // p[1 + 2 * stride]) / 8; + + top = curr = secondtop = secondcurr = _mm256_setzero_si256(); + + for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) + { + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); + _mm256_storeu_si256((__m256i *)(ptrNoise + kk), _mm256_setzero_si256()); + _mm256_storeu_si256((__m256i *)(ptrNoise + kk + 32), _mm256_setzero_si256()); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + ptrNoiseInterm = ptrNoise + kk + ((1 + jj)*strideOut); + + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj *strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) - 1 + ((1 + jj)*strideIn - strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + 1 + ((1 + jj)*strideIn - strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + ptrNoiseInterm = ptrNoise + kk + jj*strideOut; + + } + + lumaWeakFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + ptrDenoisedInterm, + ptrNoiseInterm); + + lumaWeakFilter_AVX2_INTRIN( + secondtop, + secondcurr, + secondbottom, + secondcurrPrev, + secondcurrNext, + ptrDenoisedInterm + 32, + ptrNoiseInterm + 32); + + top = curr; + curr = bottom; + secondtop = secondcurr; + secondcurr = secondbottom; + + } + + + } + + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ + + if (!((jj0 && ii < picWidth - 1)){ + + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } + + } + } + + } } void noiseExtractLumaWeakLcu_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth, lcuWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; - - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised, *ptrDenoisedInterm; - - EB_U8 *ptrNoise, *ptrNoiseInterm; - EB_U32 strideOut; - - __m256i top, curr, bottom, currPrev, currNext, - secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; - (void)lcuOriginX; - - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); - lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - - inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; - - noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - ptrNoiseInterm = ptrNoise; - - ////Luma - //a = (p[1] + - // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + - // p[1 + 2 * stride]) / 8; - - top = curr = secondtop = secondcurr = _mm256_setzero_si256(); - - //for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) - { - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn)); - _mm256_storeu_si256((__m256i *)(ptrDenoised ), top); - _mm256_storeu_si256((__m256i *)(ptrDenoised + 32), secondtop); - _mm256_storeu_si256((__m256i *)(ptrNoise ), _mm256_setzero_si256()); - _mm256_storeu_si256((__m256i *)(ptrNoise + 32), _mm256_setzero_si256()); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut); - ptrNoiseInterm = ptrNoise + ((1 + jj)*strideOut); - - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn - strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj *strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn - strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn - strideIn)); - } - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn - strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn - strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn - strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn - strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut - strideOut); - ptrNoiseInterm = ptrNoise + jj*strideOut; - - } - - lumaWeakFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - ptrDenoisedInterm, - ptrNoiseInterm); - - lumaWeakFilter_AVX2_INTRIN( - secondtop, - secondcurr, - secondbottom, - secondcurrPrev, - secondcurrNext, - ptrDenoisedInterm + 32, - ptrNoiseInterm + 32); - - top = curr; - curr = bottom; - secondtop = secondcurr; - secondcurr = secondbottom; - - } - - - } - - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < lcuWidth; ii++){ - - if (!((jj>0 || lcuOriginY>0) && (jj0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1)){ - - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } - - } - } - - } + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth, lcuWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; + + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised, *ptrDenoisedInterm; + + EB_U8 *ptrNoise, *ptrNoiseInterm; + EB_U32 strideOut; + + __m256i top, curr, bottom, currPrev, currNext, + secondtop, secondcurr, secondbottom, secondcurrPrev, secondcurrNext; + (void)lcuOriginX; + + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); + lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + + inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; + + noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + ptrNoiseInterm = ptrNoise; + + ////Luma + //a = (p[1] + + // p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + + // p[1 + 2 * stride]) / 8; + + top = curr = secondtop = secondcurr = _mm256_setzero_si256(); + + //for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) + { + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn)); + _mm256_storeu_si256((__m256i *)(ptrDenoised ), top); + _mm256_storeu_si256((__m256i *)(ptrDenoised + 32), secondtop); + _mm256_storeu_si256((__m256i *)(ptrNoise ), _mm256_setzero_si256()); + _mm256_storeu_si256((__m256i *)(ptrNoise + 32), _mm256_setzero_si256()); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut); + ptrNoiseInterm = ptrNoise + ((1 + jj)*strideOut); + + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + jj*strideIn - strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + 32 + jj *strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + (1 + jj)*strideIn - strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (1 + jj)*strideIn - strideIn)); + } + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + ((1 + jj)*strideIn - strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)((ptrIn + 32) - 1 + ((1 + jj)*strideIn - strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + 1 + ((1 + jj)*strideIn - strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn ) + (2 + jj)* strideIn - strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + 32) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + ((1 + jj)*strideOut - strideOut); + ptrNoiseInterm = ptrNoise + jj*strideOut; + + } + + lumaWeakFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + ptrDenoisedInterm, + ptrNoiseInterm); + + lumaWeakFilter_AVX2_INTRIN( + secondtop, + secondcurr, + secondbottom, + secondcurrPrev, + secondcurrNext, + ptrDenoisedInterm + 32, + ptrNoiseInterm + 32); + + top = curr; + curr = bottom; + secondtop = secondcurr; + secondcurr = secondbottom; + + } + + + } + + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < lcuWidth; ii++){ + + if (!((jj>0 || lcuOriginY>0) && (jj0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1)){ + + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } + + } + } + + } } /******************************************* @@ -549,173 +549,173 @@ void noiseExtractLumaWeakLcu_AVX2_INTRIN( * strong filter Luma. *******************************************/ void noiseExtractLumaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised, *ptrDenoisedInterm; - - EB_U32 strideOut; - __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, - secondtop, secondcurr, secondcurrPrev, secondcurrNext, secondbottom, secondtopPrev, secondtopNext, secondbottomPrev, secondbottomNext; - (void)lcuOriginX; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; - - - top = curr = secondtop = secondcurr = topNext = topPrev = currNext = currPrev = secondcurrPrev = secondcurrNext = secondtopPrev = secondtopNext = _mm256_setzero_si256(); - for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) - { - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); - - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); - - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); - secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn))); - - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); - secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn))); - - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn))); - - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn))); - - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); - secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn))); - - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); - secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn))); - - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); - secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn) - strideIn)); - - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); - secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn) - strideIn)); - - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); - - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); - secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); - - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); - secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); - - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); - - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - - } - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - topPrev, - topNext, - bottomPrev, - bottomNext, - ptrDenoisedInterm); - - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - secondtop, - secondcurr, - secondbottom, - secondcurrPrev, - secondcurrNext, - secondtopPrev, - secondtopNext, - secondbottomPrev, - secondbottomNext, - ptrDenoisedInterm + 32); - - - top = curr; - curr = bottom; - topPrev = currPrev; - topNext = currNext; - currPrev = bottomPrev; - currNext = bottomNext; - secondtop = secondcurr; - secondcurr = secondbottom; - secondtopPrev = secondcurrPrev; - secondtopNext = secondcurrNext; - secondcurrPrev = secondbottomPrev; - secondcurrNext = secondbottomNext; - - } - - - } - - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ - - if (!((jj0 && ii < picWidth - 1)){ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } - - } - } - - } + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised, *ptrDenoisedInterm; + + EB_U32 strideOut; + __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, + secondtop, secondcurr, secondcurrPrev, secondcurrNext, secondbottom, secondtopPrev, secondtopNext, secondbottomPrev, secondbottomNext; + (void)lcuOriginX; + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + lcuHeight = ((lcuOriginY + MAX_LCU_SIZE >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; + + + top = curr = secondtop = secondcurr = topNext = topPrev = currNext = currPrev = secondcurrPrev = secondcurrNext = secondtopPrev = secondtopNext = _mm256_setzero_si256(); + for (kk = 0; kk + MAX_LCU_SIZE <= picWidth; kk += MAX_LCU_SIZE) + { + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn)); + + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn)); + + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); + secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn))); + + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); + secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn))); + + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn))); + + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn))); + + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk + 32), secondtop); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); + secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn))); + + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); + secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn))); + + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + secondtop = _mm256_loadu_si256((__m256i*)(ptrIn + kk + 32 + jj*strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + secondcurr = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (1 + jj)*strideIn - strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); + secondtopPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((jj)*strideIn) - strideIn)); + + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); + secondtopNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((jj)*strideIn) - strideIn)); + + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + secondcurrPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); + + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + secondcurrNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((1 + jj)*strideIn - strideIn))); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); + secondbottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); + + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); + secondbottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + 32 + ((2 + jj)*strideIn - strideIn))); + + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + secondbottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk + 32) + (2 + jj)* strideIn - strideIn)); + + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + + } + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + topPrev, + topNext, + bottomPrev, + bottomNext, + ptrDenoisedInterm); + + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + secondtop, + secondcurr, + secondbottom, + secondcurrPrev, + secondcurrNext, + secondtopPrev, + secondtopNext, + secondbottomPrev, + secondbottomNext, + ptrDenoisedInterm + 32); + + + top = curr; + curr = bottom; + topPrev = currPrev; + topNext = currNext; + currPrev = bottomPrev; + currNext = bottomNext; + secondtop = secondcurr; + secondcurr = secondbottom; + secondtopPrev = secondcurrPrev; + secondtopNext = secondcurrNext; + secondcurrPrev = secondbottomPrev; + secondcurrNext = secondbottomNext; + + } + + + } + + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ + + if (!((jj0 && ii < picWidth - 1)){ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } + + } + } + + } } @@ -724,179 +724,179 @@ void noiseExtractLumaStrong_AVX2_INTRIN( * strong filter chroma. *******************************************/ void noiseExtractChromaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn, *ptrInCr; - EB_U32 strideIn, strideInCr; - EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; + EB_U8 *ptrIn, *ptrInCr; + EB_U32 strideIn, strideInCr; + EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; - EB_U32 strideOut, strideOutCr; + EB_U32 strideOut, strideOutCr; EB_U32 colorFormat=inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat==EB_YUV444?1:2)-1; EB_U16 subHeightCMinus1 = (colorFormat>=EB_YUV422?1:2)-1; - __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, - topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; - (void)lcuOriginX; - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; + __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, + topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; + (void)lcuOriginX; + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); lcuHeight = ((lcuOriginY + (MAX_LCU_SIZE >> subHeightCMinus1) >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideCb; + strideIn = inputPicturePtr->strideCb; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; - strideInCr = inputPicturePtr->strideCr; + strideInCr = inputPicturePtr->strideCr; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; - ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); + ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; - strideOutCr = denoisedPicturePtr->strideCr; - ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - ptrDenoisedIntermCr = ptrDenoisedCr; - ////Chroma - //a = (4 * p[0] + 4 * p[1] + 4 * p[2] + - // 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + - // 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; - - top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); - - for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) - { - - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); - - - } - - ChromaStrong_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - topPrev, - topNext, - bottomPrev, - bottomNext, - ptrDenoisedInterm); - - ChromaStrong_AVX2_INTRIN( - topCr, - currCr, - bottomCr, - currPrevCr, - currNextCr, - topPrevCr, - topNextCr, - bottomPrevCr, - bottomNextCr, - ptrDenoisedIntermCr); - - top = curr; - curr = bottom; - topPrev = currPrev; - topNext = currNext; - currPrev = bottomPrev; - currNext = bottomNext; - topCr = currCr; - currCr = bottomCr; - topPrevCr = currPrevCr; - topNextCr = currNextCr; - currPrevCr = bottomPrevCr; - currNextCr = bottomNextCr; - - } - - - } + strideOutCr = denoisedPicturePtr->strideCr; + ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + ptrDenoisedIntermCr = ptrDenoisedCr; + ////Chroma + //a = (4 * p[0] + 4 * p[1] + 4 * p[2] + + // 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + + // 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; + + top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); + + for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) + { + + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); + + + } + + ChromaStrong_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + topPrev, + topNext, + bottomPrev, + bottomNext, + ptrDenoisedInterm); + + ChromaStrong_AVX2_INTRIN( + topCr, + currCr, + bottomCr, + currPrevCr, + currNextCr, + topPrevCr, + topNextCr, + bottomPrevCr, + bottomNextCr, + ptrDenoisedIntermCr); + + top = curr; + curr = bottom; + topPrev = currPrev; + topNext = currNext; + currPrev = bottomPrev; + currNext = bottomNext; + topCr = currCr; + currCr = bottomCr; + topPrevCr = currPrevCr; + topNextCr = currNextCr; + currPrevCr = bottomPrevCr; + currNextCr = bottomNextCr; + + } + + + } lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ - if (!((jj0 && ii < picWidth - 1)){ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideIn]; - } + if (!((jj0 && ii < picWidth - 1)){ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideIn]; + } - } - } - } + } + } + } } @@ -906,38 +906,38 @@ void noiseExtractChromaStrong_AVX2_INTRIN( * weak filter chroma. *******************************************/ void noiseExtractChromaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ) { - EB_U32 ii, jj, kk; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj, kk; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn, *ptrInCr; - EB_U32 strideIn, strideInCr; - EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; + EB_U8 *ptrIn, *ptrInCr; + EB_U32 strideIn, strideInCr; + EB_U8 *ptrDenoised, *ptrDenoisedInterm, *ptrDenoisedCr, *ptrDenoisedIntermCr; - EB_U32 strideOut, strideOutCr; + EB_U32 strideOut, strideOutCr; EB_U32 colorFormat=inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat==EB_YUV444?1:2)-1; EB_U16 subHeightCMinus1 = (colorFormat>=EB_YUV422?1:2)-1; - __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, - topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; - (void)lcuOriginX; + __m256i top, curr, bottom, currPrev, currNext, topPrev, topNext, bottomPrev, bottomNext, + topCr, currCr, bottomCr, currPrevCr, currNextCr, topPrevCr, topNextCr, bottomPrevCr, bottomNextCr; + (void)lcuOriginX; - ////gaussian matrix(Chroma) - //a = (1 * p[0] + 2 * p[1] + 1 * p[2] + - // 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - // 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; + ////gaussian matrix(Chroma) + //a = (1 * p[0] + 2 * p[1] + 1 * p[2] + + // 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + // 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; - { + { picHeight = inputPicturePtr->height >> subHeightCMinus1; picWidth = inputPicturePtr->width >> subWidthCMinus1 ; @@ -945,143 +945,143 @@ void noiseExtractChromaWeak_AVX2_INTRIN( lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); lcuHeight = ((lcuOriginY + (MAX_LCU_SIZE >> subHeightCMinus1) >= picHeight) || (lcuOriginY == 0)) ? lcuHeight - 1 : lcuHeight; - strideIn = inputPicturePtr->strideCb; + strideIn = inputPicturePtr->strideCb; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - ptrDenoisedInterm = ptrDenoised; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + ptrDenoisedInterm = ptrDenoised; - strideInCr = inputPicturePtr->strideCr; + strideInCr = inputPicturePtr->strideCr; inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; - ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); + ptrInCr = &(inputPicturePtr->bufferCr[inputOriginIndex]); inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; - strideOutCr = denoisedPicturePtr->strideCr; - ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - ptrDenoisedIntermCr = ptrDenoisedCr; - - top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); - for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) - { - - for (jj = 0; jj < lcuHeight; jj++) - { - if (lcuOriginY == 0) - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); - _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); - _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); - } - else - { - if (jj == 0) - { - top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); - curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); - topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); - topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); - currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); - currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); - topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); - currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); - topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); - topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); - currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); - } - bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); - bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); - ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); - bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); - bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); - ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); - - } - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - top, - curr, - bottom, - currPrev, - currNext, - topPrev, - topNext, - bottomPrev, - bottomNext, - ptrDenoisedInterm); - - chromaWeakLumaStrongFilter_AVX2_INTRIN( - topCr, - currCr, - bottomCr, - currPrevCr, - currNextCr, - topPrevCr, - topNextCr, - bottomPrevCr, - bottomNextCr, - ptrDenoisedIntermCr); - - - top = curr; - curr = bottom; - topPrev = currPrev; - topNext = currNext; - currPrev = bottomPrev; - currNext = bottomNext; - topCr = currCr; - currCr = bottomCr; - topPrevCr = currPrevCr; - topNextCr = currNextCr; - currPrevCr = bottomPrevCr; - currNextCr = bottomNextCr; - - } - - - } + strideOutCr = denoisedPicturePtr->strideCr; + ptrDenoisedCr = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + ptrDenoisedIntermCr = ptrDenoisedCr; + + top = curr = topNext = topPrev = currNext = currPrev = topCr = currCr = topNextCr = topPrevCr = currNextCr = currPrevCr = _mm256_setzero_si256(); + for (kk = 0; kk + MAX_LCU_SIZE / 2 <= picWidth; kk += MAX_LCU_SIZE / 2) + { + + for (jj = 0; jj < lcuHeight; jj++) + { + if (lcuOriginY == 0) + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn))); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn))); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn))); + _mm256_storeu_si256((__m256i *)(ptrDenoised + kk), top); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr))); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr))); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr))); + _mm256_storeu_si256((__m256i *)(ptrDenoisedCr + kk), topCr); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn))); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn))); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr))); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr))); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr)); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr); + } + else + { + if (jj == 0) + { + top = _mm256_loadu_si256((__m256i*)(ptrIn + kk + jj*strideIn - strideIn)); + curr = _mm256_loadu_si256((__m256i*)(ptrIn + kk + (1 + jj)*strideIn - strideIn)); + topPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((jj)*strideIn) - strideIn)); + topNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((jj)*strideIn) - strideIn)); + currPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((1 + jj)*strideIn - strideIn))); + currNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((1 + jj)*strideIn - strideIn))); + topCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + jj*strideInCr - strideInCr)); + currCr = _mm256_loadu_si256((__m256i*)(ptrInCr + kk + (1 + jj)*strideInCr - strideInCr)); + topPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((jj)*strideInCr) - strideInCr)); + topNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((jj)*strideInCr) - strideInCr)); + currPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + currNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((1 + jj)*strideInCr - strideInCr))); + } + bottomPrev = _mm256_loadu_si256((__m256i*)(ptrIn - 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottomNext = _mm256_loadu_si256((__m256i*)(ptrIn + 1 + kk + ((2 + jj)*strideIn) - strideIn)); + bottom = _mm256_loadu_si256((__m256i*)((ptrIn + kk) + (2 + jj)* strideIn - strideIn)); + ptrDenoisedInterm = ptrDenoised + kk + ((1 + jj)*strideOut - strideOut); + bottomPrevCr = _mm256_loadu_si256((__m256i*)(ptrInCr - 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomNextCr = _mm256_loadu_si256((__m256i*)(ptrInCr + 1 + kk + ((2 + jj)*strideInCr) - strideInCr)); + bottomCr = _mm256_loadu_si256((__m256i*)((ptrInCr + kk) + (2 + jj)* strideInCr - strideInCr)); + ptrDenoisedIntermCr = ptrDenoisedCr + kk + ((1 + jj)*strideOutCr - strideOutCr); + + } + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + top, + curr, + bottom, + currPrev, + currNext, + topPrev, + topNext, + bottomPrev, + bottomNext, + ptrDenoisedInterm); + + chromaWeakLumaStrongFilter_AVX2_INTRIN( + topCr, + currCr, + bottomCr, + currPrevCr, + currNextCr, + topPrevCr, + topNextCr, + bottomPrevCr, + bottomNextCr, + ptrDenoisedIntermCr); + + + top = curr; + curr = bottom; + topPrev = currPrev; + topNext = currNext; + currPrev = bottomPrev; + currNext = bottomNext; + topCr = currCr; + currCr = bottomCr; + topPrevCr = currPrevCr; + topNextCr = currNextCr; + currPrevCr = bottomPrevCr; + currNextCr = bottomNextCr; + + } + + + } lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = 0; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = 0; ii < picWidth; ii++){ - if (!((jj0 && ii < picWidth - 1)){ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideInCr]; - } + if (!((jj0 && ii < picWidth - 1)){ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrDenoisedCr[ii + jj*strideOut] = ptrInCr[ii + jj*strideInCr]; + } - } - } - } + } + } + } } diff --git a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h index 548847d1d..f58404718 100644 --- a/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h +++ b/Source/Lib/ASM_AVX2/EbNoiseExtractAVX2.h @@ -19,75 +19,75 @@ extern "C" { * weak filter Luma and store noise. *******************************************/ void noiseExtractLumaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractLumaWeakLcu_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractChromaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); void noiseExtractChromaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); void noiseExtractLumaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); void ChromaStrong_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised); + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised); void lumaWeakFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - EB_U8 *ptrDenoised, - EB_U8 *ptrNoise); + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + EB_U8 *ptrDenoised, + EB_U8 *ptrNoise); void chromaWeakLumaStrongFilter_AVX2_INTRIN( - __m256i top, - __m256i curr, - __m256i bottom, - __m256i currPrev, - __m256i currNext, - __m256i topPrev, - __m256i topNext, - __m256i bottomPrev, - __m256i bottomNext, - EB_U8 *ptrDenoised); + __m256i top, + __m256i curr, + __m256i bottom, + __m256i currPrev, + __m256i currNext, + __m256i topPrev, + __m256i topNext, + __m256i bottomPrev, + __m256i bottomNext, + EB_U8 *ptrDenoised); #ifdef __cplusplus } -#endif +#endif #endif // EbNoiseExtractAVX2_h diff --git a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c index f4f73ab13..5e18dd0ea 100644 --- a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.c @@ -78,7 +78,7 @@ void EB_ENC_msbUnPack2D_AVX512_INTRIN( { EB_U16 inPixel2 = in16BitBuffer[y]; out8BitBuffer[y] = (EB_U8)(inPixel2 >> 2); - + EB_U8 tmpPixel2 = (EB_U8)(inPixel2 << 6); outnBitBuffer[y] = tmpPixel2; } diff --git a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h index 5b6b6ed00..492c5e347 100644 --- a/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbPackUnPack_Intrinsic_AVX2.h @@ -14,14 +14,14 @@ extern "C" { #ifndef NON_AVX512_SUPPORT void EB_ENC_msbUnPack2D_AVX512_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U8 *outnBitBuffer, - EB_U32 out8Stride, - EB_U32 outnStride, - EB_U32 width, - EB_U32 height); + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U8 *outnBitBuffer, + EB_U32 out8Stride, + EB_U32 outnStride, + EB_U32 width, + EB_U32 height); #else void EB_ENC_msbUnPack2D_AVX2_INTRIN( EB_U16 *in16BitBuffer, diff --git a/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h b/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h index 0ac0edaab..5192ff353 100644 --- a/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbPictureOperators_AVX2.h @@ -13,44 +13,44 @@ extern "C" { #endif extern void EB_ENC_msbPack2D_AVX2_INTRIN_AL( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height); extern void CompressedPackmsb_AVX2_INTRIN( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height); void CPack_AVX2_INTRIN( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); void UnpackAvg_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height); @@ -67,7 +67,7 @@ void memset16bitBlock_AVX2_INTRIN ( void UnpackAvgSafeSub_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, diff --git a/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c index d0a23c53d..3b5467dfa 100644 --- a/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbPictureOperators_Intrinsic_AVX2.c @@ -235,12 +235,12 @@ void CompressedPackmsb_AVX2_INTRIN( in8Bit = _mm256_loadu_si256((__m256i*)in8BitBuffer); in8Bit32 = _mm256_loadu_si256((__m256i*)(in8BitBuffer + 32)); - //(outPixel | nBitPixel) concatenation + //(outPixel | nBitPixel) concatenation concat0 = _mm256_srli_epi16(_mm256_unpacklo_epi8(inNBit, in8Bit), 6); concat1 = _mm256_srli_epi16(_mm256_unpackhi_epi8(inNBit, in8Bit), 6); concat2 = _mm256_srli_epi16(_mm256_unpacklo_epi8(inNBit32, in8Bit32), 6); concat3 = _mm256_srli_epi16(_mm256_unpackhi_epi8(inNBit32, in8Bit32), 6); - + _mm_storeu_si128((__m128i*) out16BitBuffer, _mm256_castsi256_si128(concat0)); _mm_storeu_si128((__m128i*) (out16BitBuffer + 8), _mm256_castsi256_si128(concat1)); _mm_storeu_si128((__m128i*) (out16BitBuffer + 16), _mm256_extracti128_si256(concat0, 1)); @@ -265,202 +265,202 @@ void CompressedPackmsb_AVX2_INTRIN( void CPack_AVX2_INTRIN( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - - EB_U32 width, - EB_U32 height) -{ + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, - EB_U32 y; + EB_U32 width, + EB_U32 height) +{ - if (width == 32) - { - __m256i inNBit; + EB_U32 y; - __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp; - __m256i msk0, msk1, msk2, msk3; + if (width == 32) + { + __m256i inNBit; - msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 - msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 - msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 - msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 + __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp; + __m256i msk0, msk1, msk2, msk3; - //One row per iter - for (y = 0; y < height; y++) - { + msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 + msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 + msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 + msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 + //One row per iter + for (y = 0; y < height; y++) + { - inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp = _mm256_packus_epi32(ext0123, ext0123n); - extp = _mm256_packus_epi16(extp, extp); - _mm_storel_epi64((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); - inCompnBitBuffer += 8; - innBitBuffer += innStride; + extp = _mm256_packus_epi32(ext0123, ext0123n); + extp = _mm256_packus_epi16(extp, extp); + _mm_storel_epi64((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); + inCompnBitBuffer += 8; + innBitBuffer += innStride; - } - } - else if (width == 64) - { - __m256i inNBit; - __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp, extp1; - __m256i msk0, msk1, msk2, msk3; + } - msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 - msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 - msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 - msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 - if (height == 64) - { + } + else if (width == 64) + { + __m256i inNBit; + __m256i ext0, ext1, ext2, ext3, ext0123, ext0123n, extp, extp1; + __m256i msk0, msk1, msk2, msk3; + + msk0 = _mm256_set1_epi32(0x000000C0);//1100.0000 + msk1 = _mm256_set1_epi32(0x00000030);//0011.0000 + msk2 = _mm256_set1_epi32(0x0000000C);//0000.1100 + msk3 = _mm256_set1_epi32(0x00000003);//0000.0011 + if (height == 64) + { - EB_U8* localPtr = localCache; + EB_U8* localPtr = localCache; - for (y = 0; y < height; y++) - { + for (y = 0; y < height; y++) + { - inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); + inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp = _mm256_packus_epi32(ext0123, ext0123n); - extp = _mm256_packus_epi16(extp, extp); + extp = _mm256_packus_epi32(ext0123, ext0123n); + extp = _mm256_packus_epi16(extp, extp); - inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); + inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp1 = _mm256_packus_epi32(ext0123, ext0123n); - extp1 = _mm256_packus_epi16(extp1, extp1); + extp1 = _mm256_packus_epi32(ext0123, ext0123n); + extp1 = _mm256_packus_epi16(extp1, extp1); - extp = _mm256_unpacklo_epi64(extp, extp1); + extp = _mm256_unpacklo_epi64(extp, extp1); - _mm_storeu_si128((__m128i*) (localPtr + 16 * (y & 3)), _mm256_castsi256_si128(extp)); + _mm_storeu_si128((__m128i*) (localPtr + 16 * (y & 3)), _mm256_castsi256_si128(extp)); - if ((y & 3) == 3) - { - __m256i c0 = _mm256_loadu_si256((__m256i*)(localPtr)); - __m256i c1 = _mm256_loadu_si256((__m256i*)(localPtr + 32)); - _mm256_stream_si256((__m256i*)&inCompnBitBuffer[0], c0); - _mm256_stream_si256((__m256i*)&inCompnBitBuffer[32], c1); - inCompnBitBuffer += 4 * outStride; - } + if ((y & 3) == 3) + { + __m256i c0 = _mm256_loadu_si256((__m256i*)(localPtr)); + __m256i c1 = _mm256_loadu_si256((__m256i*)(localPtr + 32)); + _mm256_stream_si256((__m256i*)&inCompnBitBuffer[0], c0); + _mm256_stream_si256((__m256i*)&inCompnBitBuffer[32], c1); + inCompnBitBuffer += 4 * outStride; + } - innBitBuffer += innStride; + innBitBuffer += innStride; - } + } - } - else{ + } + else{ - //One row per iter - for (y = 0; y < height; y++) - { + //One row per iter + for (y = 0; y < height; y++) + { - inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); + inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp = _mm256_packus_epi32(ext0123, ext0123n); - extp = _mm256_packus_epi16(extp, extp); + extp = _mm256_packus_epi32(ext0123, ext0123n); + extp = _mm256_packus_epi16(extp, extp); - inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); + inNBit = _mm256_loadu_si256((__m256i*)(innBitBuffer + 32)); - ext0 = _mm256_and_si256(inNBit, msk0); - ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); - ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); - ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); + ext0 = _mm256_and_si256(inNBit, msk0); + ext1 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 1 * 8 + 2), msk1); + ext2 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 2 * 8 + 4), msk2); + ext3 = _mm256_and_si256(_mm256_srli_epi32(inNBit, 3 * 8 + 6), msk3); - ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); + ext0123 = _mm256_or_si256(_mm256_or_si256(ext0, ext1), _mm256_or_si256(ext2, ext3)); - ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); + ext0123n = _mm256_castsi128_si256(_mm256_extracti128_si256(ext0123, 1)); - extp1 = _mm256_packus_epi32(ext0123, ext0123n); - extp1 = _mm256_packus_epi16(extp1, extp1); + extp1 = _mm256_packus_epi32(ext0123, ext0123n); + extp1 = _mm256_packus_epi16(extp1, extp1); - extp = _mm256_unpacklo_epi64(extp, extp1); + extp = _mm256_unpacklo_epi64(extp, extp1); - _mm_storeu_si128((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); + _mm_storeu_si128((__m128i*) inCompnBitBuffer, _mm256_castsi256_si128(extp)); - inCompnBitBuffer += outStride; + inCompnBitBuffer += outStride; - innBitBuffer += innStride; + innBitBuffer += innStride; - } + } - } + } - } + } } void EB_ENC_msbPack2D_AVX2_INTRIN_AL( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height) + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height) { //(outPixel | nBitPixel) concatenation is done with unpacklo_epi8 and unpackhi_epi8 - EB_U32 y, x; + EB_U32 y, x; __m128i out0, out1; - if (width == 4) - { - for (y = 0; y < height; y += 2){ + if (width == 4) + { + for (y = 0; y < height; y += 2){ out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)innBitBuffer), _mm_cvtsi32_si128(*(EB_U32 *)in8BitBuffer)), 6); out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)(innBitBuffer + innStride)), _mm_cvtsi32_si128(*(EB_U32 *)(in8BitBuffer + in8Stride))), 6); @@ -468,31 +468,31 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm_storel_epi64((__m128i*) out16BitBuffer, out0); _mm_storel_epi64((__m128i*) (out16BitBuffer + outStride), out1); - in8BitBuffer += in8Stride << 1; - innBitBuffer += innStride << 1; - out16BitBuffer += outStride << 1; - } - } - else if (width == 8) - { - for (y = 0; y < height; y += 2){ + in8BitBuffer += in8Stride << 1; + innBitBuffer += innStride << 1; + out16BitBuffer += outStride << 1; + } + } + else if (width == 8) + { + for (y = 0; y < height; y += 2){ - out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); - out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); + out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); + out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); _mm_storeu_si128((__m128i*) out16BitBuffer, out0); _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out1); - in8BitBuffer += in8Stride << 1; - innBitBuffer += innStride << 1; - out16BitBuffer += outStride << 1; - } - } - else if (width == 16) - { + in8BitBuffer += in8Stride << 1; + innBitBuffer += innStride << 1; + out16BitBuffer += outStride << 1; + } + } + else if (width == 16) + { __m128i inNBit, in8Bit, inNBitStride, in8BitStride, out0, out1, out2, out3; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ inNBit = _mm_loadu_si128((__m128i*)innBitBuffer); in8Bit = _mm_loadu_si128((__m128i*)in8BitBuffer); inNBitStride = _mm_loadu_si128((__m128i*)(innBitBuffer + innStride)); @@ -508,17 +508,17 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out2); _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride + 8), out3); - in8BitBuffer += in8Stride << 1; - innBitBuffer += innStride << 1; - out16BitBuffer += outStride << 1; - } - } - else if (width == 32) - { + in8BitBuffer += in8Stride << 1; + innBitBuffer += innStride << 1; + out16BitBuffer += outStride << 1; + } + } + else if (width == 32) + { __m256i inNBit, in8Bit, inNBitStride, in8BitStride, concat0, concat1, concat2, concat3; __m256i out0_15, out16_31, out_s0_s15, out_s16_s31; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); in8Bit = _mm256_loadu_si256((__m256i*)in8BitBuffer); @@ -542,19 +542,19 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm256_store_si256((__m256i*) (out16BitBuffer + outStride), out_s0_s15); _mm256_store_si256((__m256i*) (out16BitBuffer + outStride + 16), out_s16_s31); - in8BitBuffer += in8Stride << 1; - //innBitBuffer += innStride << 1; + in8BitBuffer += in8Stride << 1; + //innBitBuffer += innStride << 1; innBitBuffer += innStride *2; - out16BitBuffer += outStride << 1; - } - } - else if (width == 64) - { + out16BitBuffer += outStride << 1; + } + } + else if (width == 64) + { __m256i inNBit, in8Bit, inNBitStride, in8BitStride, inNBit32, in8Bit32, inNBitStride32, in8BitStride32; __m256i concat0, concat1, concat2, concat3, concat4, concat5, concat6, concat7; __m256i out_0_15, out16_31, out32_47, out_48_63, out_s0_s15, out_s16_s31, out_s32_s47, out_s48_s63; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ inNBit = _mm256_loadu_si256((__m256i*)innBitBuffer); in8Bit = _mm256_loadu_si256((__m256i*)in8BitBuffer); @@ -594,166 +594,166 @@ void EB_ENC_msbPack2D_AVX2_INTRIN_AL( _mm256_store_si256((__m256i*) (out16BitBuffer + outStride + 32), out_s32_s47); _mm256_store_si256((__m256i*) (out16BitBuffer + outStride + 48), out_s48_s63); - in8BitBuffer += in8Stride << 1; - //innBitBuffer += innStride << 1; + in8BitBuffer += in8Stride << 1; + //innBitBuffer += innStride << 1; innBitBuffer += innStride *2; - out16BitBuffer += outStride << 1; - } - } - else - { + out16BitBuffer += outStride << 1; + } + } + else + { EB_U32 innStrideDiff = 2 * innStride; - EB_U32 in8StrideDiff = 2 * in8Stride; - EB_U32 outStrideDiff = 2 * outStride; - innStrideDiff -= width; - in8StrideDiff -= width; - outStrideDiff -= width; - - if (!(width & 7)){ - - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 8){ - - out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); - out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); - - _mm_storeu_si128((__m128i*) out16BitBuffer, out0); - _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out1); - - in8BitBuffer += 8; - innBitBuffer += 8; - out16BitBuffer += 8; - } - in8BitBuffer += in8StrideDiff; - innBitBuffer += innStrideDiff; - out16BitBuffer += outStrideDiff; - } - } - else{ - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 4){ - - out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)innBitBuffer), _mm_cvtsi32_si128(*(EB_U32 *)in8BitBuffer)), 6); - out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)(innBitBuffer + innStride)), _mm_cvtsi32_si128(*(EB_U32 *)(in8BitBuffer + in8Stride))), 6); - - _mm_storel_epi64((__m128i*) out16BitBuffer, out0); - _mm_storel_epi64((__m128i*) (out16BitBuffer + outStride), out1); - - in8BitBuffer += 4; - innBitBuffer += 4; - out16BitBuffer += 4; - } - in8BitBuffer += in8StrideDiff; - innBitBuffer += innStrideDiff; - out16BitBuffer += outStrideDiff; - } - } - } + EB_U32 in8StrideDiff = 2 * in8Stride; + EB_U32 outStrideDiff = 2 * outStride; + innStrideDiff -= width; + in8StrideDiff -= width; + outStrideDiff -= width; + + if (!(width & 7)){ + + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 8){ + + out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)innBitBuffer), _mm_loadl_epi64((__m128i*)in8BitBuffer)), 6); + out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(innBitBuffer + innStride)), _mm_loadl_epi64((__m128i*)(in8BitBuffer + in8Stride))), 6); + + _mm_storeu_si128((__m128i*) out16BitBuffer, out0); + _mm_storeu_si128((__m128i*) (out16BitBuffer + outStride), out1); + + in8BitBuffer += 8; + innBitBuffer += 8; + out16BitBuffer += 8; + } + in8BitBuffer += in8StrideDiff; + innBitBuffer += innStrideDiff; + out16BitBuffer += outStrideDiff; + } + } + else{ + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 4){ + + out0 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)innBitBuffer), _mm_cvtsi32_si128(*(EB_U32 *)in8BitBuffer)), 6); + out1 = _mm_srli_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)(innBitBuffer + innStride)), _mm_cvtsi32_si128(*(EB_U32 *)(in8BitBuffer + in8Stride))), 6); + + _mm_storel_epi64((__m128i*) out16BitBuffer, out0); + _mm_storel_epi64((__m128i*) (out16BitBuffer + outStride), out1); + + in8BitBuffer += 4; + innBitBuffer += 4; + out16BitBuffer += 4; + } + in8BitBuffer += in8StrideDiff; + innBitBuffer += innStrideDiff; + out16BitBuffer += outStrideDiff; + } + } + } } #define ALSTORE 1 #define B256 1 void UnpackAvg_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { - EB_U32 y; - __m128i inPixel0, inPixel1; + EB_U32 y; + __m128i inPixel0, inPixel1; - - if (width == 4) - { + + if (width == 4) + { __m128i out8_0_U8_L0, out8_0_U8_L1; __m128i avg8_0_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L1); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)dstPtr = _mm_cvtsi128_si32(avg8_0_U8); - //-------- + //-------- //Line Two //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L0+ refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L1+ refL1Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)(dstPtr+dstStride) = _mm_cvtsi128_si32(avg8_0_U8); dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; - - } - - } - else if (width == 8) - { - + ref16L1 += 2*refL1Stride; + + } + + } + else if (width == 8) + { + __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 - inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); + inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + + _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - //-------- //Line Two @@ -763,37 +763,37 @@ void UnpackAvg_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*)(ref16L0 + refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*)(ref16L1 + refL1Stride) ); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 16) - { + + } + else if (width == 16) + { __m128i inPixel4, inPixel5; __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- @@ -802,24 +802,24 @@ void UnpackAvg_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); inPixel1 = _mm_loadu_si128((__m128i*) (ref16L0 + 8)); - - out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); + + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); - inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); - + inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - + //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); #if ALSTORE _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); #else - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); -#endif + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); +#endif //-------- //Line Two @@ -828,34 +828,34 @@ void UnpackAvg_AVX2_INTRIN( //List0 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - //List1 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - - //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); #if ALSTORE - _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); #else - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); #endif dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 32) - { + + } + else if (width == 32) + { #if B256 __m256i inVal16b_0,inVal16b_1; @@ -866,10 +866,10 @@ void UnpackAvg_AVX2_INTRIN( __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; __m128i avg8_0_U8, avg8_1_U8, avg8_2_U8, avg8_3_U8; -#endif +#endif for (y = 0; y < height; y += 2) - { + { #if B256 //-------- @@ -878,44 +878,44 @@ void UnpackAvg_AVX2_INTRIN( //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L0); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); - data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L1); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); - + //-------- //Line Two //-------- //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride + 16)); - + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - + //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride + 16)); - + data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + + avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - _mm256_storeu_si256((__m256i *)(dstPtr + dstStride ), avg8b_32_0); - + #else //-------- //Line One @@ -929,7 +929,7 @@ void UnpackAvg_AVX2_INTRIN( inPixel3 = _mm_loadu_si128((__m128i*) (ref16L0 + 24)); out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //List1 @@ -937,19 +937,19 @@ void UnpackAvg_AVX2_INTRIN( inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(ref16L1 + 16)); inPixel3 = _mm_loadu_si128((__m128i*)(ref16L1 + 24)); - + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //AVG avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); - avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); + avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); #if ALSTORE _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); #else - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); #endif //-------- @@ -963,7 +963,7 @@ void UnpackAvg_AVX2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 24)); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //List1 @@ -973,37 +973,37 @@ void UnpackAvg_AVX2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 24)); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - + //AVG avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); - avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); + avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); #if ALSTORE _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_store_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); + _mm_store_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); #else - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); -#endif - -#endif + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); +#endif + +#endif dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 64) - { - + } + else if (width == 64) + { + #if B256 __m256i inVal16b_0,inVal16b_1,inVal16b_2,inVal16b_3; __m256i data8b_32_0_L0,data8b_32_1_L0,data8b_32_0_L1,data8b_32_1_L1; __m256i avg8b_32_0,avg8b_32_1; -#else +#else __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; @@ -1011,8 +1011,8 @@ void UnpackAvg_AVX2_INTRIN( #endif - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { #if B256 // _mm256_lddqu_si256 @@ -1030,15 +1030,15 @@ void UnpackAvg_AVX2_INTRIN( inVal16b_3 = _mm256_loadu_si256((__m256i*)(ref16L1 + 48)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); data8b_32_1_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_2, 2) , _mm256_srli_epi16 (inVal16b_3, 2)); - - + + //Avg avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_1 = _mm256_avg_epu8(data8b_32_1_L0,data8b_32_1_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); avg8b_32_1 = _mm256_permute4x64_epi64(avg8b_32_1, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); _mm256_storeu_si256((__m256i *)(dstPtr + 32), avg8b_32_1); #else @@ -1051,16 +1051,16 @@ void UnpackAvg_AVX2_INTRIN( inPixel5 = _mm_loadu_si128((__m128i*)(ref16L0 + 40)); inPixel6 = _mm_loadu_si128((__m128i*)(ref16L0 + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(ref16L0 + 56)); - + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - - + + //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); @@ -1072,10 +1072,10 @@ void UnpackAvg_AVX2_INTRIN( inPixel7 = _mm_loadu_si128((__m128i*)(ref16L1 + 56)); - //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels + //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //AVG @@ -1085,23 +1085,23 @@ void UnpackAvg_AVX2_INTRIN( avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); #if ALSTORE _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); - _mm_store_si128((__m128i*)(dstPtr + 32), avg8_2_U8); - _mm_store_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + _mm_store_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_store_si128((__m128i*)(dstPtr + 32), avg8_2_U8); + _mm_store_si128((__m128i*)(dstPtr + 48), avg8_3_U8); #else - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); #endif - + #endif - dstPtr += dstStride; + dstPtr += dstStride; ref16L0 += refL0Stride; - ref16L1 += refL1Stride; - } - } - + ref16L1 += refL1Stride; + } + } + return; } @@ -1121,7 +1121,7 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( //Assumption: 9bit or 11bit residual data . for bigger block sizes or bigger bit depths , re-asses the dynamic range of the internal calculation if(size==4){ //SSSE3 - + __m128i zer = _mm_setzero_si128(); in0 = _mm_loadl_epi64((__m128i*)inPtr); @@ -1143,9 +1143,9 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( sumBlock = _mm_cvtsi128_si32 (sum); return sumBlock; - + }else if(size==8){//SSSE3 - + __m128i zer = _mm_setzero_si128(); sum = _mm_add_epi16 (_mm_loadu_si128((__m128i*)(inPtr+0*strideIn)), _mm_loadu_si128((__m128i*)(inPtr+1*strideIn))); @@ -1164,12 +1164,12 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( sumBlock = _mm_cvtsi128_si32 (sum); return sumBlock; - + }else if(size==16){//AVX2 sum0 = _mm256_add_epi16 (_mm256_loadu_si256((__m256i *)(inPtr+0*strideIn)), _mm256_loadu_si256((__m256i *)(inPtr+1*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+2*strideIn))); - sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); + sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+4*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+5*strideIn))); sum0 = _mm256_add_epi16 (sum0, _mm256_loadu_si256((__m256i *)(inPtr+6*strideIn))); @@ -1178,29 +1178,29 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( inPtr+=8*strideIn; sum1 = _mm256_add_epi16 (_mm256_loadu_si256((__m256i *)(inPtr+0*strideIn)), _mm256_loadu_si256((__m256i *)(inPtr+1*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+2*strideIn))); - sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); + sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+3*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+4*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+5*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+6*strideIn))); sum1 = _mm256_add_epi16 (sum1, _mm256_loadu_si256((__m256i *)(inPtr+7*strideIn))); - sum01 = _mm256_add_epi16 (sum0,sum1); - + sum01 = _mm256_add_epi16 (sum0,sum1); + //go from 16bit to 32bit (to support big values) sumL = _mm256_castsi256_si128(sum01); sumH = _mm256_extracti128_si256(sum01,1); sum0L = _mm256_cvtepi16_epi32(sumL); sum0H = _mm256_cvtepi16_epi32(sumH); - sumT = _mm256_add_epi32(sum0L,sum0H); + sumT = _mm256_add_epi32(sum0L,sum0H); - sumT = _mm256_hadd_epi32(sumT,sumT); - sumT = _mm256_hadd_epi32(sumT,sumT); - sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 + sumT = _mm256_hadd_epi32(sumT,sumT); + sumT = _mm256_hadd_epi32(sumT,sumT); + sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 sumT = _mm256_add_epi32(sumT,sumTPerm); - sum = _mm256_castsi256_si128(sumT); - sumBlock = _mm_cvtsi128_si32 (sum); + sum = _mm256_castsi256_si128(sumT); + sumBlock = _mm_cvtsi128_si32 (sum); return sumBlock; @@ -1248,7 +1248,7 @@ EB_S32 sumResidual8bit_AVX2_INTRIN( sumT = _mm256_hadd_epi32(sumT, sumT); sumT = _mm256_hadd_epi32(sumT, sumT); - sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 + sumTPerm = _mm256_permute4x64_epi64(sumT, 2); //00.00.00.10 sumT = _mm256_add_epi32(sumT, sumTPerm); sum = _mm256_castsi256_si128(sumT); @@ -1273,18 +1273,18 @@ void memset16bitBlock_AVX2_INTRIN ( { - if(size==4){ + if(size==4){ - __m128i line = _mm_set1_epi16 (value); + __m128i line = _mm_set1_epi16 (value); _mm_storel_epi64 ((__m128i *)(inPtr + 0*strideIn), line); _mm_storel_epi64 ((__m128i *)(inPtr + 1*strideIn), line); _mm_storel_epi64 ((__m128i *)(inPtr + 2*strideIn), line); _mm_storel_epi64 ((__m128i *)(inPtr + 3*strideIn), line); - + }else if(size==8){ - - __m128i line = _mm_set1_epi16 (value); + + __m128i line = _mm_set1_epi16 (value); _mm_storeu_si128((__m128i *)(inPtr + 0*strideIn), line); _mm_storeu_si128((__m128i *)(inPtr + 1*strideIn), line); @@ -1294,10 +1294,10 @@ void memset16bitBlock_AVX2_INTRIN ( _mm_storeu_si128((__m128i *)(inPtr + 5*strideIn), line); _mm_storeu_si128((__m128i *)(inPtr + 6*strideIn), line); _mm_storeu_si128((__m128i *)(inPtr + 7*strideIn), line); - + }else if(size==16){ - __m256i line = _mm256_set1_epi16(value); + __m256i line = _mm256_set1_epi16(value); _mm256_storeu_si256((__m256i *)(inPtr + 0*strideIn), line); _mm256_storeu_si256((__m256i *)(inPtr + 1*strideIn), line); @@ -1405,50 +1405,50 @@ void memset16bitBlock_AVX2_INTRIN ( } void UnpackAvgSafeSub_AVX2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { - EB_U32 y; - __m128i inPixel0, inPixel1; + EB_U32 y; + __m128i inPixel0, inPixel1; + - if (width == 8) - { - + { + __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 - inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); + inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); - _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); + _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); //-------- //Line Two @@ -1458,37 +1458,37 @@ void UnpackAvgSafeSub_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*)(ref16L0 + refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*)(ref16L1 + refL1Stride) ); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 16) - { + + } + else if (width == 16) + { __m128i inPixel4, inPixel5; __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; for (y = 0; y < height; y += 2) - { + { //-------- //Line One @@ -1498,19 +1498,19 @@ void UnpackAvgSafeSub_AVX2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); inPixel1 = _mm_loadu_si128((__m128i*) (ref16L0 + 8)); - - out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); + + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); - inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); - + inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - + //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); _mm_store_si128((__m128i*) dstPtr , avg8_0_U8); @@ -1521,102 +1521,102 @@ void UnpackAvgSafeSub_AVX2_INTRIN( //List0 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - //List1 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - - //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); - _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_store_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 32) - { + } + else if (width == 32) + { __m256i inVal16b_0,inVal16b_1; __m256i data8b_32_0_L0,data8b_32_0_L1; - __m256i avg8b_32_0; + __m256i avg8b_32_0; for (y = 0; y < height; y += 2) - { - + { + //-------- //Line One //-------- //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L0); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); - data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + 16)); + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*) ref16L1); - inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); + inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + 16)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); - + //-------- //Line Two //-------- //List0 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L0 + refL0Stride + 16)); - + data8b_32_0_L0 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - + //List1 inVal16b_0 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride )); inVal16b_1 = _mm256_loadu_si256((__m256i*)(ref16L1 + refL1Stride + 16)); - + data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); - - + + //Avg - avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); + + avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); - _mm256_storeu_si256((__m256i *)(dstPtr + dstStride ), avg8b_32_0); - - + + dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 64) - { + } + else if (width == 64) + { __m256i inVal16b_0,inVal16b_1,inVal16b_2,inVal16b_3; __m256i data8b_32_0_L0,data8b_32_1_L0,data8b_32_0_L1,data8b_32_1_L1; __m256i avg8b_32_0,avg8b_32_1; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { //List0 @@ -1633,26 +1633,26 @@ void UnpackAvgSafeSub_AVX2_INTRIN( inVal16b_3 = _mm256_loadu_si256((__m256i*)(ref16L1 + 48)); data8b_32_0_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_0, 2) , _mm256_srli_epi16 (inVal16b_1, 2)); data8b_32_1_L1 = _mm256_packus_epi16( _mm256_srli_epi16 (inVal16b_2, 2) , _mm256_srli_epi16 (inVal16b_3, 2)); - - + + //Avg avg8b_32_0 = _mm256_avg_epu8(data8b_32_0_L0,data8b_32_0_L1); avg8b_32_1 = _mm256_avg_epu8(data8b_32_1_L0,data8b_32_1_L1); avg8b_32_0 = _mm256_permute4x64_epi64(avg8b_32_0, 216); avg8b_32_1 = _mm256_permute4x64_epi64(avg8b_32_1, 216); - + _mm256_storeu_si256((__m256i *)(dstPtr ), avg8b_32_0); _mm256_storeu_si256((__m256i *)(dstPtr + 32), avg8b_32_1); - dstPtr += dstStride; + dstPtr += dstStride; ref16L0 += refL0Stride; - ref16L1 += refL1Stride; - } + ref16L1 += refL1Stride; + } + + } - } - return; } diff --git a/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h b/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h index 30be3e941..846a59311 100644 --- a/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h +++ b/Source/Lib/ASM_AVX2/EbTransforms_AVX2.h @@ -12,95 +12,95 @@ extern "C" { #endif void QuantizeInvQuantize8x8_AVX2_INTRIN( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff); void QuantizeInvQuantizeNxN_AVX2_INTRIN( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff); void lowPrecisionTransform16x16_AVX2_INTRIN(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_stride, EB_S16 *intermediate, EB_U32 addshift); void lowPrecisionTransform32x32_AVX2_INTRIN(EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, EB_U32 dst_stride, EB_S16 *intermediate, EB_U32 addshift); void PfreqTransform32x32_AVX2_INTRIN( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift); + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift); void PfreqN4Transform32x32_AVX2_INTRIN( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift); + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift); void MatMult4x4_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff); + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff); void MatMult4x4_OutBuff_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, + EB_S16* coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32* nonzerocoeff); + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32* nonzerocoeff); void MatMult8x8_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff); + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff); void MatMultNxN_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff); + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff); diff --git a/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c b/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c index 9804d1984..52b6f166f 100644 --- a/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c +++ b/Source/Lib/ASM_AVX2/EbTransforms_Intrinsic_AVX2.c @@ -171,12 +171,12 @@ void QuantizeInvQuantizeNxN_AVX2_INTRIN( z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(x, _mm256_setzero_si256())); x = _mm256_sign_epi16(x, y); _mm256_storeu_si256((__m256i *)(quantCoeff + coeffStride*row + col), x); - __m256i zer = _mm256_setzero_si256(); - __m256i cmp = _mm256_cmpeq_epi16(x, zer); - int msk = _mm256_movemask_epi8(cmp); + __m256i zer = _mm256_setzero_si256(); + __m256i cmp = _mm256_cmpeq_epi16(x, zer); + int msk = _mm256_movemask_epi8(cmp); - if ((EB_U32)msk != 0xFFFFFFFF) - { + if ((EB_U32)msk != 0xFFFFFFFF) + { a0 = _mm256_mullo_epi16(x, iqq); a1 = _mm256_mulhi_epi16(x, iqq); b0 = _mm256_unpacklo_epi16(a0, a1); @@ -187,10 +187,10 @@ void QuantizeInvQuantizeNxN_AVX2_INTRIN( b1 = _mm256_sra_epi32(b1, is); x = _mm256_packs_epi32(b0, b1); _mm256_storeu_si256((__m256i *)(reconCoeff + coeffStride*row + col), x); - } - else{ - _mm256_storeu_si256((__m256i *)(reconCoeff + coeffStride*row + col), zer); - } + } + else{ + _mm256_storeu_si256((__m256i *)(reconCoeff + coeffStride*row + col), zer); + } col += 16; } while (col < areaSize); @@ -251,12 +251,12 @@ void QuantizeInvQuantize8x8_AVX2_INTRIN( x = _mm256_sign_epi16(x, y); _mm_storeu_si128((__m128i *)(quantCoeff + coeffStride*row), _mm256_extracti128_si256(x, 0)); _mm_storeu_si128((__m128i *)(quantCoeff + coeffStride*(row + 1)), _mm256_extracti128_si256(x, 1)); - __m256i zer = _mm256_setzero_si256(); - __m256i cmp = _mm256_cmpeq_epi16(x, zer); - int msk = _mm256_movemask_epi8(cmp); + __m256i zer = _mm256_setzero_si256(); + __m256i cmp = _mm256_cmpeq_epi16(x, zer); + int msk = _mm256_movemask_epi8(cmp); - if ((EB_U32)msk != 0xFFFFFFFF) - { + if ((EB_U32)msk != 0xFFFFFFFF) + { a0 = _mm256_mullo_epi16(x, iqq); a1 = _mm256_mulhi_epi16(x, iqq); b0 = _mm256_unpacklo_epi16(a0, a1); @@ -268,11 +268,11 @@ void QuantizeInvQuantize8x8_AVX2_INTRIN( x = _mm256_packs_epi32(b0, b1); _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*row), _mm256_extracti128_si256(x, 0)); _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*(row + 1)), _mm256_extracti128_si256(x, 1)); - } - else{ - _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*row), _mm_setzero_si128()); - _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*(row + 1)), _mm_setzero_si128()); - } + } + else{ + _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*row), _mm_setzero_si128()); + _mm_storeu_si128((__m128i *)(reconCoeff + coeffStride*(row + 1)), _mm_setzero_si128()); + } row += 2; } while (row < 8); @@ -480,71 +480,71 @@ void PfreqTranspose32_AVX2_INTRIN( } void PfreqSecTranspose32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i; - // for (i = 0; i < 4; i++) - for (i = 0; i < 2; i++) - { - __m256i a0, a1, a2, a3, a4, a5, a6, a7; - __m256i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); - a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); - a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); - a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); - a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); - a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); - a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); - a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); - - b0 = _mm256_unpacklo_epi16(a0, a4); - b1 = _mm256_unpacklo_epi16(a1, a5); - b2 = _mm256_unpacklo_epi16(a2, a6); - b3 = _mm256_unpacklo_epi16(a3, a7); - b4 = _mm256_unpackhi_epi16(a0, a4); - b5 = _mm256_unpackhi_epi16(a1, a5); - b6 = _mm256_unpackhi_epi16(a2, a6); - b7 = _mm256_unpackhi_epi16(a3, a7); - - a0 = _mm256_unpacklo_epi16(b0, b2); - a1 = _mm256_unpacklo_epi16(b1, b3); - a2 = _mm256_unpackhi_epi16(b0, b2); - a3 = _mm256_unpackhi_epi16(b1, b3); - a4 = _mm256_unpacklo_epi16(b4, b6); - a5 = _mm256_unpacklo_epi16(b5, b7); - a6 = _mm256_unpackhi_epi16(b4, b6); - a7 = _mm256_unpackhi_epi16(b5, b7); - - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); - b2 = _mm256_unpacklo_epi16(a2, a3); - b3 = _mm256_unpackhi_epi16(a2, a3); - b4 = _mm256_unpacklo_epi16(a4, a5); - b5 = _mm256_unpackhi_epi16(a4, a5); - b6 = _mm256_unpacklo_epi16(a6, a7); - b7 = _mm256_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); - _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); - _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); - _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); - _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); - _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); - _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); - _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); - _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); - _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); - _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); - _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); - _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); - _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); - _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); - _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); - } + EB_U32 i; + // for (i = 0; i < 4; i++) + for (i = 0; i < 2; i++) + { + __m256i a0, a1, a2, a3, a4, a5, a6, a7; + __m256i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); + a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); + a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); + a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); + a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); + a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); + a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); + a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); + + b0 = _mm256_unpacklo_epi16(a0, a4); + b1 = _mm256_unpacklo_epi16(a1, a5); + b2 = _mm256_unpacklo_epi16(a2, a6); + b3 = _mm256_unpacklo_epi16(a3, a7); + b4 = _mm256_unpackhi_epi16(a0, a4); + b5 = _mm256_unpackhi_epi16(a1, a5); + b6 = _mm256_unpackhi_epi16(a2, a6); + b7 = _mm256_unpackhi_epi16(a3, a7); + + a0 = _mm256_unpacklo_epi16(b0, b2); + a1 = _mm256_unpacklo_epi16(b1, b3); + a2 = _mm256_unpackhi_epi16(b0, b2); + a3 = _mm256_unpackhi_epi16(b1, b3); + a4 = _mm256_unpacklo_epi16(b4, b6); + a5 = _mm256_unpacklo_epi16(b5, b7); + a6 = _mm256_unpackhi_epi16(b4, b6); + a7 = _mm256_unpackhi_epi16(b5, b7); + + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); + b2 = _mm256_unpacklo_epi16(a2, a3); + b3 = _mm256_unpackhi_epi16(a2, a3); + b4 = _mm256_unpacklo_epi16(a4, a5); + b5 = _mm256_unpackhi_epi16(a4, a5); + b6 = _mm256_unpacklo_epi16(a6, a7); + b7 = _mm256_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); + _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); + _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); + _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); + _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); + _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); + _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); + _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); + _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); + _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); + _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); + _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); + _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); + _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); + _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); + _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); + } } // 16-point forward transform (16 rows) @@ -1024,434 +1024,434 @@ void PfreqTransform32x32_AVX2_INTRIN( Pfreq1DTransform32_AVX2_INTRIN(src, src_stride, intermediate, 32, 6 + addshift); PfreqTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); Pfreq2DTransform32_AVX2_INTRIN(dst, dst_stride, intermediate, 32, 9); - PfreqSecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); + PfreqSecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); return; } void PfreqN41DTransform32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) { - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); - const __m256i *coeff32 = (const __m256i *)EbHevcCoeff_tbl_AVX2; - - for (i = 0; i < 32; i += 2) - { - __m256i x0, x1, x2, x3; - __m256i y0, y1, y2, y3; - __m256i a0, a2, a4, a5; - __m256i b0, b2, b4, b5; - - //b1=s0; - //b3=s0; - - x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); - x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); - x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); - x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); - - // 32-point butterfly - x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - y0 = _mm256_add_epi16(x0, x3); - y1 = _mm256_add_epi16(x1, x2); - - y2 = _mm256_sub_epi16(x0, x3); - y3 = _mm256_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - x0 = _mm256_add_epi16(y0, y1); - x1 = _mm256_sub_epi16(y0, y1); - - x2 = y2; - x3 = y3; - - a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); - - a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); - //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); - b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); - //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); - b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); - b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); - //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); - //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); - - x0 = _mm256_packs_epi32(b0, b0); - x1 = _mm256_packs_epi32(b2, b2); - x2 = _mm256_packs_epi32(b4, b5); - //x3 = _mm256_packs_epi32(b6, b7); - - y0 = _mm256_unpacklo_epi16(x0, x1); - //y1 = _mm256_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm256_unpacklo_epi16(y0, y2); - //--// x1 = _mm256_unpackhi_epi16(y0, y2); - //x2 = _mm256_unpacklo_epi16(y1, y3); - //x3 = _mm256_unpackhi_epi16(y1, y3); - - //--// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); - //--// y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); - //--// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); - //--// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); - _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); - - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); - } + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); + const __m256i *coeff32 = (const __m256i *)EbHevcCoeff_tbl_AVX2; + + for (i = 0; i < 32; i += 2) + { + __m256i x0, x1, x2, x3; + __m256i y0, y1, y2, y3; + __m256i a0, a2, a4, a5; + __m256i b0, b2, b4, b5; + + //b1=s0; + //b3=s0; + + x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); + x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); + x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); + x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); + + // 32-point butterfly + x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + y0 = _mm256_add_epi16(x0, x3); + y1 = _mm256_add_epi16(x1, x2); + + y2 = _mm256_sub_epi16(x0, x3); + y3 = _mm256_sub_epi16(x1, x2); + + // 16-point butterfly + y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + x0 = _mm256_add_epi16(y0, y1); + x1 = _mm256_sub_epi16(y0, y1); + + x2 = y2; + x3 = y3; + + a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); + + //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); + + a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); + + //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); + + a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); + + b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); + //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); + b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); + //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); + b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); + b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); + //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); + //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); + + x0 = _mm256_packs_epi32(b0, b0); + x1 = _mm256_packs_epi32(b2, b2); + x2 = _mm256_packs_epi32(b4, b5); + //x3 = _mm256_packs_epi32(b6, b7); + + y0 = _mm256_unpacklo_epi16(x0, x1); + //y1 = _mm256_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm256_unpacklo_epi16(y0, y2); + //--// x1 = _mm256_unpackhi_epi16(y0, y2); + //x2 = _mm256_unpacklo_epi16(y1, y3); + //x3 = _mm256_unpackhi_epi16(y1, y3); + + //--// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); + //--// y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); + //--// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); + //--// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); + _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); + + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); + } } void PfreqN42DTransform32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) { - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); - const __m256i *coeff32 = (const __m256i *)EbHevcCoeff_tbl_AVX2; - - //for (i = 0; i < 16; i += 2) - for (i = 0; i < 8; i += 2) - { - __m256i x0, x1, x2, x3; - __m256i y0, y1, y2, y3; - __m256i a0, a2, a4, a5; - __m256i b0, b2, b4, b5; - - //b1=s0; - //b3=s0; - - x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); - x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); - x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); - x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); - - // 32-point butterfly - x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - y0 = _mm256_add_epi16(x0, x3); - y1 = _mm256_add_epi16(x1, x2); - - y2 = _mm256_sub_epi16(x0, x3); - y3 = _mm256_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); - - x0 = _mm256_add_epi16(y0, y1); - x1 = _mm256_sub_epi16(y0, y1); - - x2 = y2; - x3 = y3; - - a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); - - a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); - a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); - //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); - b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); - //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); - b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); - b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); - //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); - //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); - - x0 = _mm256_packs_epi32(b0, b0); - x1 = _mm256_packs_epi32(b2, b2); - x2 = _mm256_packs_epi32(b4, b5); - //x3 = _mm256_packs_epi32(b6, b7); - - y0 = _mm256_unpacklo_epi16(x0, x1); - //y1 = _mm256_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm256_unpacklo_epi16(y0, y2); - //---// x1 = _mm256_unpackhi_epi16(y0, y2); - //x2 = _mm256_unpacklo_epi16(y1, y3); - //x3 = _mm256_unpackhi_epi16(y1, y3); - - //---// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); - //---//y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); - - //---// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); - //---// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); - _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); - - - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); - //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); - } + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m256i o0 = _mm256_set1_epi32(1 << (shift - 1)); + const __m256i *coeff32 = (const __m256i *)EbHevcCoeff_tbl_AVX2; + + //for (i = 0; i < 16; i += 2) + for (i = 0; i < 8; i += 2) + { + __m256i x0, x1, x2, x3; + __m256i y0, y1, y2, y3; + __m256i a0, a2, a4, a5; + __m256i b0, b2, b4, b5; + + //b1=s0; + //b3=s0; + + x0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x00)), 0x1); + x1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x08)), 0x1); + x2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x10)), 0x1); + x3 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18))), _mm_loadu_si128((const __m128i *)(src + (i + 1)*src_stride + 0x18)), 0x1); + + // 32-point butterfly + x2 = _mm256_shuffle_epi8(x2, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + x3 = _mm256_shuffle_epi8(x3, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + y0 = _mm256_add_epi16(x0, x3); + y1 = _mm256_add_epi16(x1, x2); + + y2 = _mm256_sub_epi16(x0, x3); + y3 = _mm256_sub_epi16(x1, x2); + + // 16-point butterfly + y1 = _mm256_shuffle_epi8(y1, _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); + + x0 = _mm256_add_epi16(y0, y1); + x1 = _mm256_sub_epi16(y0, y1); + + x2 = y2; + x3 = y3; + + a0 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm256_add_epi32(a0, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[6])); + + //a1 = _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm256_add_epi32(a1, _mm256_madd_epi16(_mm256_shuffle_epi32(x0, 0xff), coeff32[7])); + + a2 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm256_add_epi32(a2, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[14])); + + //a3 = _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm256_add_epi32(a3, _mm256_madd_epi16(_mm256_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm256_add_epi32(a4, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[44])); + + a5 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[17]); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[21])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[25])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[29])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[33])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[37])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[41])); + a5 = _mm256_add_epi32(a5, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm256_add_epi32(a6, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm256_add_epi32(a7, _mm256_madd_epi16(_mm256_shuffle_epi32(x3, 0xff), coeff32[47])); + + b0 = _mm256_sra_epi32(_mm256_add_epi32(a0, o0), s0); + //b1 = _mm256_sra_epi32(_mm256_add_epi32(a1, o0), s0); + b2 = _mm256_sra_epi32(_mm256_add_epi32(a2, o0), s0); + //b3 = _mm256_sra_epi32(_mm256_add_epi32(a3, o0), s0); + b4 = _mm256_sra_epi32(_mm256_add_epi32(a4, o0), s0); + b5 = _mm256_sra_epi32(_mm256_add_epi32(a5, o0), s0); + //b6 = _mm256_sra_epi32(_mm256_add_epi32(a6, o0), s0); + //b7 = _mm256_sra_epi32(_mm256_add_epi32(a7, o0), s0); + + x0 = _mm256_packs_epi32(b0, b0); + x1 = _mm256_packs_epi32(b2, b2); + x2 = _mm256_packs_epi32(b4, b5); + //x3 = _mm256_packs_epi32(b6, b7); + + y0 = _mm256_unpacklo_epi16(x0, x1); + //y1 = _mm256_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm256_unpacklo_epi16(y0, y2); + //---// x1 = _mm256_unpackhi_epi16(y0, y2); + //x2 = _mm256_unpacklo_epi16(y1, y3); + //x3 = _mm256_unpackhi_epi16(y1, y3); + + //---// y0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 0)), _mm256_extracti128_si256(x1, 0), 0x1); + //---//y2 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm256_extracti128_si256(x0, 1)), _mm256_extracti128_si256(x1, 1), 0x1); + + //---// _mm256_storeu_si256((__m256i *)(dst + i*dst_stride), y0); + //---// _mm256_storeu_si256((__m256i *)(dst + (i + 1)*dst_stride), y2); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride), _mm256_extracti128_si256(x0, 0)); + _mm_storeu_si128((__m128i *)(dst + (i + 1)*dst_stride), _mm256_extracti128_si256(x0, 1)); + + + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x10), x2); + //_mm256_storeu_si256((__m256i *)(dst+i*dst_stride+0x18), x3); + } } void PfreqN4FirstTranspose32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i; - for (i = 0; i < 4; i++) - { - __m256i a0, a1, a2, a3, a4, a5, a6, a7; - __m256i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); - a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); - a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); - a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); - a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); - a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); - a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); - a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); - - b0 = _mm256_unpacklo_epi16(a0, a4); - b1 = _mm256_unpacklo_epi16(a1, a5); - b2 = _mm256_unpacklo_epi16(a2, a6); - b3 = _mm256_unpacklo_epi16(a3, a7); - b4 = _mm256_unpackhi_epi16(a0, a4); - b5 = _mm256_unpackhi_epi16(a1, a5); - b6 = _mm256_unpackhi_epi16(a2, a6); - b7 = _mm256_unpackhi_epi16(a3, a7); - - a0 = _mm256_unpacklo_epi16(b0, b2); - a1 = _mm256_unpacklo_epi16(b1, b3); - a2 = _mm256_unpackhi_epi16(b0, b2); - a3 = _mm256_unpackhi_epi16(b1, b3); - a4 = _mm256_unpacklo_epi16(b4, b6); - a5 = _mm256_unpacklo_epi16(b5, b7); - a6 = _mm256_unpackhi_epi16(b4, b6); - a7 = _mm256_unpackhi_epi16(b5, b7); - - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); - b2 = _mm256_unpacklo_epi16(a2, a3); - b3 = _mm256_unpackhi_epi16(a2, a3); - b4 = _mm256_unpacklo_epi16(a4, a5); - b5 = _mm256_unpackhi_epi16(a4, a5); - b6 = _mm256_unpacklo_epi16(a6, a7); - b7 = _mm256_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); - _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); - _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); - _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); - _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); - _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); - _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); - _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); - _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); - _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); - _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); - _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); - _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); - _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); - _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); - _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); - } + EB_U32 i; + for (i = 0; i < 4; i++) + { + __m256i a0, a1, a2, a3, a4, a5, a6, a7; + __m256i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 0)*src_stride)); + a1 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 1)*src_stride)); + a2 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 2)*src_stride)); + a3 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 3)*src_stride)); + a4 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 4)*src_stride)); + a5 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 5)*src_stride)); + a6 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 6)*src_stride)); + a7 = _mm256_loadu_si256((const __m256i *)(src + (8 * i + 7)*src_stride)); + + b0 = _mm256_unpacklo_epi16(a0, a4); + b1 = _mm256_unpacklo_epi16(a1, a5); + b2 = _mm256_unpacklo_epi16(a2, a6); + b3 = _mm256_unpacklo_epi16(a3, a7); + b4 = _mm256_unpackhi_epi16(a0, a4); + b5 = _mm256_unpackhi_epi16(a1, a5); + b6 = _mm256_unpackhi_epi16(a2, a6); + b7 = _mm256_unpackhi_epi16(a3, a7); + + a0 = _mm256_unpacklo_epi16(b0, b2); + a1 = _mm256_unpacklo_epi16(b1, b3); + a2 = _mm256_unpackhi_epi16(b0, b2); + a3 = _mm256_unpackhi_epi16(b1, b3); + a4 = _mm256_unpacklo_epi16(b4, b6); + a5 = _mm256_unpacklo_epi16(b5, b7); + a6 = _mm256_unpackhi_epi16(b4, b6); + a7 = _mm256_unpackhi_epi16(b5, b7); + + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); + b2 = _mm256_unpacklo_epi16(a2, a3); + b3 = _mm256_unpackhi_epi16(a2, a3); + b4 = _mm256_unpacklo_epi16(a4, a5); + b5 = _mm256_unpackhi_epi16(a4, a5); + b6 = _mm256_unpacklo_epi16(a6, a7); + b7 = _mm256_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 0)); + _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 0)); + _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 0)); + _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 0)); + _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 0)); + _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 0)); + _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 0)); + _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 0)); + _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride + 8 * i), _mm256_extracti128_si256(b0, 1)); + _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride + 8 * i), _mm256_extracti128_si256(b1, 1)); + _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride + 8 * i), _mm256_extracti128_si256(b2, 1)); + _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride + 8 * i), _mm256_extracti128_si256(b3, 1)); + _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride + 8 * i), _mm256_extracti128_si256(b4, 1)); + _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride + 8 * i), _mm256_extracti128_si256(b5, 1)); + _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride + 8 * i), _mm256_extracti128_si256(b6, 1)); + _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride + 8 * i), _mm256_extracti128_si256(b7, 1)); + } } void PfreqN4SecTranspose32_AVX2_INTRIN( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - //EB_U32 i; - // for (i = 0; i < 4; i++) - //i = 0; - { - __m256i a0, a1, a2, a3, a4, a5, a6, a7; - __m256i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */0)*src_stride)); - a1 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */1)*src_stride)); - a2 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */2)*src_stride)); - a3 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */3)*src_stride)); - a4 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */4)*src_stride)); - a5 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */5)*src_stride)); - a6 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */6)*src_stride)); - a7 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */7)*src_stride)); - - b0 = _mm256_unpacklo_epi16(a0, a4); - b1 = _mm256_unpacklo_epi16(a1, a5); - b2 = _mm256_unpacklo_epi16(a2, a6); - b3 = _mm256_unpacklo_epi16(a3, a7); - b4 = _mm256_unpackhi_epi16(a0, a4); - b5 = _mm256_unpackhi_epi16(a1, a5); - b6 = _mm256_unpackhi_epi16(a2, a6); - b7 = _mm256_unpackhi_epi16(a3, a7); - - a0 = _mm256_unpacklo_epi16(b0, b2); - a1 = _mm256_unpacklo_epi16(b1, b3); - a2 = _mm256_unpackhi_epi16(b0, b2); - a3 = _mm256_unpackhi_epi16(b1, b3); - a4 = _mm256_unpacklo_epi16(b4, b6); - a5 = _mm256_unpacklo_epi16(b5, b7); - a6 = _mm256_unpackhi_epi16(b4, b6); - a7 = _mm256_unpackhi_epi16(b5, b7); - - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); - b2 = _mm256_unpacklo_epi16(a2, a3); - b3 = _mm256_unpackhi_epi16(a2, a3); - b4 = _mm256_unpacklo_epi16(a4, a5); - b5 = _mm256_unpackhi_epi16(a4, a5); - b6 = _mm256_unpacklo_epi16(a6, a7); - b7 = _mm256_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 0)); - _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 0)); - _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b2, 0)); - _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b3, 0)); - _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b4, 0)); - _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b5, 0)); - _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b6, 0)); - _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b7, 0)); - _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 1)); - _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 1)); - _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b2, 1)); - _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b3, 1)); - _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b4, 1)); - _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b5, 1)); - _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b6, 1)); - _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b7, 1)); - } + //EB_U32 i; + // for (i = 0; i < 4; i++) + //i = 0; + { + __m256i a0, a1, a2, a3, a4, a5, a6, a7; + __m256i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */0)*src_stride)); + a1 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */1)*src_stride)); + a2 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */2)*src_stride)); + a3 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */3)*src_stride)); + a4 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */4)*src_stride)); + a5 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */5)*src_stride)); + a6 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */6)*src_stride)); + a7 = _mm256_loadu_si256((const __m256i *)(src + (/*8 * i + */7)*src_stride)); + + b0 = _mm256_unpacklo_epi16(a0, a4); + b1 = _mm256_unpacklo_epi16(a1, a5); + b2 = _mm256_unpacklo_epi16(a2, a6); + b3 = _mm256_unpacklo_epi16(a3, a7); + b4 = _mm256_unpackhi_epi16(a0, a4); + b5 = _mm256_unpackhi_epi16(a1, a5); + b6 = _mm256_unpackhi_epi16(a2, a6); + b7 = _mm256_unpackhi_epi16(a3, a7); + + a0 = _mm256_unpacklo_epi16(b0, b2); + a1 = _mm256_unpacklo_epi16(b1, b3); + a2 = _mm256_unpackhi_epi16(b0, b2); + a3 = _mm256_unpackhi_epi16(b1, b3); + a4 = _mm256_unpacklo_epi16(b4, b6); + a5 = _mm256_unpacklo_epi16(b5, b7); + a6 = _mm256_unpackhi_epi16(b4, b6); + a7 = _mm256_unpackhi_epi16(b5, b7); + + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); + b2 = _mm256_unpacklo_epi16(a2, a3); + b3 = _mm256_unpackhi_epi16(a2, a3); + b4 = _mm256_unpacklo_epi16(a4, a5); + b5 = _mm256_unpackhi_epi16(a4, a5); + b6 = _mm256_unpacklo_epi16(a6, a7); + b7 = _mm256_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + 0 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 0)); + _mm_storeu_si128((__m128i *)(dst + 1 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 0)); + _mm_storeu_si128((__m128i *)(dst + 2 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b2, 0)); + _mm_storeu_si128((__m128i *)(dst + 3 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b3, 0)); + _mm_storeu_si128((__m128i *)(dst + 4 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b4, 0)); + _mm_storeu_si128((__m128i *)(dst + 5 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b5, 0)); + _mm_storeu_si128((__m128i *)(dst + 6 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b6, 0)); + _mm_storeu_si128((__m128i *)(dst + 7 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b7, 0)); + _mm_storeu_si128((__m128i *)(dst + 8 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b0, 1)); + _mm_storeu_si128((__m128i *)(dst + 9 * dst_stride /*+ 8 * i */), _mm256_extracti128_si256(b1, 1)); + _mm_storeu_si128((__m128i *)(dst + 10 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b2, 1)); + _mm_storeu_si128((__m128i *)(dst + 11 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b3, 1)); + _mm_storeu_si128((__m128i *)(dst + 12 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b4, 1)); + _mm_storeu_si128((__m128i *)(dst + 13 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b5, 1)); + _mm_storeu_si128((__m128i *)(dst + 14 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b6, 1)); + _mm_storeu_si128((__m128i *)(dst + 15 * dst_stride/* + 8 * i*/), _mm256_extracti128_si256(b7, 1)); + } } void PfreqN4Transform32x32_AVX2_INTRIN( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) { - PfreqN41DTransform32_AVX2_INTRIN(src, src_stride, intermediate, 32, 6 + addshift); - PfreqN4FirstTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); - PfreqN42DTransform32_AVX2_INTRIN(dst, dst_stride, intermediate, 32, 9); - PfreqN4SecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); + PfreqN41DTransform32_AVX2_INTRIN(src, src_stride, intermediate, 32, 6 + addshift); + PfreqN4FirstTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); + PfreqN42DTransform32_AVX2_INTRIN(dst, dst_stride, intermediate, 32, 9); + PfreqN4SecTranspose32_AVX2_INTRIN(intermediate, 32, dst, dst_stride); - return; + return; } // forward 16x16 transform @@ -1475,285 +1475,285 @@ EB_EXTERN void lowPrecisionTransform32x32_AVX2_INTRIN(EB_S16 *src, EB_U32 src_st } void MatMult4x4_OutBuff_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32* nonzerocoeff) + EB_S16* coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32* nonzerocoeff) { - __m256i z = _mm256_setzero_si256(); - __m128i a, b; - __m256i coeffTemp, a0, a1, b0, b1, ymm_computed, MaskingMatrix, offsetREG, coeffTempORG; - (void)computeSize; + __m256i z = _mm256_setzero_si256(); + __m128i a, b; + __m256i coeffTemp, a0, a1, b0, b1, ymm_computed, MaskingMatrix, offsetREG, coeffTempORG; + (void)computeSize; - coeffTemp = a0 = a1 = b0 = b1 = ymm_computed = MaskingMatrix = offsetREG = _mm256_setzero_si256(); + coeffTemp = a0 = a1 = b0 = b1 = ymm_computed = MaskingMatrix = offsetREG = _mm256_setzero_si256(); - // prepare Shift REG - __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum); //_mm_set1_epi16((EB_U16)shiftNum);//_mm_set1_epi32(shiftNum); + // prepare Shift REG + __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum); //_mm_set1_epi16((EB_U16)shiftNum);//_mm_set1_epi32(shiftNum); - //prepare the offset - offsetREG = _mm256_set1_epi32(offset); + //prepare the offset + offsetREG = _mm256_set1_epi32(offset); - //load maskingMatrix_new - MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)maskingMatrix), _mm_loadl_epi64((__m128i*)(maskingMatrix + maskingMatrixStride)))), _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(maskingMatrix + 2 * maskingMatrixStride)), _mm_loadl_epi64((__m128i*)(maskingMatrix + 3 * maskingMatrixStride))), 0x1); + //load maskingMatrix_new + MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)maskingMatrix), _mm_loadl_epi64((__m128i*)(maskingMatrix + maskingMatrixStride)))), _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(maskingMatrix + 2 * maskingMatrixStride)), _mm_loadl_epi64((__m128i*)(maskingMatrix + 3 * maskingMatrixStride))), 0x1); - //load coefftemp - a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block - b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block - coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(a), b, 0x1); // the 4x4 block is now loaded + //load coefftemp + a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block + b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block + coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(a), b, 0x1); // the 4x4 block is now loaded - coeffTempORG = coeffTemp; - //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); + coeffTempORG = coeffTemp; + //Absolute val + coeffTemp = _mm256_abs_epi16(coeffTemp); - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); - a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); - b0 = _mm256_add_epi32(b0, offsetREG); - b1 = _mm256_add_epi32(b1, offsetREG); + b0 = _mm256_add_epi32(b0, offsetREG); + b1 = _mm256_add_epi32(b1, offsetREG); - //Shift right by PMP_PRECISION_REG - b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); - b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); + //Shift right by PMP_PRECISION_REG + b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); + b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - a = _mm256_extracti128_si256(ymm_computed, 0); - b = _mm256_extracti128_si256(ymm_computed, 1); - _mm_storel_epi64((__m128i *) coeffOut, a); - _mm_storel_epi64((__m128i *)(coeffOut + 1 * coeffOutStride), _mm_srli_si128(a, 8)); - _mm_storel_epi64((__m128i *)(coeffOut + 2 * coeffOutStride), b); - _mm_storel_epi64((__m128i *)(coeffOut + 3 * coeffOutStride), _mm_srli_si128(b, 8)); + a = _mm256_extracti128_si256(ymm_computed, 0); + b = _mm256_extracti128_si256(ymm_computed, 1); + _mm_storel_epi64((__m128i *) coeffOut, a); + _mm_storel_epi64((__m128i *)(coeffOut + 1 * coeffOutStride), _mm_srli_si128(a, 8)); + _mm_storel_epi64((__m128i *)(coeffOut + 2 * coeffOutStride), b); + _mm_storel_epi64((__m128i *)(coeffOut + 3 * coeffOutStride), _mm_srli_si128(b, 8)); - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); - *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); + *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); } /*****************************************************************************************************************************************************************/ void MatMult4x4_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff) + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff) { - __m256i z = _mm256_setzero_si256(); - __m128i a, b; - __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,offsetREG,coeffTempORG; + __m256i z = _mm256_setzero_si256(); + __m128i a, b; + __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,offsetREG,coeffTempORG; (void)computeSize; coeffTemp = a0 = a1 = b0 = b1 = ymm_computed = MaskingMatrix = offsetREG = _mm256_setzero_si256(); - // prepare Shift REG + // prepare Shift REG __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum); //_mm_set1_epi16((EB_U16)shiftNum);//_mm_set1_epi32(shiftNum); - //prepare the offset - offsetREG = _mm256_set1_epi32(offset); + //prepare the offset + offsetREG = _mm256_set1_epi32(offset); - //load maskingMatrix_new + //load maskingMatrix_new MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)maskingMatrix), _mm_loadl_epi64((__m128i*)(maskingMatrix + maskingMatrixStride)))), _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(maskingMatrix + 2 * maskingMatrixStride)), _mm_loadl_epi64((__m128i*)(maskingMatrix + 3 * maskingMatrixStride))), 0x1); - //load coefftemp - a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block - b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block - coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256( a),b,0x1); // the 4x4 block is now loaded + //load coefftemp + a = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)coeff), _mm_loadl_epi64((__m128i*)(coeff + coeffStride))); // 1st and 2nd row of the 4x4 block + b = _mm_unpacklo_epi64(_mm_loadl_epi64((__m128i*)(coeff + 2 * coeffStride)), _mm_loadl_epi64((__m128i*)(coeff + 3 * coeffStride))); // 3rd and 4th row of the 4x4 block + coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256( a),b,0x1); // the 4x4 block is now loaded - coeffTempORG = coeffTemp; + coeffTempORG = coeffTemp; //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); + coeffTemp = _mm256_abs_epi16(coeffTemp); - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - b0 = _mm256_unpacklo_epi16(a0, a1); + b0 = _mm256_unpacklo_epi16(a0, a1); b1 = _mm256_unpackhi_epi16(a0, a1); - b0 = _mm256_add_epi32(b0, offsetREG); + b0 = _mm256_add_epi32(b0, offsetREG); b1 = _mm256_add_epi32(b1, offsetREG); - //Shift right by PMP_PRECISION_REG - b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); + //Shift right by PMP_PRECISION_REG + b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from a and b to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - a = _mm256_extracti128_si256(ymm_computed, 0); + a = _mm256_extracti128_si256(ymm_computed, 0); b = _mm256_extracti128_si256(ymm_computed, 1); _mm_storel_epi64((__m128i *)coeff, a); _mm_storel_epi64((__m128i *)(coeff + coeffStride), _mm_srli_si128(a, 8)); _mm_storel_epi64((__m128i *)(coeff + 2 * coeffStride), b); _mm_storel_epi64((__m128i *)(coeff + 3 * coeffStride), _mm_srli_si128(b, 8)); - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 8)); *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); } /*******************************************MatMult8x8_AVX2_INTRIN**************************************************/ void MatMult8x8_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff) + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff) { - unsigned row; - __m256i z = _mm256_setzero_si256(); - //__m128i a, b; - __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; + unsigned row; + __m256i z = _mm256_setzero_si256(); + //__m128i a, b; + __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; coeffTemp = a0 = a1 = b0 = b1 = ymm_computed =MaskingMatrix= _mm256_setzero_si256(); - // prepare Shift REG + // prepare Shift REG __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum);//_mm_set1_epi32(shiftNum); - //prepare the offset - __m256i offsetREG = _mm256_set1_epi32(offset); - row = 0; + //prepare the offset + __m256i offsetREG = _mm256_set1_epi32(offset); + row = 0; do { - //load maskingMatrix_new + //load maskingMatrix_new MaskingMatrix = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(maskingMatrix + maskingMatrixStride*row))), _mm_loadu_si128((__m128i*)(maskingMatrix + maskingMatrixStride*(row + 1))), 0x1); - //load coefftemp - coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(coeff + coeffStride*row))), + //load coefftemp + coeffTemp = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)(coeff + coeffStride*row))), _mm_loadu_si128((__m128i*)(coeff + coeffStride*(row + 1))), 0x1); - coeffTempORG = coeffTemp; + coeffTempORG = coeffTemp; //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); + coeffTemp = _mm256_abs_epi16(coeffTemp); - //Multiply - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + //Multiply + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - b0 = _mm256_unpacklo_epi16(a0, a1); + b0 = _mm256_unpacklo_epi16(a0, a1); b1 = _mm256_unpackhi_epi16(a0, a1); - //Add - b0 = _mm256_add_epi32(b0, offsetREG); + //Add + b0 = _mm256_add_epi32(b0, offsetREG); b1 = _mm256_add_epi32(b1, offsetREG); - //Shift right by PMP_PRECISION_REG + //Shift right by PMP_PRECISION_REG b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - _mm_storeu_si128((__m128i *)(coeff + coeffStride*row), _mm256_extracti128_si256(ymm_computed, 0)); + _mm_storeu_si128((__m128i *)(coeff + coeffStride*row), _mm256_extracti128_si256(ymm_computed, 0)); _mm_storeu_si128((__m128i *)(coeff + coeffStride*(row + 1)), _mm256_extracti128_si256(ymm_computed, 1)); - row += 2; + row += 2; } while (row < computeSize); - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); } /***************************************MatMultNxN_AVX2_INTRIN****************************************************/ void MatMultNxN_AVX2_INTRIN( - EB_S16* coeff, - const EB_U32 coeffStride, + EB_S16* coeff, + const EB_U32 coeffStride, const EB_U16 *maskingMatrix, const EB_U32 maskingMatrixStride, //Matrix size const EB_U32 computeSize, //Computation area size - const EB_S32 offset, //(PMP_MAX >> 1) - const EB_S32 shiftNum, //PMP_PRECISION - EB_U32* nonzerocoeff) + const EB_S32 offset, //(PMP_MAX >> 1) + const EB_S32 shiftNum, //PMP_PRECISION + EB_U32* nonzerocoeff) { - unsigned row,col; - __m256i z = _mm256_setzero_si256(); - //__m128i a, b; - __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; + unsigned row,col; + __m256i z = _mm256_setzero_si256(); + //__m128i a, b; + __m256i coeffTemp,a0,a1,b0,b1,ymm_computed,MaskingMatrix,coeffTempORG; coeffTemp = a0 = a1 = b0 = b1 = ymm_computed =MaskingMatrix = _mm256_setzero_si256(); - // prepare Shift REG + // prepare Shift REG __m128i PMP_PRECISION_REG = _mm_set_epi16(0, 0, 0, 0, 0, 0, 0, (EB_S16)shiftNum);//_mm_set1_epi32(shiftNum); - //prepare the offset - __m256i offsetREG = _mm256_set1_epi32(offset); + //prepare the offset + __m256i offsetREG = _mm256_set1_epi32(offset); - row = 0; - do { - col = 0; - do { + row = 0; + do { + col = 0; + do { - //load coefftemp - coeffTemp = _mm256_loadu_si256((__m256i *)(coeff + coeffStride*row + col)); + //load coefftemp + coeffTemp = _mm256_loadu_si256((__m256i *)(coeff + coeffStride*row + col)); - //load maskingMatrix_new + //load maskingMatrix_new MaskingMatrix = _mm256_loadu_si256((__m256i *) (maskingMatrix + maskingMatrixStride*row + col)); coeffTempORG = coeffTemp; - //Absolute val - coeffTemp = _mm256_abs_epi16(coeffTemp); + //Absolute val + coeffTemp = _mm256_abs_epi16(coeffTemp); - //Multiply - a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); - a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); + //Multiply + a0 = _mm256_mullo_epi16(coeffTemp, MaskingMatrix); + a1 = _mm256_mulhi_epi16(coeffTemp, MaskingMatrix); - b0 = _mm256_unpacklo_epi16(a0, a1); - b1 = _mm256_unpackhi_epi16(a0, a1); + b0 = _mm256_unpacklo_epi16(a0, a1); + b1 = _mm256_unpackhi_epi16(a0, a1); - //Add - b0 = _mm256_add_epi32(b0, offsetREG); - b1 = _mm256_add_epi32(b1, offsetREG); + //Add + b0 = _mm256_add_epi32(b0, offsetREG); + b1 = _mm256_add_epi32(b1, offsetREG); - //Shift right by PMP_PRECISION_REG - b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); - b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); + //Shift right by PMP_PRECISION_REG + b0 = _mm256_sra_epi32(b0, PMP_PRECISION_REG); + b1 = _mm256_sra_epi32(b1, PMP_PRECISION_REG); - //coefftemp in c - ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. - z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; + //coefftemp in c + ymm_computed = _mm256_packs_epi32(b0, b1);//Convert packed 32-bit integers from b0 and b1 to packed 16-bit integers using signed saturation, and store the results in dst. + z = _mm256_sub_epi16(z, _mm256_cmpgt_epi16(ymm_computed, _mm256_setzero_si256())); //coeffTemp = (coeff[coeffLocation] < 0)? -coeffTemp : coeffTemp; - ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); + ymm_computed = _mm256_sign_epi16(ymm_computed, coeffTempORG);// coeffTemp); - _mm256_storeu_si256((__m256i *)(coeff + coeffStride*row + col), ymm_computed); + _mm256_storeu_si256((__m256i *)(coeff + coeffStride*row + col), ymm_computed); - col += 16; + col += 16; } while (col < computeSize); - row++; + row++; } while (row < computeSize); - z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); + z = _mm256_sad_epu8(z, _mm256_srli_si256(z, 7)); *nonzerocoeff = _mm_cvtsi128_si32(_mm_add_epi32(_mm256_extracti128_si256(z, 0), _mm256_extracti128_si256(z, 1))); } diff --git a/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c index 066ec0f13..c38852fe1 100644 --- a/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbApplySaoLcu16bit_Intrinsic_SSE2.c @@ -16,7 +16,7 @@ EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( EB_U32 lcuWidth) { reconStride -= lcuWidth ; - + EB_U32 width_cnt, height_cnt; EB_ERRORTYPE return_error = EB_ErrorNone; __m128i xmm_0 = _mm_setzero_si128(); @@ -34,7 +34,7 @@ EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( xmm_saoBandPosition = _mm_unpacklo_epi64(xmm_saoBandPosition, xmm_saoBandPosition); xmm_Offset0_3 = _mm_cvtsi32_si128(*(EB_S32*)saoOffsetPtr); - xmm_Offset0_3 = _mm_unpacklo_epi8(xmm_Offset0_3, xmm_Offset0_3); + xmm_Offset0_3 = _mm_unpacklo_epi8(xmm_Offset0_3, xmm_Offset0_3); xmm_Offset0_3 = _mm_unpacklo_epi16(xmm_Offset0_3, xmm_Offset0_3); xmm_Offset0_3_lo = _mm_unpacklo_epi32(xmm_Offset0_3, xmm_Offset0_3); xmm_Offset0_3_hi = _mm_unpackhi_epi32(xmm_Offset0_3, xmm_Offset0_3); @@ -49,7 +49,7 @@ EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( rec_0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); rec_8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - + //(boIndex < saoBandPosition || boIndex > saoBandPosition + SAO_BO_LEN - 1) ? 0 : saoOffsetPtr[boIndex - saoBandPosition] boIdx_sub_saoBandPosn = _mm_sub_epi8(_mm_packus_epi16(_mm_srli_epi16(rec_0_7, 5), _mm_srli_epi16(rec_8_15, 5)), xmm_saoBandPosition); cmp_result = _mm_and_si128(_mm_cmpeq_epi8(boIdx_sub_saoBandPosn, xmm_0), saoOffset0); @@ -99,7 +99,7 @@ EB_ERRORTYPE SAOApplyEO_90_16bit_SSE2_INTRIN( saoOffset3 = _mm_shuffle_epi32(saoOffset0_4, 0xff); for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + reconSamplePtrTemp = reconSamplePtr; tempBufUpper0_7 = _mm_loadu_si128((__m128i *)(temporalBufferUpper)); tempBufUpper8_15 = _mm_loadu_si128((__m128i *)(temporalBufferUpper + 8)); @@ -107,10 +107,10 @@ EB_ERRORTYPE SAOApplyEO_90_16bit_SSE2_INTRIN( recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtrTemp)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtrTemp + 8)); signTop = _mm_packs_epi16(_mm_sub_epi16(tempBufUpper0_7, recon0_7), _mm_sub_epi16(tempBufUpper8_15, recon8_15)); - + // -signTop - 1 nSignTop = _mm_sub_epi8(xmm_N2, _mm_add_epi8(_mm_cmpgt_epi8(signTop, xmm_0), _mm_cmpgt_epi8(signTop, xmm_N1))); - + for (height_cnt = 0; height_cnt < lcuHeight; ++height_cnt) { __m128i recon_s0_s7, recon_s8_s15, signBottom, nSignTotal, saoOffset_eo, sign, clipped_0_7, clipped_8_15; @@ -189,13 +189,13 @@ EB_ERRORTYPE SAOApplyEO_0_16bit_SSE2_INTRIN( signLeft = _mm_packs_epi16(_mm_sub_epi16(_mm_or_si128(_mm_slli_si128(recon0_7, 2), _mm_and_si128(tempBufferLeft, xmm_255)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 7)), recon8_15)); - + signRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 9)), recon8_15)); eoIndex = _mm_add_epi8(_mm_add_epi8(_mm_cmpgt_epi8(signLeft, xmm_0), _mm_cmpgt_epi8(signLeft, xmm_N1)), _mm_add_epi8(_mm_cmpgt_epi8(signRight, xmm_0), _mm_cmpgt_epi8(signRight, xmm_N1))); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_N4), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_N3), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_N1), saoOffset2), @@ -205,7 +205,7 @@ EB_ERRORTYPE SAOApplyEO_0_16bit_SSE2_INTRIN( clip3_0_7 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(recon0_7, _mm_unpacklo_epi8(saoOffset_eo, sign)), xmm_Max10bit), xmm_0); clip3_8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(recon8_15, _mm_unpackhi_epi8(saoOffset_eo, sign)), xmm_Max10bit), xmm_0); - + recon15_22 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 15)); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip3_0_7); @@ -223,7 +223,7 @@ EB_ERRORTYPE SAOApplyEO_0_16bit_SSE2_INTRIN( recon16_23 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon23_30 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 7)); recon24_31 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - + signLeft = _mm_packs_epi16(_mm_sub_epi16(recon15_22, recon16_23), _mm_sub_epi16(recon23_30, recon24_31)); signRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + 1)), recon16_23), @@ -284,7 +284,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( saoOffset1 = _mm_shuffle_epi32(saoOffset0_4, 0x55); //1111111111111111 saoOffset2 = _mm_shuffle_epi32(saoOffset0_4, 0xaa); saoOffset3 = _mm_shuffle_epi32(saoOffset0_4, 0xff); - + // First row for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { @@ -299,7 +299,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( signBotRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 9)), recon8_15)); signBotRight = _mm_add_epi8(_mm_cmpgt_epi8(signBotRight, xmm_0), _mm_cmpgt_epi8(signBotRight, xmm_n1)); - + eoIndex = _mm_add_epi8(signTopLeft, signBotRight); _mm_storeu_si128((__m128i *)(signTLBuf + 1), signBotRight); // the next signTopLeft signTLBuf += 16; @@ -321,21 +321,21 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( EB_S32 count; signTLBuf -= lcuWidth; reconSamplePtr += reconStrideTemp; - + __m128i xmm_n2 = _mm_set1_epi8(-2); __m128i xmm_1 = _mm_set1_epi8(1); __m128i left; lcuHeight--; // Already written first row, total number for rows decrease by 1 lcuWidth -= 16; - + for (height_cnt = lcuHeight; height_cnt > 0 ; height_cnt -= 8) { //count backwards as it helps with the subsequence for loop's exit condition - + left = _mm_loadu_si128((__m128i *)(temporalBufferLeft)); temporalBufferLeft += 8; - + for (count = 0; count < (height_cnt == 7 ? 7 : 8); ++count) { - + recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); signTopLeft = _mm_sub_epi16(recon0_7, left); @@ -364,7 +364,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( reconSamplePtr += 16; for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + signTLBuf += 16; recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); @@ -388,7 +388,7 @@ extern EB_ERRORTYPE SAOApplyEO_135_16bit_SSE2_INTRIN( reconSamplePtr += 16; } signTLBuf -= lcuWidth; - reconSamplePtr += reconStrideTemp; + reconSamplePtr += reconStrideTemp; } } return EB_ErrorNone; @@ -405,12 +405,12 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( { EB_ALIGN(16) EB_S8 signTopRightTempBuffer[MAX_LCU_SIZE + 1]; EB_ALIGN(16) EB_S8 * signTopRightBufp = signTopRightTempBuffer; - + __m128i xmm_1, xmm_0, xmm_n1, xmm_n2, xmm_n3, xmm_n4, Max10bit, saoOffset0_7, saoOffset0_4, saoOffset0, saoOffset1, saoOffset2, saoOffset3; __m128i recon0_7, recon8_15, signBotLeft, signTopRight, eoIndex, sign, saoOffset_eo, clip0_7, clip8_15, xmm_temporalBufLeft, signBotLeft0, keep_lsb_mask; EB_U32 width_cnt; EB_S32 reconStrideTemp, height_cnt, count; - + xmm_0 = _mm_setzero_si128(); xmm_n1 = _mm_set1_epi8(-1); xmm_n3 = _mm_set1_epi8(-3); @@ -427,11 +427,11 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( saoOffset1 = _mm_shuffle_epi32(saoOffset0_4, 0x55); //1111111111111111 saoOffset2 = _mm_shuffle_epi32(saoOffset0_4, 0xaa); saoOffset3 = _mm_shuffle_epi32(saoOffset0_4, 0xff); - + //Seek to beginning of last row - + temporalBufferLeft += (lcuHeight - 7); - reconSamplePtr += (reconStride * (lcuHeight - 1)); + reconSamplePtr += (reconStride * (lcuHeight - 1)); lcuHeight -= 2; // First row and last row are done separately lcuWidth -= 16; // First col has different eoIndex calculation thus is not done in loop @@ -459,7 +459,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( eoIndex = _mm_add_epi8(signBotLeft, signTopRight); _mm_storeu_si128((__m128i *)(signTopRightBufp + 1), signTopRight); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n4), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n3), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n1), saoOffset2), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_0), saoOffset3))); @@ -468,13 +468,13 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - + reconSamplePtr += 16; for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + signTopRightBufp += 16; - + recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); @@ -490,7 +490,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( eoIndex = _mm_add_epi8(signBotLeft, signTopRight); _mm_storeu_si128((__m128i *)(signTopRightBufp + 1), signTopRight); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n4), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n3), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n1), saoOffset2), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_0), saoOffset3))); @@ -500,13 +500,13 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - reconSamplePtr += 16; + reconSamplePtr += 16; } reconStrideTemp = -1 *(reconStride) - lcuWidth - 16; signTopRightBufp -= lcuWidth; reconSamplePtr += reconStrideTemp; - + xmm_1 = _mm_set1_epi8(1); xmm_n2 = _mm_set1_epi8(-2); @@ -519,20 +519,20 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( recon0_7 = _mm_loadu_si128((__m128i *)reconSamplePtr); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - + signBotLeft = _mm_sub_epi16(recon0_7, _mm_srli_si128(xmm_temporalBufLeft, 14)); - + signBotLeft = _mm_and_si128(keep_lsb_mask, _mm_add_epi8(_mm_cmpgt_epi16(signBotLeft, xmm_0), _mm_cmpgt_epi16(signBotLeft, xmm_n1))); signBotLeft = _mm_or_si128(_mm_slli_si128(_mm_loadu_si128((__m128i *)(signTopRightBufp + 1)), 1), signBotLeft); - + signTopRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 9)), recon8_15)); - + signTopRight = _mm_add_epi8(_mm_cmpgt_epi8(signTopRight, xmm_0), _mm_cmpgt_epi8(signTopRight, xmm_n1)); - + eoIndex = _mm_sub_epi8(signBotLeft, signTopRight); - + signBotLeft = _mm_load_si128((__m128i *)(signTopRightBufp + 16)); // Variable is used in nested for loop below _mm_storeu_si128((__m128i *)(signTopRightBufp + 1), signTopRight); @@ -547,7 +547,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - + // Next iteration xmm_temporalBufLeft = _mm_slli_si128(xmm_temporalBufLeft, 2); reconSamplePtr += 16; @@ -562,11 +562,11 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( signTopRight = _mm_packs_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 1)), recon0_7), _mm_sub_epi16(_mm_loadu_si128((__m128i *)(reconSamplePtr - reconStride + 9)), recon8_15)); signTopRight = _mm_add_epi8(_mm_cmpgt_epi8(signTopRight, xmm_0), _mm_cmpgt_epi8(signTopRight, xmm_n1)); - + eoIndex = _mm_sub_epi8(signBotLeft, signTopRight); - + signBotLeft = _mm_load_si128((__m128i *)(signTopRightBufp + 16)); //Next iteration - + _mm_storeu_si128((__m128i*)(signTopRightBufp + 1), signTopRight); saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpgt_epi8(eoIndex, xmm_1), saoOffset0), @@ -578,11 +578,11 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); - + reconSamplePtr += 16; } signTopRightBufp -= lcuWidth; - reconSamplePtr += reconStrideTemp; + reconSamplePtr += reconStrideTemp; } } @@ -591,7 +591,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); recon8_15 = _mm_loadu_si128((__m128i *)(reconSamplePtr + 8)); - signBotLeft = _mm_sub_epi16(recon0_7, _mm_srli_si128(xmm_temporalBufLeft, 14)); + signBotLeft = _mm_sub_epi16(recon0_7, _mm_srli_si128(xmm_temporalBufLeft, 14)); xmm_temporalBufLeft = _mm_slli_si128(xmm_temporalBufLeft, 2); signBotLeft = _mm_and_si128(keep_lsb_mask, _mm_add_epi8(_mm_cmpgt_epi16(signBotLeft, xmm_0), _mm_cmpgt_epi16(signBotLeft, xmm_n1))); @@ -612,19 +612,19 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_1), saoOffset1)), _mm_or_si128(_mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n1), saoOffset2), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_n2), saoOffset3))); - + sign = _mm_cmpgt_epi8(xmm_0, saoOffset_eo); - + clip0_7 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpacklo_epi8(saoOffset_eo, sign), recon0_7 ), Max10bit), xmm_0); clip8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_unpackhi_epi8(saoOffset_eo, sign), recon8_15), Max10bit), xmm_0); - + _mm_storeu_si128((__m128i *)(reconSamplePtr), clip0_7); _mm_storeu_si128((__m128i *)(reconSamplePtr + 8), clip8_15); reconSamplePtr += 16; - + for (width_cnt = 0; width_cnt < lcuWidth; width_cnt += 16) { - + signTopRightBufp += 16; recon0_7 = _mm_loadu_si128((__m128i *)(reconSamplePtr)); @@ -637,7 +637,7 @@ EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( eoIndex = _mm_sub_epi8(signBotLeft, signTopRight); signBotLeft = _mm_load_si128((__m128i *)(signTopRightBufp + 16)); //Used in the next iteration _mm_storeu_si128((__m128i*)(signTopRightBufp + 1), signTopRight); - + saoOffset_eo = _mm_or_si128(_mm_or_si128(_mm_and_si128(_mm_cmpgt_epi8(eoIndex, xmm_1), saoOffset0), _mm_and_si128(_mm_cmpeq_epi8(eoIndex, xmm_1), saoOffset1)), diff --git a/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c index a79484f68..e0e5ed035 100644 --- a/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbAvcStyleMcp_Intrinsic_SSE2.c @@ -26,307 +26,307 @@ void AvcStyleCopy_SSE2( //This function should be removed and replace by AvcStyleCopy_SSE2 void PictureAverageKernel_SSE2_INTRIN( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6, xmm_avg7, xmm_avg8; - EB_U32 y; - - if (areaWidth > 16) - { - if (areaWidth == 24) - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 32) - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 48) - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); - _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - - } - } - else - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); - - xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); - - _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); - _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); - _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); - _mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - } - else - { - if (areaWidth == 16) - { - for (y = 0; y < areaHeight; y += 2){ - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); + __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4, xmm_avg5, xmm_avg6, xmm_avg7, xmm_avg8; + EB_U32 y; + + if (areaWidth > 16) + { + if (areaWidth == 24) + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + 16)), _mm_loadl_epi64((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride + 16)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + _mm_storel_epi64((__m128i*) (dst + dstStride + 16), xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 32) + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 48) + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg4); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg5); + _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg6); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + + } + } + else + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); + + xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); + + _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); + _mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); + _mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); + _mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + } + else + { + if (areaWidth == 16) + { + for (y = 0; y < areaHeight; y += 2){ + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); _mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 4) - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); - - *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); - *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else if (areaWidth == 8) - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - else - { - for (y = 0; y < areaHeight; y += 2){ - - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); - - xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); - - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); - _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); - *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); - - src0 += src0Stride << 1; - src1 += src1Stride << 1; - dst += dstStride << 1; - } - } - } + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 4) + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); + + *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); + *(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else if (areaWidth == 8) + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + else + { + for (y = 0; y < areaHeight; y += 2){ + + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); + + xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); + + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); + _mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); + *(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); + + src0 += src0Stride << 1; + src1 += src1Stride << 1; + dst += dstStride << 1; + } + } + } } void PictureAverageKernel1Line_SSE2_INTRIN( - EB_BYTE src0, - EB_BYTE src1, - EB_BYTE dst, - EB_U32 areaWidth) + EB_BYTE src0, + EB_BYTE src1, + EB_BYTE dst, + EB_U32 areaWidth) { - __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4; + __m128i xmm_avg1, xmm_avg2, xmm_avg3, xmm_avg4; - if (areaWidth > 16) - { - if (areaWidth == 32) - { - //for (y = 0; y < areaHeight; y += 2) + if (areaWidth > 16) + { + if (areaWidth == 32) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - //xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - //xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); - - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else - { - //for (y = 0; y < areaHeight; y += 2) + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + //xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + //xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg3); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg4); + + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); - xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); - xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); - - //xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - //xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); - //xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); - //xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); - - _mm_storeu_si128((__m128i*) dst, xmm_avg1); - _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); - _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); - _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); - - //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); - //_mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); - - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - } - else - { - if (areaWidth == 16) - { - //for (y = 0; y < areaHeight; y += 2) + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 16)), _mm_loadu_si128((__m128i*)(src1 + 16))); + xmm_avg3 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 32)), _mm_loadu_si128((__m128i*)(src1 + 32))); + xmm_avg4 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + 48)), _mm_loadu_si128((__m128i*)(src1 + 48))); + + //xmm_avg5 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + //xmm_avg6 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 16)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 16))); + //xmm_avg7 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 32)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 32))); + //xmm_avg8 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride + 48)), _mm_loadu_si128((__m128i*)(src1 + src1Stride + 48))); + + _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) (dst + 16), xmm_avg2); + _mm_storeu_si128((__m128i*) (dst + 32), xmm_avg3); + _mm_storeu_si128((__m128i*) (dst + 48), xmm_avg4); + + //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg5); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 16), xmm_avg6); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 32), xmm_avg7); + //_mm_storeu_si128((__m128i*) (dst + dstStride + 48), xmm_avg8); + + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + } + else + { + if (areaWidth == 16) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); - //xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); + xmm_avg1 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)src0), _mm_loadu_si128((__m128i*)src1)); + //xmm_avg2 = _mm_avg_epu8(_mm_loadu_si128((__m128i*)(src0 + src0Stride)), _mm_loadu_si128((__m128i*)(src1 + src1Stride))); - _mm_storeu_si128((__m128i*) dst, xmm_avg1); + _mm_storeu_si128((__m128i*) dst, xmm_avg1); //_mm_storeu_si128((__m128i*) (dst + dstStride), xmm_avg2); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else if (areaWidth == 4) - { - //for (y = 0; y < areaHeight; y += 2) + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else if (areaWidth == 4) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); - //xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); + xmm_avg1 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src0), _mm_cvtsi32_si128(*(EB_U32 *)src1)); + //xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride))); - *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); - //*(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); + *(EB_U32 *)dst = _mm_cvtsi128_si32(xmm_avg1); + //*(EB_U32 *)(dst + dstStride) = _mm_cvtsi128_si32(xmm_avg2); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else if (areaWidth == 8) - { - //for (y = 0; y < areaHeight; y += 2) + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else if (areaWidth == 8) + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - //xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + //xmm_avg2 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg2); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - else - { - //for (y = 0; y < areaHeight; y += 2) + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + else + { + //for (y = 0; y < areaHeight; y += 2) { - xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); - xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); + xmm_avg1 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)src0), _mm_loadl_epi64((__m128i*)src1)); + xmm_avg2 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + 8))); - //xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); - //xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); + //xmm_avg3 = _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(src0 + src0Stride)), _mm_loadl_epi64((__m128i*)(src1 + src1Stride))); + //xmm_avg4 = _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src0 + src0Stride + 8)), _mm_cvtsi32_si128(*(EB_U32 *)(src1 + src1Stride + 8))); - _mm_storel_epi64((__m128i*) dst, xmm_avg1); - *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); - //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); - //*(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); + _mm_storel_epi64((__m128i*) dst, xmm_avg1); + *(EB_U32 *)(dst + 8) = _mm_cvtsi128_si32(xmm_avg2); + //_mm_storel_epi64((__m128i*) (dst + dstStride), xmm_avg3); + //*(EB_U32 *)(dst + dstStride + 8) = _mm_cvtsi128_si32(xmm_avg4); - //src0 += src0Stride << 1; - //src1 += src1Stride << 1; - //dst += dstStride << 1; - } - } - } + //src0 += src0Stride << 1; + //src1 += src1Stride << 1; + //dst += dstStride << 1; + } + } + } } diff --git a/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c index 4916783d8..a7f8c0815 100644 --- a/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbCombinedAveragingSAD_Intrinsic_SSE2.c @@ -11,21 +11,21 @@ EB_U32 Compute4xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { EB_U32 y; (void)width; __m128i xmm_sad = _mm_setzero_si128(); for (y = 0; y < height; y+=4) { - + xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)src), _mm_cvtsi32_si128(*(EB_U32*)ref))); xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(src+srcStride)), _mm_cvtsi32_si128(*(EB_U32*)(ref+refStride)))); xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(src+(srcStride << 1))), _mm_cvtsi32_si128(*(EB_U32*)(ref+(refStride << 1))))); xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32*)(src+3*srcStride)), _mm_cvtsi32_si128(*(EB_U32*)(ref+ 3*refStride)))); - + src += (srcStride << 2); ref += (refStride << 2); } @@ -36,14 +36,14 @@ EB_U32 Compute8xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { EB_U32 y; (void)width; __m128i xmm_sad = _mm_setzero_si128(); - + for (y = 0; y < height; y+=4) { xmm_sad = _mm_add_epi16(xmm_sad, _mm_sad_epu8( _mm_loadl_epi64((__m128i*)src), _mm_loadl_epi64((__m128i*)ref))); @@ -62,21 +62,21 @@ EB_U32 Compute16xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { __m128i xmm_sad = _mm_setzero_si128(); EB_U32 y; (void)width; for (y = 0; y < height; y += 4) { - + xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride << 1))), _mm_loadu_si128((__m128i*)(ref + (refStride << 1))))); xmm_sad = _mm_add_epi32(xmm_sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 3*srcStride)), _mm_loadu_si128((__m128i*)(ref + 3*refStride)))); - + src += (srcStride << 2); ref += (refStride << 2); } @@ -90,9 +90,9 @@ EB_U32 Compute64xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width) // input parameter, block width (N) + EB_U32 width) // input parameter, block width (N) { __m128i sad; (void)width; @@ -101,22 +101,22 @@ EB_U32 Compute64xMSad_SSE2_INTRIN( sad = _mm_setzero_si128(); for (y = 0; y < height; y+=4) { - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+16)), _mm_loadu_si128((__m128i*)(ref+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+32)), _mm_loadu_si128((__m128i*)(ref+32)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+48)), _mm_loadu_si128((__m128i*)(ref+48)))); - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride)), _mm_loadu_si128((__m128i*)(ref+refStride)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride+16)), _mm_loadu_si128((__m128i*)(ref+refStride+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride+32)), _mm_loadu_si128((__m128i*)(ref+refStride+32)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride+48)), _mm_loadu_si128((__m128i*)(ref+refStride+48)))); - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride)), _mm_loadu_si128((__m128i*)(ref+2*refStride)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+16)), _mm_loadu_si128((__m128i*)(ref+2*refStride+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+32)), _mm_loadu_si128((__m128i*)(ref+2*refStride+32)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+48)), _mm_loadu_si128((__m128i*)(ref+2*refStride+48)))); - + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3 * srcStride )), _mm_loadu_si128((__m128i*)(ref+3 * refStride)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3 * srcStride +16)), _mm_loadu_si128((__m128i*)(ref+3 * refStride+16)))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3 * srcStride +32)), _mm_loadu_si128((__m128i*)(ref+3 * refStride+32)))); @@ -125,7 +125,7 @@ EB_U32 Compute64xMSad_SSE2_INTRIN( src += 4 * srcStride; ref += 4 * refStride; } - + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); return _mm_cvtsi128_si32(sad); } @@ -141,21 +141,21 @@ EB_U32 CombinedAveraging4xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0,sad1; + __m128i sad0,sad1; EB_U32 y; - (void)width; + (void)width; sad0 = sad1 = _mm_setzero_si128(); - + for (y = 0; y < height; y+=2) { - + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32 *)src), _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)ref1), _mm_cvtsi32_si128(*(EB_U32 *)ref2)))); - + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(src+srcStride)), _mm_avg_epu8(_mm_cvtsi32_si128(*(EB_U32 *)(ref1+ref1Stride)), _mm_cvtsi32_si128(*(EB_U32 *)(ref2+ref2Stride))))); src += srcStride << 1; ref1 += ref1Stride << 1; ref2 += ref2Stride << 1; } - return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); + return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); } @@ -169,22 +169,22 @@ EB_U32 CombinedAveraging8xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1; - EB_U32 y; - (void)width; + __m128i sad0, sad1; + EB_U32 y; + (void)width; - sad0 = sad1 = _mm_setzero_si128(); + sad0 = sad1 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { + for (y = 0; y < height; y += 2) { - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)src), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)ref1), _mm_loadl_epi64((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)src), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)ref1), _mm_loadl_epi64((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; - } - return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); + } + return _mm_cvtsi128_si32(_mm_add_epi32(sad0, sad1)); } @@ -198,24 +198,24 @@ EB_U32 CombinedAveraging16xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad; - EB_U32 y; - (void)width; + __m128i sad0, sad1, sad; + EB_U32 y; + (void)width; - sad0 = sad1 = _mm_setzero_si128(); + sad0 = sad1 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { + for (y = 0; y < height; y += 2) { - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } - sad = _mm_add_epi32(sad0, sad1); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + sad = _mm_add_epi32(sad0, sad1); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } @@ -229,23 +229,23 @@ EB_U32 CombinedAveraging24xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad2, sad3, sad; - EB_U32 y; - (void)width; - sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { - - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + 16)), _mm_loadl_epi64((__m128i*)(ref2 + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride + 16))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } - sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + __m128i sad0, sad1, sad2, sad3, sad; + EB_U32 y; + (void)width; + sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); + for (y = 0; y < height; y += 2) { + + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + 16)), _mm_loadl_epi64((__m128i*)(ref2 + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadl_epi64((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadl_epi64((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadl_epi64((__m128i*)(ref2 + ref2Stride + 16))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } + sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } @@ -259,23 +259,23 @@ EB_U32 CombinedAveraging32xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad2, sad3, sad; - EB_U32 y; - (void)width; - sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { - - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } - sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + __m128i sad0, sad1, sad2, sad3, sad; + EB_U32 y; + (void)width; + sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); + for (y = 0; y < height; y += 2) { + + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } + sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } @@ -295,7 +295,7 @@ EB_U32 CombinedAveraging48xMSAD_SSE2_INTRIN( sad = _mm_setzero_si128(); - for (y = 0; y < height; y+=4) { + for (y = 0; y < height; y+=4) { sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1)), _mm_loadu_si128((__m128i*)(ref2))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+16)), _mm_loadu_si128((__m128i*)(ref2+16))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+32)), _mm_loadu_si128((__m128i*)(ref2+32))))); @@ -306,17 +306,17 @@ EB_U32 CombinedAveraging48xMSAD_SSE2_INTRIN( sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride+16)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride+16))))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride+32)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride+32))))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+2*srcStride+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+2*ref1Stride+32)), _mm_loadu_si128((__m128i*)(ref2+2*ref2Stride+32))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3*srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+3*ref1Stride)), _mm_loadu_si128((__m128i*)(ref2+3*ref2Stride))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3*srcStride+16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+3*ref1Stride+16)), _mm_loadu_si128((__m128i*)(ref2+3*ref2Stride+16))))); sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+3*srcStride+32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1+3*ref1Stride+32)), _mm_loadu_si128((__m128i*)(ref2+3*ref2Stride+32))))); - + src += (srcStride << 2); ref1 += (ref1Stride << 2); ref2 += (ref2Stride << 2); } - + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); return _mm_cvtsi128_si32(sad); } @@ -326,39 +326,39 @@ Compute32xMSad_SSE2_INTRIN **************************************************************************************************************/ EB_U32 Compute32xMSad_SSE2_INTRIN( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 height, - EB_U32 width) + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 height, + EB_U32 width) { - __m128i sad; - (void)width; - EB_U32 y; + __m128i sad; + (void)width; + EB_U32 y; - sad = _mm_setzero_si128(); + sad = _mm_setzero_si128(); - for (y = 0; y < height; y += 4) { + for (y = 0; y < height; y += 4) { - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_loadu_si128((__m128i*)(ref + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src)), _mm_loadu_si128((__m128i*)(ref)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_loadu_si128((__m128i*)(ref + 16)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + refStride + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + refStride + 16)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 2 * srcStride + 16)), _mm_loadu_si128((__m128i*)(ref + 2 * refStride + 16)))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3))), _mm_loadu_si128((__m128i*)(ref + (refStride * 3))))); - sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3) + 16)), _mm_loadu_si128((__m128i*)(ref + (refStride * 3) + 16)))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3))), _mm_loadu_si128((__m128i*)(ref + (refStride * 3))))); + sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (srcStride * 3) + 16)), _mm_loadu_si128((__m128i*)(ref + (refStride * 3) + 16)))); - src += 4 * srcStride; - ref += 4 * refStride; - } + src += 4 * srcStride; + ref += 4 * refStride; + } - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } EB_U32 CombinedAveraging64xMSAD_SSE2_INTRIN( @@ -371,24 +371,24 @@ EB_U32 CombinedAveraging64xMSAD_SSE2_INTRIN( EB_U32 height, EB_U32 width) { - __m128i sad0, sad1, sad2, sad3, sad; - EB_U32 y; - (void)width; - sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); - for (y = 0; y < height; y += 2) { - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 32)), _mm_loadu_si128((__m128i*)(ref2 + 32))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 48)), _mm_loadu_si128((__m128i*)(ref2 + 48))))); - sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); - sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); - sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 32)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 32))))); - sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 48)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 48))))); - src += srcStride << 1; - ref1 += ref1Stride << 1; - ref2 += ref2Stride << 1; - } - sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); - sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); - return _mm_cvtsi128_si32(sad); + __m128i sad0, sad1, sad2, sad3, sad; + EB_U32 y; + (void)width; + sad0 = sad1 = sad2 = sad3 = _mm_setzero_si128(); + for (y = 0; y < height; y += 2) { + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_avg_epu8(_mm_loadu_si128((__m128i*)ref1), _mm_loadu_si128((__m128i*)ref2)))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 16)), _mm_loadu_si128((__m128i*)(ref2 + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 32)), _mm_loadu_si128((__m128i*)(ref2 + 32))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + 48)), _mm_loadu_si128((__m128i*)(ref2 + 48))))); + sad0 = _mm_add_epi32(sad0, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride))))); + sad1 = _mm_add_epi32(sad1, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 16)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 16)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 16))))); + sad2 = _mm_add_epi32(sad2, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 32)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 32)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 32))))); + sad3 = _mm_add_epi32(sad3, _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride + 48)), _mm_avg_epu8(_mm_loadu_si128((__m128i*)(ref1 + ref1Stride + 48)), _mm_loadu_si128((__m128i*)(ref2 + ref2Stride + 48))))); + src += srcStride << 1; + ref1 += ref1Stride << 1; + ref2 += ref2Stride << 1; + } + sad = _mm_add_epi32(_mm_add_epi32(sad0, sad1), _mm_add_epi32(sad2, sad3)); + sad = _mm_add_epi32(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); } \ No newline at end of file diff --git a/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c index 5845c0efa..f927c234e 100644 --- a/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbComputeMean_Intrinsic_SSE2.c @@ -8,71 +8,71 @@ #include "EbComputeMean_SSE2.h" EB_U64 ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride) // input parameter, input stride + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride) // input parameter, input stride { - __m128i xmm0, xmm_blockMean, xmm_input; + __m128i xmm0, xmm_blockMean, xmm_input; - xmm0 = _mm_setzero_si128(); - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)inputSamples), xmm0); - xmm_blockMean = _mm_madd_epi16(xmm_input, xmm_input); + xmm0 = _mm_setzero_si128(); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)inputSamples), xmm0); + xmm_blockMean = _mm_madd_epi16(xmm_input, xmm_input); - /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ + /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ + /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+3*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+4*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+4*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - //xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+5*inputStride)), xmm0); - //xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + //xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+5*inputStride)), xmm0); + //xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+6*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+6*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+7*inputStride)), xmm0); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ + /*xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+7*inputStride)), xmm0); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input));*/ - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 8)); - xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 4)); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 8)); + xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 4)); - return (EB_U64)_mm_cvtsi128_si32(xmm_blockMean) << 11; + return (EB_U64)_mm_cvtsi128_si32(xmm_blockMean) << 11; + - } EB_U64 ComputeSubMean8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride) // input parameter, input stride + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride) // input parameter, input stride { - __m128i xmm0 = _mm_setzero_si128(), xmm1, xmm3, xmm_sum1, xmm_sum2; + __m128i xmm0 = _mm_setzero_si128(), xmm1, xmm3, xmm_sum1, xmm_sum2; - xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); - //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); - xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); - //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); - xmm_sum1 = _mm_add_epi16(xmm1,xmm3); + xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); + //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); + xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); + //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); + xmm_sum1 = _mm_add_epi16(xmm1,xmm3); - inputSamples += 4 * inputStride; - xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); - //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); - xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); - //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); - xmm_sum2 = _mm_add_epi16(xmm1, xmm3); - xmm_sum2 = _mm_add_epi16(xmm_sum1, xmm_sum2); + inputSamples += 4 * inputStride; + xmm1 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples)), xmm0); + //xmm2 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); + xmm3 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 2 * inputStride)), xmm0); + //xmm4 = _mm_sad_epu8(_mm_loadl_epi64((__m128i *)(inputSamples + 3 * inputStride)), xmm0); + xmm_sum2 = _mm_add_epi16(xmm1, xmm3); + xmm_sum2 = _mm_add_epi16(xmm_sum1, xmm_sum2); - return (EB_U64)_mm_cvtsi128_si32(xmm_sum2) << 3; + return (EB_U64)_mm_cvtsi128_si32(xmm_sum2) << 3; } @@ -90,10 +90,10 @@ EB_U64 ComputeMeanOfSquaredValues8x8_SSE2_INTRIN( xmm0 = _mm_setzero_si128(); xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)inputSamples), xmm0); xmm_blockMean = _mm_madd_epi16(xmm_input, xmm_input); - + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples + inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+2*inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); @@ -108,12 +108,12 @@ EB_U64 ComputeMeanOfSquaredValues8x8_SSE2_INTRIN( xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+6*inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); - + xmm_input = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(inputSamples+7*inputStride)), xmm0); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_madd_epi16(xmm_input, xmm_input)); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 8)); xmm_blockMean = _mm_add_epi32(xmm_blockMean, _mm_srli_si128(xmm_blockMean, 4)); - + return (EB_U64)_mm_cvtsi128_si32(xmm_blockMean) << 10; } diff --git a/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h b/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h index 938f4c351..0d675385d 100644 --- a/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbComputeMean_SSE2.h @@ -12,11 +12,11 @@ extern "C" { #include "EbDefinitions.h" EB_U64 ComputeSubMean8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride); EB_U64 ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U16 inputStride); + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U16 inputStride); EB_U64 ComputeMeanOfSquaredValues8x8_SSE2_INTRIN( EB_U8 * inputSamples, // input parameter, input samples Ptr diff --git a/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h b/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h index 08a8d3906..d46fb47a8 100644 --- a/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbComputeSAD_SSE2.h @@ -15,41 +15,41 @@ extern EB_U32 Compute4xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute8xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute16xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute32xMSad_SSE2_INTRIN( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width); // input parameter, block width (N) extern EB_U32 Compute64xMSad_SSE2_INTRIN( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) extern EB_U32 CombinedAveraging4xMSAD_SSE2_INTRIN( EB_U8 *src, @@ -123,5 +123,5 @@ extern EB_U32 CombinedAveraging64xMSAD_SSE2_INTRIN( #ifdef __cplusplus } -#endif +#endif #endif // EbComputeSAD_SSE2_h \ No newline at end of file diff --git a/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c index 613f4b0ce..f9373c6eb 100644 --- a/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbDeblockingFilter_Intrinsic_SSE2.c @@ -9,13 +9,13 @@ #include "EbDeblockingFilter_SSE2.h" void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, EB_U8 crTc) -{ +{ __m128i xmm_tcN = _mm_setzero_si128(); __m128i xmm0 = _mm_setzero_si128(); __m128i xmm_4 = _mm_set1_epi16(4); @@ -33,7 +33,7 @@ void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( xmm_p1 = _mm_unpacklo_epi32(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb - (reconChromaPicStride << 1))), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr - (reconChromaPicStride << 1)))); xmm_q0 = _mm_unpacklo_epi32(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr))); xmm_q1 = _mm_unpacklo_epi32(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb + reconChromaPicStride)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr + reconChromaPicStride))); - + xmm_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_slli_epi16(_mm_sub_epi16(xmm_q0, xmm_p0), 2), _mm_add_epi16(_mm_sub_epi16(xmm_p1, xmm_q1), xmm_4)), 3); xmm_delta = _mm_max_epi16(xmm_temp1, xmm_tcN); xmm_delta = _mm_min_epi16(xmm_delta, xmm_Tc); @@ -47,19 +47,19 @@ void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( *(EB_U32 *)(edgeStartSampleCr) = _mm_cvtsi128_si32(_mm_srli_si128(xmm_p0, 12)); } else { - xmm_p0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCb + reconChromaPicStride - 2))); - xmm_p0Cr = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCr - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr + reconChromaPicStride - 2))); - - xmm_q0 = _mm_unpackhi_epi32(xmm_p0, xmm_p0Cr); - xmm_p0 = _mm_unpacklo_epi32(xmm_p0, xmm_p0Cr); - xmm_p0 = _mm_unpacklo_epi64(_mm_srli_si128(xmm_p0, 8), xmm_p0); - - xmm_temp1 = _mm_sub_epi16(xmm_q0, xmm_p0); - xmm_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_sub_epi16(_mm_slli_epi16(xmm_temp1, 2), _mm_srli_si128(xmm_temp1, 8)), xmm_4), 3); + xmm_p0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCb - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCb + reconChromaPicStride - 2))); + xmm_p0Cr = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(edgeStartSampleCr - 2)), _mm_loadl_epi64((__m128i *)(edgeStartSampleCr + reconChromaPicStride - 2))); + + xmm_q0 = _mm_unpackhi_epi32(xmm_p0, xmm_p0Cr); + xmm_p0 = _mm_unpacklo_epi32(xmm_p0, xmm_p0Cr); + xmm_p0 = _mm_unpacklo_epi64(_mm_srli_si128(xmm_p0, 8), xmm_p0); + + xmm_temp1 = _mm_sub_epi16(xmm_q0, xmm_p0); + xmm_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_sub_epi16(_mm_slli_epi16(xmm_temp1, 2), _mm_srli_si128(xmm_temp1, 8)), xmm_4), 3); xmm_delta = _mm_min_epi16(_mm_max_epi16(xmm_temp1, xmm_tcN), xmm_Tc); - xmm_p0 = _mm_unpacklo_epi16(_mm_add_epi16(xmm_p0, xmm_delta), _mm_sub_epi16(xmm_q0, xmm_delta)); - xmm_p0 = _mm_max_epi16(_mm_min_epi16(xmm_p0, xmm_Max10bit), xmm0); + xmm_p0 = _mm_unpacklo_epi16(_mm_add_epi16(xmm_p0, xmm_delta), _mm_sub_epi16(xmm_q0, xmm_delta)); + xmm_p0 = _mm_max_epi16(_mm_min_epi16(xmm_p0, xmm_Max10bit), xmm0); *(EB_U32*)(edgeStartSampleCb-1) = _mm_cvtsi128_si32(xmm_p0); *(EB_U32*)(edgeStartSampleCb+reconChromaPicStride-1) = _mm_cvtsi128_si32(_mm_srli_si128(xmm_p0, 4)); diff --git a/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h b/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h index cae1d5741..c4f916b14 100644 --- a/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbDeblockingFilter_SSE2.h @@ -13,8 +13,8 @@ extern "C" { #endif extern void Chroma2SampleEdgeDLFCore16bit_SSE2_INTRIN( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, diff --git a/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c index fc940f64f..03f22cac3 100644 --- a/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbGatherSaoStatistics16bit_Intrinsic_SSE2.c @@ -142,9 +142,9 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( EB_ALIGN(16) EB_S8 rTemp[512] = { 0 }; EB_U64 reconStrideTemp; - lcuHeight -= 2; - inputSamplePtr += inputStride + 1; - reconSamplePtr++; + lcuHeight -= 2; + inputSamplePtr += inputStride + 1; + reconSamplePtr++; if (lcuWidth == 16) { @@ -175,7 +175,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( MACRO_CALC_EO_INDEX(reconSamplePtr+1, reconSamplePtr+2*reconStride-1) xmm_eoIndex = _mm_and_si128(xmm_eoIndex, xmm_skip_mask); // skip last 2 samples MACRO_GATHER_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3) - + inputSamplePtr += inputStride; reconSamplePtr += reconStride; } @@ -205,7 +205,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( // EO-45 MACRO_CALC_EO_INDEX(reconSamplePtr+1, reconSamplePtr+2*reconStride-1) MACRO_GATHER_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3) - + //----------- 16-25 ----------- xmm_temp_recon1 = _mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 16)); xmm_temp_recon2 = _mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride + 24)); @@ -267,7 +267,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( MACRO_GATHER_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3) inputSamplePtr += 16; - reconSamplePtr += 16; + reconSamplePtr += 16; } //----------- 48-53 ----------- xmm_temp_recon1 = _mm_loadu_si128((__m128i *)(reconSamplePtr + reconStride)); @@ -366,6 +366,6 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( MACRO_SAVE_EO(OFFSET_EO_DIFF_1, OFFSET_EO_COUNT_1, 1) MACRO_SAVE_EO(OFFSET_EO_DIFF_2, OFFSET_EO_COUNT_2, 2) MACRO_SAVE_EO(OFFSET_EO_DIFF_3, OFFSET_EO_COUNT_3, 3) - + return return_error; } diff --git a/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c index 1a397b84e..cd253ca5d 100644 --- a/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbIntraPrediction16bit_Intrinsic_SSE2.c @@ -91,7 +91,7 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( EB_U32 topLeftOffset = (size << 1); EB_U32 topOffset = ((size << 1) + 1); EB_U32 pStride = predictionBufferStride; - + if (size != 32) { __m128i xmm0 = _mm_setzero_si128(); __m128i xmm_mask1 = _mm_slli_si128( _mm_set1_epi16((signed char)(0xFFFF)), 2); @@ -104,24 +104,24 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( xmm_topLeft = _mm_unpacklo_epi32(xmm_topLeft, xmm_topLeft); xmm_topLeft_hi = _mm_unpackhi_epi64(xmm_topLeft, xmm_topLeft); xmm_topLeft_lo = _mm_unpacklo_epi64(xmm_topLeft, xmm_topLeft); - + if (!skip) { if (size ==16) { __m128i xmm_left_lo, xmm_left_hi, xmm_top_lo, xmm_top_hi; xmm_left_lo = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_topLeft_lo), 1), xmm_topLeft_hi); xmm_left_hi = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)), xmm_topLeft_lo), 1), xmm_topLeft_hi); - xmm_left_lo = _mm_max_epi16(_mm_min_epi16(xmm_left_lo, xmm_Max10bit), xmm0); - xmm_left_hi = _mm_max_epi16(_mm_min_epi16(xmm_left_hi, xmm_Max10bit), xmm0); + xmm_left_lo = _mm_max_epi16(_mm_min_epi16(xmm_left_lo, xmm_Max10bit), xmm0); + xmm_left_hi = _mm_max_epi16(_mm_min_epi16(xmm_left_hi, xmm_Max10bit), xmm0); xmm_top_hi = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); xmm_top_lo = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), xmm_mask1); MACRO_VERTICAL_LUMA_16(xmm_left_lo, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) - predictionPtr += (pStride << 2); - MACRO_VERTICAL_LUMA_16(xmm_left_lo, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) - predictionPtr += (pStride << 2); - MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) - predictionPtr += (pStride << 2); - MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) + predictionPtr += (pStride << 2); + MACRO_VERTICAL_LUMA_16(xmm_left_lo, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) + predictionPtr += (pStride << 2); + MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) + predictionPtr += (pStride << 2); + MACRO_VERTICAL_LUMA_16(xmm_left_hi, xmm_mask2, xmm_top_lo, xmm_top_hi, 2) } else if (size == 8) { xmm_left = _mm_add_epi16(_mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_topLeft_lo), 1), xmm_topLeft_hi); @@ -147,7 +147,7 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( if (size == 16) { __m128i xmm_top_lo, xmm_top_hi; - + xmm_left = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm_mask_skip), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)), xmm_mask_skip)); xmm_left = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(_mm_srai_epi16( _mm_sub_epi16(xmm_left, xmm_topLeft_lo), 1), xmm_topLeft_hi), xmm_Max10bit), xmm0); xmm_top_hi = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); @@ -170,7 +170,7 @@ void IntraModeVerticalLuma16bit_SSE2_INTRIN( __m128i top_16_23 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 16)); __m128i top_24_31 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 24)); EB_U64 count, size_to_write; - + pStride <<= (skip ? 1 : 0); // Each 2 storeu calls stores 32 bytes. Hence each iteration stores 8 * 32 bytes. @@ -281,62 +281,62 @@ void IntraModeVerticalChroma16bit_SSE2_INTRIN( if (!skip) { if (size == 16) { - __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - __m128i top_8_15 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + __m128i top_8_15 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8)); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), top_8_15); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), top_8_15); } else if (size == 8) { - __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); - predictionPtr = predictionPtr + (pStride << 2); - _mm_storeu_si128((__m128i *)(predictionPtr), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); - _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + __m128i top_0_7 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); + _mm_storeu_si128((__m128i *)predictionPtr, top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); + predictionPtr = predictionPtr + (pStride << 2); + _mm_storeu_si128((__m128i *)(predictionPtr), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), top_0_7); + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), top_0_7); } else { - __m128i top_0_3 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); - _mm_storel_epi64((__m128i *)predictionPtr, top_0_3); - _mm_storel_epi64((__m128i *)(predictionPtr + pStride), top_0_3); - _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), top_0_3); - _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), top_0_3); + __m128i top_0_3 = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); + _mm_storel_epi64((__m128i *)predictionPtr, top_0_3); + _mm_storel_epi64((__m128i *)(predictionPtr + pStride), top_0_3); + _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), top_0_3); + _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), top_0_3); } } else { @@ -386,14 +386,14 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip) //skip half rows -{ +{ EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; EB_U32 topOffset = (size << 1) + 1; EB_U32 topLeftOffset = size << 1; __m128i xmm_Max10bit = _mm_set1_epi16(0x03FF); __m128i xmm_0 = _mm_setzero_si128(); - + if (size != 32) { __m128i topLeft = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + topLeftOffset)); topLeft = _mm_unpacklo_epi16(topLeft, topLeft); @@ -413,12 +413,12 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left8_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset+8)); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -426,16 +426,16 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left89 = _mm_unpacklo_epi32(left8_11, left8_11); left10_11 = _mm_unpackhi_epi32(left8_11, left8_11); - - left0 = _mm_unpacklo_epi64(left01, left01); + + left0 = _mm_unpacklo_epi64(left01, left01); left1 = _mm_unpackhi_epi64(left01, left01); clip3_0_7 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(filter_cmpnt0_7, left0), xmm_Max10bit), xmm_0); clip3_8_15 = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(filter_cmpnt8_15, left0), xmm_Max10bit), xmm_0); - + left14_15 = _mm_unpackhi_epi32(left12_15, left12_15); left12_13 = _mm_unpacklo_epi32(left12_15, left12_15); - + _mm_storeu_si128((__m128i *)(predictionPtr), clip3_0_7); _mm_storeu_si128((__m128i *)(predictionPtr + 8), clip3_8_15); @@ -453,7 +453,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left13 = _mm_unpackhi_epi64(left12_13, left12_13); left14 = _mm_unpacklo_epi64(left14_15, left14_15); left15 = _mm_unpackhi_epi64(left14_15, left14_15); - + _mm_storeu_si128((__m128i *)(predictionPtr+pStride), left1); _mm_storeu_si128((__m128i *)(predictionPtr+pStride+8), left1); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), left2); @@ -495,12 +495,12 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); left67 = _mm_unpackhi_epi32(left4_7, left4_7); - + left0 = _mm_unpacklo_epi64(left01, left01); left1 = _mm_unpackhi_epi64(left01, left01); left2 = _mm_unpacklo_epi64(left23, left23); @@ -509,7 +509,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left5 = _mm_unpackhi_epi64(left45, left45); left6 = _mm_unpacklo_epi64(left67, left67); left7 = _mm_unpackhi_epi64(left67, left67); - + clipped_10bit = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(left0, filter_cmpnt), xmm_Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(predictionPtr), clipped_10bit); @@ -530,7 +530,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left23 = _mm_unpackhi_epi32(left0_3, left0_3); - left01 = _mm_unpacklo_epi32(left0_3, left0_3); + left01 = _mm_unpacklo_epi32(left0_3, left0_3); clipped_10bit = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(left01, filter_cmpnt), xmm_Max10bit), xmm_0); _mm_storel_epi64((__m128i *)(predictionPtr), clipped_10bit); @@ -551,9 +551,9 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( filter_cmpnt_0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), topLeft), 1); filter_cmpnt_8_15 = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset+8)), topLeft), 1); - left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask), + left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)), skip_mask)); - + left0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); left8_14_even = _mm_unpackhi_epi16(left0_14_even, left0_14_even); @@ -577,7 +577,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left10 = _mm_unpackhi_epi64(left8_10, left8_10); left12 = _mm_unpacklo_epi64(left12_14, left12_14); left14 = _mm_unpackhi_epi64(left12_14, left12_14); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), left2); _mm_storeu_si128((__m128i *)(predictionPtr + 2*pStride), left4); @@ -600,7 +600,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( __m128i left0_14_even, left_0_6_even, left02, left46; __m128i left0, left2, left4, left6; - filter_cmpnt = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), topLeft), 1); + filter_cmpnt = _mm_srai_epi16(_mm_sub_epi16(_mm_loadu_si128((__m128i *)(refSamples + topOffset)), topLeft), 1); left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask), xmm_0); @@ -613,7 +613,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); - + clipped_10bit = _mm_max_epi16(_mm_min_epi16(_mm_add_epi16(left0, filter_cmpnt), xmm_Max10bit), xmm_0); _mm_storeu_si128((__m128i *)(predictionPtr), clipped_10bit); @@ -630,17 +630,17 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( __m128i left0_7, left8_15, left0_3, left4_7, left8_11, left12_15, left01, left23, left45, left67, left89, left10_11; __m128i left12_13, left14_15, left0, left1, left2, left3, left4, left5, left6, left7, left8, left9, left10, left11; __m128i left12, left13, left14, left15; - + for (count = 0; count < 2; ++count) { left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left8_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)); refSamples += 16; - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -649,7 +649,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left10_11 = _mm_unpackhi_epi32(left8_11, left8_11); left12_13 = _mm_unpacklo_epi32(left12_15, left12_15); left14_15 = _mm_unpackhi_epi32(left12_15, left12_15); - + left0 = _mm_unpacklo_epi64(left01, left01); left1 = _mm_unpackhi_epi64(left01, left01); left2 = _mm_unpacklo_epi64(left23, left23); @@ -666,7 +666,7 @@ void IntraModeHorizontalLuma16bit_SSE2_INTRIN( left13 = _mm_unpackhi_epi64(left12_13, left12_13); left14 = _mm_unpacklo_epi64(left14_15, left14_15); left15 = _mm_unpackhi_epi64(left14_15, left14_15); - + _mm_storeu_si128((__m128i *)(predictionPtr), left0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), left0); _mm_storeu_si128((__m128i *)(predictionPtr + 16), left0); @@ -880,12 +880,12 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left8_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8)); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left_01 = _mm_unpacklo_epi32(left0_3, left0_3); left_23 = _mm_unpackhi_epi32(left0_3, left0_3); left_45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -894,7 +894,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left_10_11 = _mm_unpackhi_epi32(left8_11, left8_11); left_12_13 = _mm_unpacklo_epi32(left12_15, left12_15); left_14_15 = _mm_unpackhi_epi32(left12_15, left12_15); - + left0 = _mm_unpacklo_epi64(left_01, left_01); left1 = _mm_unpackhi_epi64(left_01, left_01); left2 = _mm_unpacklo_epi64(left_23, left_23); @@ -911,7 +911,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left13 = _mm_unpackhi_epi64(left_12_13, left_12_13); left14 = _mm_unpacklo_epi64(left_14_15, left_14_15); left15 = _mm_unpackhi_epi64(left_14_15, left_14_15); - + _mm_storeu_si128((__m128i *)predictionPtr, left0); _mm_storeu_si128((__m128i *)(predictionPtr+8), left0); _mm_storeu_si128((__m128i *)(predictionPtr+pStride), left1); @@ -952,16 +952,16 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( __m128i left0, left1, left2, left3, left4, left5, left6, left7; __m128i left0_7, left0_3, left4_7, left_01, left_23, left_45, left_67; - left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); - + left0_7 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); - + left_01 = _mm_unpacklo_epi32(left0_3, left0_3); left_23 = _mm_unpackhi_epi32(left0_3, left0_3); left_45 = _mm_unpacklo_epi32(left4_7, left4_7); left_67 = _mm_unpackhi_epi32(left4_7, left4_7); - + left0 = _mm_unpacklo_epi64(left_01, left_01); left1 = _mm_unpackhi_epi64(left_01, left_01); left2 = _mm_unpacklo_epi64(left_23, left_23); @@ -970,7 +970,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left5 = _mm_unpackhi_epi64(left_45, left_45); left6 = _mm_unpacklo_epi64(left_67, left_67); left7 = _mm_unpackhi_epi64(left_67, left_67); - + _mm_storeu_si128((__m128i *)predictionPtr, left0); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left1); _mm_storeu_si128((__m128i *)(predictionPtr + 2*pStride), left2); @@ -982,10 +982,10 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3*pStride), left7); } else { - + __m128i left0_3, left01, left23; left0_3 = _mm_loadl_epi64((__m128i *)(refSamples + leftOffset)); - + left0_3 = _mm_unpacklo_epi16(left0_3, left0_3); left01 = _mm_unpacklo_epi32(left0_3, left0_3); @@ -1011,24 +1011,24 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( __m128i left0_14_even, left0_6_even, left8_14_even, left02, left46, left8_10, left12_14; __m128i left0, left2, left4, left6, left8, left10, left12, left14; - left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples+leftOffset)), skip_mask), + left0_14_even = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples+leftOffset)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples+leftOffset+8)), skip_mask)); left0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); left8_14_even = _mm_unpackhi_epi16(left0_14_even, left0_14_even); - + left02 = _mm_unpacklo_epi32(left0_6_even, left0_6_even); left46 = _mm_unpackhi_epi32(left0_6_even, left0_6_even); left8_10 = _mm_unpacklo_epi32(left8_14_even, left8_14_even); left12_14 = _mm_unpackhi_epi32(left8_14_even, left8_14_even); - + left0 = _mm_unpacklo_epi64(left02, left02); left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); left8 = _mm_unpacklo_epi64(left8_10, left8_10); left10 = _mm_unpackhi_epi64(left8_10, left8_10); - left12 = _mm_unpacklo_epi64(left12_14, left12_14); + left12 = _mm_unpacklo_epi64(left12_14, left12_14); left14 = _mm_unpackhi_epi64(left12_14, left12_14); _mm_storeu_si128((__m128i *)(predictionPtr), left0); @@ -1053,7 +1053,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( __m128i left0_14_even, left0_6_even, left02, left46, left0, left2, left4, left6; left0_14_even = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask); - left0_14_even = _mm_packs_epi32(left0_14_even, left0_14_even); + left0_14_even = _mm_packs_epi32(left0_14_even, left0_14_even); left0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); @@ -1064,7 +1064,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); - + _mm_storeu_si128((__m128i *)(predictionPtr), left0); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left2); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), left4); @@ -1080,7 +1080,7 @@ void IntraModeHorizontalChroma16bit_SSE2_INTRIN( _mm_storel_epi64((__m128i *)predictionPtr, left0); _mm_storel_epi64((__m128i *)(predictionPtr+pStride), _mm_srli_si128(left0, 8)); - } + } } } @@ -1090,7 +1090,7 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip) -{ +{ EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; @@ -1098,24 +1098,24 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( if (size == 32) { EB_U32 count; - - for (count = 0; count < 8; ++count) { - + + for (count = 0; count < 8; ++count) { + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 9))); _mm_storeu_si128((__m128i *)(predictionPtr + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 17))); - _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 25))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 25))); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 10))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 18))); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 26))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 26))); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 11))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 19))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 27))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 20))); @@ -1126,7 +1126,7 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( } else if (size == 16) { __m128i ref_9, ref_10, ref_11, ref_12, ref_13, ref_14, ref_15, ref_16; - + ref_9 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 9)); ref_10 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 10)); ref_11 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 11)); @@ -1138,26 +1138,26 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_9); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_10); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_11); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_12); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_13); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 6))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_14); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_15); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_16); predictionPtr += (pStride << 2); @@ -1167,29 +1167,29 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 18))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_11); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 19))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_12); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 20))); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_13); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 21))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_14); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 22))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_15); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 23))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_16); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 24))); } else if (size == 8) { - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); @@ -1211,7 +1211,7 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( if (size != 4) { pStride <<= 1; if (size == 32) { - + __m128i ref9, ref11, ref13, ref15, ref17, ref19, ref21, ref23, ref25, ref27, ref29, ref31, ref33, ref35, ref37, ref39; __m128i ref41, ref43, ref45, ref47; ref9 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 9)); @@ -1239,81 +1239,81 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref9); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref17); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref25); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref19); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref27); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref27); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref29); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref31); - + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, ref9); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref17); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref25); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref33); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref35); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref37); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref39); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref17); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref25); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref33); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref41); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref43); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref45); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref47); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref25); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref33); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref41); _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 49))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref43); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 51))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref45); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 53))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref47); @@ -1329,26 +1329,26 @@ void IntraModeAngular16bit_2_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref9); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref11); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref13); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref15); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref9); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 17))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 19))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 21))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + leftOffset + 23))); } @@ -1373,7 +1373,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip) -{ +{ EB_U32 pStride = predictionBufferStride; EB_U32 topOffset = (size << 1) + 1; @@ -1381,24 +1381,24 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( if (size == 32) { EB_U32 count; - - for (count = 0; count < 8; ++count) { - + + for (count = 0; count < 8; ++count) { + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 9))); _mm_storeu_si128((__m128i *)(predictionPtr + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 17))); _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 25))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 10))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 18))); - _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 26))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 26))); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 11))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 19))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 27))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 20))); @@ -1409,19 +1409,19 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( } else if (size == 16) { __m128i ref_9, ref_10, ref_11, ref_12, ref_13, ref_14, ref_15, ref_16; - + ref_9 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 9)); _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_9); - + ref_10 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 10)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_10); - + ref_11 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 11)); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_11); - + ref_12 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 12)); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_12); @@ -1438,7 +1438,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( ref_15 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 15)); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_15); - + ref_16 = _mm_loadu_si128((__m128i *)(refSamples + topOffset + 16)); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_16); @@ -1453,7 +1453,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_12); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 20))); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_13); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 21))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_14); @@ -1465,7 +1465,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( } else if (size == 8) { - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 2))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); @@ -1518,23 +1518,23 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topOffset + 1))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_9); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref_17); - _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_25); - + _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_25); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_11); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref_19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref_27); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_13); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_29); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref_31); - + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, ref_9); @@ -1551,51 +1551,51 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_37); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_15); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref_39); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_17); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_25); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref_33); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_41); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_19); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref_35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref_43); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_21); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_45); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_23); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), ref_47); - + predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_25); _mm_storeu_si128((__m128i *)(predictionPtr + 8), ref_33); _mm_storeu_si128((__m128i *)(predictionPtr + 16), ref_41); _mm_storeu_si128((__m128i *)(predictionPtr + 24), ref_49); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_27); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), ref_35); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), ref_43); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), ref_51); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), ref_29); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), ref_37); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), ref_45); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), ref_53); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), ref_31); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_39); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), ref_47); @@ -1619,7 +1619,7 @@ void IntraModeAngular16bit_34_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), ref_15); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, ref_9); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topOffset + 17))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), ref_11); @@ -1648,8 +1648,8 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( EB_U16 *refSamples, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) -{ + const EB_BOOL skip) +{ EB_U32 pStride = predictionBufferStride; EB_U32 topLeftOffset = (size << 1); @@ -1658,23 +1658,23 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( if (size == 32) { EB_U32 count; - for (count = 0; count < 8; ++count) { - + for (count = 0; count < 8; ++count) { + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset ))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 16))); _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 24))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 1))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 15))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 23))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 2))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 14))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 22))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 5))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 13))); @@ -1685,7 +1685,7 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( } else if (size == 16) { __m128i xmm_topLeft, xmm_topLeft_n1, xmm_topLeft_n2, xmm_topLeft_n3, xmm_topLeft_n4, xmm_topLeft_n5, xmm_topLeft_n6, xmm_topLeft_n7; - + xmm_topLeft = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset )); xmm_topLeft_n1 = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 1)); xmm_topLeft_n2 = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 2)); @@ -1696,18 +1696,18 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( xmm_topLeft_n7 = _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 7)); _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n1); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 7))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n2); - _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n3); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 5))); predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_n4); - _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 4))); + _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 4))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n5); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 3))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n6); @@ -1727,7 +1727,7 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n3); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 13))); @@ -1792,8 +1792,8 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_8); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_16); - _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 24))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 24))); + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_6); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_14); @@ -1803,24 +1803,24 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 20))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n6); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_2); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_10); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 18))); - + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_n8); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_8); _mm_storeu_si128((__m128i *)(predictionPtr + 24), xmm_topLeft_16); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_6); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), xmm_topLeft_14); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_4); @@ -1831,22 +1831,22 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_2); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 24), xmm_topLeft_10); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_n16); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_n8); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 24), xmm_topLeft_8); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n18); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), xmm_topLeft_6); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n20); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), xmm_topLeft_4); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n22); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n14); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_n6); @@ -1857,17 +1857,17 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_n16); _mm_storeu_si128((__m128i *)(predictionPtr + 16), xmm_topLeft_n8); _mm_storeu_si128((__m128i *)(predictionPtr + 24), xmm_topLeft_0); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 26))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n18); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 16), xmm_topLeft_n10); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 24), xmm_topLeft_n2); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 28))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n20); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 16), xmm_topLeft_n12); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 24), xmm_topLeft_n4); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 30))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n22); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 16), xmm_topLeft_n14); @@ -1883,27 +1883,27 @@ void IntraModeAngular16bit_18_SSE2_INTRIN( _mm_storeu_si128((__m128i *)predictionPtr, xmm_topLeft_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 8))); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), xmm_topLeft_n2); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 6))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), xmm_topLeft_n4); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 4))); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), xmm_topLeft_n6); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset + 2))); predictionPtr += (pStride << 2); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 8))); _mm_storeu_si128((__m128i *)(predictionPtr + 8), xmm_topLeft_0); - + _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 10))); _mm_storeu_si128((__m128i *)(predictionPtr + pStride + 8), xmm_topLeft_n2); - + _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 12))); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride + 8), xmm_topLeft_n4); - + _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_loadu_si128((__m128i *)(refSamples + topLeftOffset - 14))); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride + 8), xmm_topLeft_n6); } @@ -1925,9 +1925,9 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle) + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle) { __m128i xmm_C32 = _mm_set1_epi16(0x0020); __m128i xmm_C16 = _mm_srli_epi16(xmm_C32, 1); @@ -1937,7 +1937,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( refSampMain += 1; if (!skip) { - + if (size == 32) { for (count = 0; count < 32; ++count) { @@ -1976,11 +1976,11 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); //(32 - deltaFract) - + //(((32 - deltaFract)*refSampMain[deltaInt + (EB_S32)colIndex] + deltaFract*refSampMain[deltaInt + (EB_S32)colIndex + 1] + 16) >> 5); pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); pred_8_15 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_8_15); predictionPtr += pStride; @@ -2000,7 +2000,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); predictionPtr += pStride; } @@ -2011,15 +2011,15 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( for (count = 0; count < 4; ++count){ deltaSum += intraPredAngle; deltaInt = deltaSum >> 5; - + deltaFract = _mm_cvtsi32_si128((deltaSum & 31)); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + pred_0_4 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + _mm_storel_epi64((__m128i *)predictionPtr, pred_0_4); predictionPtr += pStride; } @@ -2030,7 +2030,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( intraPredAngle <<= 1; if (size == 32) { - + for (count = 0; count < 16; ++count) { deltaInt = deltaSum >> 5; @@ -2068,7 +2068,7 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); pred_8_15 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_8_15); predictionPtr += (pStride << 1); @@ -2079,18 +2079,18 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( for (count = 0; count < 4; ++count) { deltaInt = deltaSum >> 5; - + deltaFract = _mm_cvtsi32_si128((deltaSum & 31)); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + pred_0_7 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0_7); - + predictionPtr += (pStride << 1); deltaSum += intraPredAngle; } @@ -2100,15 +2100,15 @@ void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( for (count = 0; count < 2; ++count) { deltaInt = deltaSum >> 5; - + deltaFract = _mm_cvtsi32_si128((deltaSum & 31)); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + pred_0_4 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt+1)), deltaFract), xmm_C16)), 5); - + _mm_storel_epi64((__m128i *)predictionPtr, pred_0_4); predictionPtr += (pStride << 1); deltaSum += intraPredAngle; @@ -2130,34 +2130,34 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( __m128i horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h; EB_U32 count, pStride = predictionBufferStride; EB_S32 deltaInt, deltaSum = 0; - + xmm_C32 = _mm_set1_epi16(0x0020); xmm_C16 = _mm_srli_epi16(xmm_C32, 1); refSampMain += 1; if (!skip) { - + if (size == 32) - { + { EB_S8 temp[0x800]; EB_U8 outer_counter; for (count = 0; count < 256; count += 8) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); //(32 - deltaFract) - + vertical_temp0 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); vertical_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); vertical_temp2 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 16)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 17)), deltaFract), xmm_C16)), 5); vertical_temp3 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 24)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 25)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp0); _mm_storeu_si128((__m128i *)(temp + 8 * count + 16), vertical_temp1); @@ -2165,13 +2165,13 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(temp + 8 * count + 48), vertical_temp3); } - EB_S8 * tempPtr = temp; + EB_S8 * tempPtr = temp; EB_U16 * predPtr = predictionPtr; - + for (outer_counter = 0; outer_counter < 2; ++outer_counter) { for (count = 0; count < 8; ++count) { - + horiz_0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x040))); horiz_1 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x080)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x0C0))); horiz_2 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x100)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x140))); @@ -2199,23 +2199,23 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( } } else if (size == 16) { - + EB_S8 temp[0x200]; for (count = 0; count < 64; count+=4) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp0 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); vertical_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp0); _mm_storeu_si128((__m128i *)(temp + 8 * count + 16), vertical_temp1); @@ -2253,16 +2253,16 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( for (count = 0; count < 16; count+=2) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp); } @@ -2274,7 +2274,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( horiz_5 = _mm_loadu_si128((__m128i *)(temp + 0x50)); horiz_6 = _mm_loadu_si128((__m128i *)(temp + 0x60)); horiz_7 = _mm_loadu_si128((__m128i *)(temp + 0x70)); - + //Unpack to re-arrange the packing to the horizontal packing MACRO_UNPACK(16, horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h) MACRO_UNPACK(32, horiz_0, horiz_2, horiz_01h, horiz_23h, horiz_4, horiz_6, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h) @@ -2297,25 +2297,25 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( for (count = 0; count < 4; ++count) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt + 1)), deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. temp[count] = _mm_cvtsi128_si64(vertical_temp); } //Unpack to re-arrange the packing to the horizontal packing horiz_0 = _mm_unpacklo_epi16(_mm_cvtsi64_si128(temp[0]), _mm_cvtsi64_si128(temp[1])); horiz_1 = _mm_unpacklo_epi16(_mm_cvtsi64_si128(temp[2]), _mm_cvtsi64_si128(temp[3])); - + pred_hi = _mm_unpackhi_epi32(horiz_0, horiz_1); pred_lo = _mm_unpacklo_epi32(horiz_0, horiz_1); - + _mm_storel_epi64((__m128i *)predictionPtr, pred_lo); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_srli_si128(pred_lo, 8)); _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), pred_hi); @@ -2333,7 +2333,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( for (count = 0; count < 128; count += 4) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + refSamp_0_15 = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 8)), skip_mask)); refSamp_1_16 = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 1)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 9)), skip_mask)); refSamp16_31 = _mm_packs_epi32(_mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 16)), skip_mask), _mm_and_si128(_mm_loadu_si128((__m128i *)(refSampMain + deltaInt + 24)), skip_mask)); @@ -2343,9 +2343,9 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. vertical_temp0 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(refSamp_0_15, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(refSamp_1_16, deltaFract), xmm_C16)), 5); vertical_temp1 = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(refSamp16_31, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(refSamp17_32, deltaFract), xmm_C16)), 5); @@ -2353,7 +2353,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(temp + 8 * count), vertical_temp0); _mm_storeu_si128((__m128i *)(temp + 8 * count + 16), vertical_temp1); } - EB_S8 * tempPtr = temp; + EB_S8 * tempPtr = temp; EB_U16 * predPtr = predictionPtr; EB_U8 outer_counter; __m128i horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h;; @@ -2369,7 +2369,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( horiz_5 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x140)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x160))); horiz_6 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x180)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x1A0))); horiz_7 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x1C0)), _mm_loadl_epi64((__m128i *)(tempPtr + 8 * count + 0x1E0))); - + //Unpack to re-arrange the packing to the horizontal packing MACRO_UNPACK(32, horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h) MACRO_UNPACK(64, horiz_0, horiz_2, horiz_01h, horiz_23h, horiz_4, horiz_6, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h) @@ -2391,7 +2391,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( else if (size == 16) { EB_S8 temp[0x100]; - + __m128i refSamp_0_15, refSamp_1_16; for (count = 0; count < 32; count+=2) { @@ -2406,9 +2406,9 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(refSamp_0_15, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(refSamp_1_16, deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storeu_si128((__m128i *)(temp+8*count), vertical_temp); } @@ -2423,7 +2423,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( horiz_5 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xA0)), _mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xB0))); horiz_6 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xC0)), _mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xD0))); horiz_7 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xE0)), _mm_loadl_epi64((__m128i *)(temp + 8 * count + 0xF0))); - + //Unpack to re-arrange the packing to the horizontal packing MACRO_UNPACK(32, horiz_0, horiz_1, horiz_2, horiz_3, horiz_4, horiz_5, horiz_6, horiz_7, horiz_01h, horiz_23h, horiz_45h, horiz_67h) MACRO_UNPACK(64, horiz_0, horiz_2, horiz_01h, horiz_23h, horiz_4, horiz_6, horiz_45h, horiz_67h, horiz_0123l, horiz_0123h, horiz_4567l, horiz_4567h) @@ -2440,10 +2440,10 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( } } else if (size == 8) { - + EB_S8 temp[0x40]; __m128i temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, ref0, ref1; - + for (count = 0; count < 8; ++count) { deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); @@ -2457,38 +2457,38 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi64(deltaFract, deltaFract); - + refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); - + vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(ref0, refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(ref1, deltaFract), xmm_C16)), 5); - + //The order in the result is not horizontal, store in temp buffer and re-arrange later. _mm_storel_epi64((__m128i *)(temp+8*count), vertical_temp); } - + //Unpack to re-arrange the packing to the horizontal packing temp0 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp)), _mm_loadl_epi64((__m128i *)(temp + 0x08))); temp1 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 0x10)), _mm_loadl_epi64((__m128i *)(temp + 0x18))); temp2 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 0x20)), _mm_loadl_epi64((__m128i *)(temp + 0x28))); temp3 = _mm_unpacklo_epi16(_mm_loadl_epi64((__m128i *)(temp + 0x30)), _mm_loadl_epi64((__m128i *)(temp + 0x38))); - + temp4 = _mm_unpacklo_epi32(temp0, temp1); temp5 = _mm_unpackhi_epi32(temp0, temp1); temp6 = _mm_unpacklo_epi32(temp2, temp3); - temp7 = _mm_unpackhi_epi32(temp2, temp3); - + temp7 = _mm_unpackhi_epi32(temp2, temp3); + _mm_storeu_si128((__m128i *)predictionPtr, _mm_unpacklo_epi64(temp4, temp6)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(temp4, temp6)); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), _mm_unpacklo_epi64(temp5, temp7)); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), _mm_unpackhi_epi64(temp5, temp7)); } else { - + for (count = 0; count < 4; ++count) { EB_U64 horiz; deltaSum += intraPredAngle; deltaInt = (deltaSum >> 5); - + deltaFract = _mm_cvtsi32_si128(deltaSum & 31); deltaFract = _mm_unpacklo_epi16(deltaFract, deltaFract); deltaFract = _mm_unpacklo_epi32(deltaFract, deltaFract); @@ -2496,7 +2496,7 @@ void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( refSampCoeff = _mm_sub_epi16(xmm_C32, deltaFract); vertical_temp = _mm_srai_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_and_si128(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt)), skip_mask), refSampCoeff), _mm_add_epi16(_mm_mullo_epi16(_mm_and_si128(_mm_loadl_epi64((__m128i *)(refSampMain + deltaInt + 1)), skip_mask), deltaFract), xmm_C16)), 5); - + horiz = _mm_cvtsi128_si64(vertical_temp); *predictionPtr = (EB_U16)horiz; *(predictionPtr + pStride) = (EB_U16)(horiz >> 32); diff --git a/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c index f7a4320cd..739ed3350 100644 --- a/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbIntraPrediction_Intrinsic_SSE2.c @@ -101,19 +101,19 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 topOffset = (size << 1) + 1; EB_U32 topLeftOffset = (size << 1); EB_U32 leftOffset = 0; EB_U32 pStride = predictionBufferStride; - __m128i xmm_0, top, topLeft, filter_cmpnt0_7, unclipped, clipped; + __m128i xmm_0, top, topLeft, filter_cmpnt0_7, unclipped, clipped; __m128i left0_15, left0_7, left8_15, left0_3, left4_7, left8_11, left12_15, left01, left23, left45, left67, left89, left10_11; __m128i left12_13, left14_15, left0, left1, left2, left3, left4, left5, left6, left7, left8, left9, left10, left11; __m128i left12, left13, left14, left15; - - if (size != 32) { + + if (size != 32) { topLeft = _mm_cvtsi32_si128(*(refSamples + topLeftOffset)); xmm_0 = _mm_setzero_si128(); @@ -126,19 +126,19 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( if (size == 16) { __m128i filter_cmpnt8_15; - + top = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - + filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(top, xmm_0), topLeft), 1); filter_cmpnt8_15 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(top, xmm_0), topLeft), 1); left0_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); left0_7 = _mm_unpacklo_epi8(left0_15, left0_15); left8_15 = _mm_unpackhi_epi8(left0_15, left0_15); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); - left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); - left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); + left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); + left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); left01 = _mm_unpacklo_epi32(left0_3, left0_3); @@ -149,10 +149,10 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( left10_11 = _mm_unpackhi_epi32(left8_11, left8_11); left12_13 = _mm_unpacklo_epi32(left12_15, left12_15); left14_15 = _mm_unpackhi_epi32(left12_15, left12_15); - - left0 = _mm_unpacklo_epi8(left01, xmm_0); + + left0 = _mm_unpacklo_epi8(left01, xmm_0); clipped = _mm_packus_epi16(_mm_add_epi16(left0, filter_cmpnt0_7), _mm_add_epi16(filter_cmpnt8_15, left0)); - + left1 = _mm_unpackhi_epi64(left01, left01); left2 = _mm_unpacklo_epi64(left23, left23); left3 = _mm_unpackhi_epi64(left23, left23); @@ -183,27 +183,27 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left9); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), left10); _mm_storeu_si128((__m128i *)(predictionPtr+3*pStride), left11); - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, left12); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left13); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), left14); _mm_storeu_si128((__m128i *)(predictionPtr+3*pStride), left15); } - else if (size == 8) { - + else if (size == 8) { + filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_0), topLeft), 1); left0_7 = _mm_loadl_epi64((__m128i *)(refSamples + leftOffset)); left0_7 = _mm_unpacklo_epi8(left0_7, left0_7); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); left67 = _mm_unpackhi_epi32(left4_7, left4_7); - + unclipped = _mm_add_epi16(_mm_unpacklo_epi8(left01, xmm_0), filter_cmpnt0_7); clipped = _mm_packus_epi16(unclipped, unclipped); @@ -217,55 +217,55 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( _mm_storel_epi64((__m128i *)(predictionPtr + 2 * pStride), left67); _mm_storel_epi64((__m128i *)(predictionPtr + 3 * pStride), _mm_srli_si128(left67, 8)); - } else { + } else { __m128i filter_cmpnt0_3; - filter_cmpnt0_3 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_0), topLeft), 1); - - left0_3 = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)); + filter_cmpnt0_3 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32*)(refSamples + topOffset)), xmm_0), topLeft), 1); + + left0_3 = _mm_cvtsi32_si128(*(EB_U32*)(refSamples + leftOffset)); left0_3 = _mm_unpacklo_epi8(left0_3, left0_3); //00112233 left0_3 = _mm_unpacklo_epi16(left0_3, left0_3); //0000111122223333 - - left01 = _mm_unpacklo_epi32(left0_3, left0_3); - left23 = _mm_unpackhi_epi32(left0_3, left0_3); - unclipped = _mm_add_epi16(_mm_unpacklo_epi8(left01, xmm_0), filter_cmpnt0_3); - clipped = _mm_packus_epi16(unclipped, unclipped); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); + left23 = _mm_unpackhi_epi32(left0_3, left0_3); + + unclipped = _mm_add_epi16(_mm_unpacklo_epi8(left01, xmm_0), filter_cmpnt0_3); + clipped = _mm_packus_epi16(unclipped, unclipped); + *(EB_U32*)predictionPtr = _mm_cvtsi128_si32(clipped); - *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left01, 8)); - *(EB_U32*)(predictionPtr + 2 * pStride) = _mm_cvtsi128_si32(left23); - *(EB_U32*)(predictionPtr + 3 * pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left23, 8)); + *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left01, 8)); + *(EB_U32*)(predictionPtr + 2 * pStride) = _mm_cvtsi128_si32(left23); + *(EB_U32*)(predictionPtr + 3 * pStride) = _mm_cvtsi128_si32(_mm_srli_si128(left23, 8)); } } else { __m128i left0_14_even, left_0_6_even, left02, left46, skip_mask; - - skip_mask = _mm_set1_epi16(0x00FF); - pStride <<= 1; - + + skip_mask = _mm_set1_epi16(0x00FF); + pStride <<= 1; + if (size == 16) { __m128i filter_cmpnt8_15, left_8_14_even, left8_10, left12_14, left02_16wide; top = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); - filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(top, xmm_0), topLeft), 1); + filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(top, xmm_0), topLeft), 1); filter_cmpnt8_15 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpackhi_epi8(top, xmm_0), topLeft), 1); - + left0_14_even = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), skip_mask); left0_14_even = _mm_packus_epi16(left0_14_even, left0_14_even); left0_14_even = _mm_unpacklo_epi8(left0_14_even, left0_14_even); left_0_6_even = _mm_unpacklo_epi16(left0_14_even, left0_14_even); left_8_14_even = _mm_unpackhi_epi16(left0_14_even, left0_14_even); - + left02 = _mm_unpacklo_epi32(left_0_6_even, left_0_6_even); left46 = _mm_unpackhi_epi32(left_0_6_even, left_0_6_even); left8_10 = _mm_unpacklo_epi32(left_8_14_even, left_8_14_even); left12_14 = _mm_unpackhi_epi32(left_8_14_even, left_8_14_even); - + left02_16wide = _mm_unpacklo_epi8(left02, xmm_0); clipped = _mm_packus_epi16(_mm_add_epi16(left02_16wide, filter_cmpnt0_7), _mm_add_epi16(filter_cmpnt8_15, left02_16wide)); - + left2 = _mm_unpackhi_epi64(left02, left02); left4 = _mm_unpacklo_epi64(left46, left46); left6 = _mm_unpackhi_epi64(left46, left46); @@ -283,16 +283,16 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), left10); _mm_storeu_si128((__m128i *)(predictionPtr + 2 * pStride), left12); _mm_storeu_si128((__m128i *)(predictionPtr + 3 * pStride), left14); - + } else { filter_cmpnt0_7 = _mm_srai_epi16(_mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(refSamples + topOffset)), xmm_0), topLeft), 1); left_0_6_even = _mm_and_si128(_mm_loadl_epi64((__m128i *)(refSamples + leftOffset)), skip_mask); - left_0_6_even = _mm_packus_epi16(left_0_6_even, left_0_6_even); + left_0_6_even = _mm_packus_epi16(left_0_6_even, left_0_6_even); left_0_6_even = _mm_unpacklo_epi8(left_0_6_even, left_0_6_even); left_0_6_even = _mm_unpacklo_epi16(left_0_6_even, left_0_6_even); - + left02 = _mm_unpacklo_epi32(left_0_6_even, left_0_6_even); left46 = _mm_unpackhi_epi32(left_0_6_even, left_0_6_even); @@ -314,15 +314,15 @@ void IntraModeHorizontalLuma_SSE2_INTRIN( for (count = 0; count < 2; ++count) { left0_15 = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); refSamples += 16; - + left0_7 = _mm_unpacklo_epi8(left0_15, left0_15); left8_15 = _mm_unpackhi_epi8(left0_15, left0_15); - + left0_3 = _mm_unpacklo_epi16(left0_7, left0_7); left4_7 = _mm_unpackhi_epi16(left0_7, left0_7); left8_11 = _mm_unpacklo_epi16(left8_15, left8_15); left12_15 = _mm_unpackhi_epi16(left8_15, left8_15); - + left01 = _mm_unpacklo_epi32(left0_3, left0_3); left23 = _mm_unpackhi_epi32(left0_3, left0_3); left45 = _mm_unpacklo_epi32(left4_7, left4_7); @@ -404,13 +404,13 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip) //skip one row + const EB_BOOL skip) //skip one row { EB_U32 pStride = predictionBufferStride; EB_U32 leftOffset = 0; //Jing: //Add size == 32 for 444 - + __m128i left0_15, left0_7, left8_15, left0_3, left4_7, left8_11, left12_15, left01, left23, left45, left67, left89, left10_11; __m128i left12_13, left14_15, left0, left1, left2, left3, left4, left5, left6, left7, left8, left9, left10, left11; __m128i left12, left13, left14, left15; @@ -497,12 +497,12 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm0 = _mm_loadu_si128((__m128i *)(refSamples+leftOffset)); xmm8 = _mm_unpackhi_epi8(xmm0, xmm0); xmm0 = _mm_unpacklo_epi8(xmm0, xmm0); - + xmm4 = _mm_unpackhi_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); xmm12 = _mm_unpackhi_epi16(xmm8, xmm8); xmm8 = _mm_unpacklo_epi16(xmm8, xmm8); - + xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); xmm6 = _mm_unpackhi_epi32(xmm4, xmm4); @@ -511,7 +511,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm8 = _mm_unpacklo_epi32(xmm8, xmm8); xmm14 = _mm_unpackhi_epi32(xmm12, xmm12); xmm12 = _mm_unpacklo_epi32(xmm12, xmm12); - + _mm_storeu_si128((__m128i *)predictionPtr, _mm_unpacklo_epi64(xmm0, xmm0)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(xmm0, xmm0)); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), _mm_unpacklo_epi64(xmm2, xmm2)); @@ -526,7 +526,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(xmm8, xmm8)); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), _mm_unpacklo_epi64(xmm10, xmm10)); _mm_storeu_si128((__m128i *)(predictionPtr+3*pStride), _mm_unpackhi_epi64(xmm10, xmm10)); - predictionPtr += (pStride << 2); + predictionPtr += (pStride << 2); _mm_storeu_si128((__m128i *)predictionPtr, _mm_unpacklo_epi64(xmm12, xmm12)); _mm_storeu_si128((__m128i *)(predictionPtr + pStride), _mm_unpackhi_epi64(xmm12, xmm12)); _mm_storeu_si128((__m128i *)(predictionPtr+2*pStride), _mm_unpacklo_epi64(xmm14, xmm14)); @@ -538,12 +538,12 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm0 = _mm_unpacklo_epi8(xmm0, xmm0); xmm4 = _mm_unpackhi_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); - + xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); xmm6 = _mm_unpackhi_epi32(xmm4, xmm4); xmm4 = _mm_unpacklo_epi32(xmm4, xmm4); - + _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); _mm_storel_epi64((__m128i *)(predictionPtr+pStride), _mm_srli_si128(xmm0, 8)); _mm_storel_epi64((__m128i *)(predictionPtr+2*pStride), xmm2); @@ -576,13 +576,13 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( MACRO_HORIZONTAL_LUMA_32X16(16) } else if (size == 16) { __m128i xmm0, xmm2, xmm4, xmm6; - + xmm0 = _mm_and_si128(_mm_loadu_si128((__m128i *)(refSamples + leftOffset)), xmm15); xmm0 = _mm_packus_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi8(xmm0, xmm0); xmm4 = _mm_unpackhi_epi16(xmm0, xmm0); xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); - + xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); xmm6 = _mm_unpackhi_epi32(xmm4, xmm4); @@ -607,7 +607,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); xmm2 = _mm_unpackhi_epi32(xmm0, xmm0); xmm0 = _mm_unpacklo_epi32(xmm0, xmm0); - + _mm_storel_epi64((__m128i *)(predictionPtr), xmm0); _mm_storel_epi64((__m128i *)(predictionPtr + pStride), _mm_srli_si128(xmm0, 8)); _mm_storel_epi64((__m128i *)(predictionPtr + 2*pStride), xmm2); @@ -622,7 +622,7 @@ void IntraModeHorizontalChroma_SSE2_INTRIN( *(EB_U32*)(predictionPtr) = _mm_cvtsi128_si32(xmm0); *(EB_U32*)(predictionPtr + pStride) = _mm_cvtsi128_si32(_mm_srli_si128(xmm0, 4)); - } + } } } @@ -645,7 +645,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( if (size != 4) { __m128i xmm_TopRight, xmm_BottomLeft; __m128i pred_0, pred_1, pred_2, pred_3; - + xmm_TopRight = _mm_cvtsi32_si128((EB_U32)*(refSamples + topRightOffset)); xmm_TopRight = _mm_unpacklo_epi16(xmm_TopRight, xmm_TopRight); xmm_TopRight = _mm_unpacklo_epi32(xmm_TopRight, xmm_TopRight); @@ -654,7 +654,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( xmm_BottomLeft = _mm_unpacklo_epi16(xmm_BottomLeft, xmm_BottomLeft); xmm_BottomLeft = _mm_unpacklo_epi32(xmm_BottomLeft, xmm_BottomLeft); xmm_BottomLeft = _mm_unpacklo_epi64(xmm_BottomLeft, xmm_BottomLeft); - + if (size == 32) { __m128i xmm_ref, xmm_ref16; __m128i xmm_topRightAddSize0, xmm_topRightAddSize1, xmm_topRightAddSize2, xmm_topRightAddSize3, xmm_top0, xmm_top1, xmm_top2, xmm_top3; @@ -673,36 +673,36 @@ void IntraModePlanar16bit_SSE2_INTRIN( refSamples += leftOffset; if (!skip) { - EB_U32 count1; - + EB_U32 count1; + // The coefficients will be size-1, size-2, ... so we start at 31, 30, ... and reverse towards 0 for (reverseCnt = 8; reverseCnt > 0; reverseCnt -= 2) { - + bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + 4 * reverseCnt + OFFSET_1TO8 - 32))); - + xmm_ref = _mm_loadu_si128((__m128i *)(refSamples)); refSamples += 8; for (count1 = 0; count1 < 8; ++count1) { - + xmm_ref16 = _mm_unpacklo_epi16(xmm_ref, xmm_ref); xmm_ref16 = _mm_unpacklo_epi32(xmm_ref16, xmm_ref16); xmm_ref16 = _mm_unpacklo_epi64(xmm_ref16, xmm_ref16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_31TO24))), xmm_topRightAddSize0), bottomLeftTotal16), _mm_mullo_epi16(xmm_top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_23TO16))), xmm_topRightAddSize1), bottomLeftTotal16), _mm_mullo_epi16(xmm_top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); pred_2 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_15TO8))), xmm_topRightAddSize2), bottomLeftTotal16), _mm_mullo_epi16(xmm_top2, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); pred_3 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_7TO0))), xmm_topRightAddSize3), bottomLeftTotal16), _mm_mullo_epi16(xmm_top3, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 6); - + _mm_storeu_si128((__m128i *)(predictionPtr), pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); _mm_storeu_si128((__m128i *)(predictionPtr + 16), pred_2); _mm_storeu_si128((__m128i *)(predictionPtr + 24), pred_3); - + // For next iteration coefOffset -= 8; predictionPtr += pStride; @@ -715,25 +715,25 @@ void IntraModePlanar16bit_SSE2_INTRIN( for (reverseCnt = 4; reverseCnt > 0; reverseCnt -= 2) { bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + 4 * reverseCnt + OFFSET_1TO15 - 16))); - xmm_ref = _mm_packs_epi32(_mm_srli_epi32(_mm_slli_epi32(_mm_loadu_si128((__m128i *)(refSamples)), 16), 16), + xmm_ref = _mm_packs_epi32(_mm_srli_epi32(_mm_slli_epi32(_mm_loadu_si128((__m128i *)(refSamples)), 16), 16), _mm_srli_epi32(_mm_slli_epi32(_mm_loadu_si128((__m128i *)(refSamples + 8)), 16), 16)); refSamples += 16; for (count = 0; count < 8; ++count) { - + xmm_ref16 = _mm_unpacklo_epi16(xmm_ref, xmm_ref); xmm_ref16 = _mm_unpacklo_epi32(xmm_ref16, xmm_ref16); xmm_ref16 = _mm_unpacklo_epi64(xmm_ref16, xmm_ref16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_31TO24))), xmm_topRightAddSize0), bottomLeftTotal16), _mm_mullo_epi16(xmm_top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_23TO16))), xmm_topRightAddSize1), bottomLeftTotal16), _mm_mullo_epi16(xmm_top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); pred_2 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_15TO8))), xmm_topRightAddSize2), bottomLeftTotal16), _mm_mullo_epi16(xmm_top2, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); pred_3 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(xmm_ref16, _mm_load_si128((__m128i *)(coeffArray + OFFSET_7TO0))), xmm_topRightAddSize3), bottomLeftTotal16), _mm_mullo_epi16(xmm_top3, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))),6); - + _mm_storeu_si128((__m128i *)(predictionPtr), pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); _mm_storeu_si128((__m128i *)(predictionPtr + 16), pred_2); @@ -752,7 +752,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( __m128i topRightTotal0, topRightTotal1, top0, top1, left1, bottomLeftTotal1, leftCoeff0, leftCoeff1; coefOffset = OFFSET_15; // The coefficients will be size-1, size-2, ... so we start at 15, 14, ... and reverse towards 0 - + topRightTotal0 = _mm_add_epi16(_mm_mullo_epi16(xmm_TopRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_16))); topRightTotal1 = _mm_add_epi16(_mm_mullo_epi16(xmm_TopRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_9TO16))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_16))); top0 = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); @@ -776,14 +776,14 @@ void IntraModePlanar16bit_SSE2_INTRIN( bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff0), topRightTotal0), bottomLeftTotal16), _mm_mullo_epi16(top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff1), topRightTotal1), bottomLeftTotal16), _mm_mullo_epi16(top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); _mm_storeu_si128((__m128i *)predictionPtr, pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); - + // Next iteration coefOffset -= 8; predictionPtr += pStride; @@ -795,22 +795,22 @@ void IntraModePlanar16bit_SSE2_INTRIN( } } else { - bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO15))); + bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO15))); left = _mm_packs_epi32(_mm_srli_epi32(_mm_slli_epi32(left, 16), 16), _mm_srli_epi32(_mm_slli_epi32(left1, 16), 16)); for (count = 0; count < 8; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); - left16 = _mm_unpacklo_epi64(left16, left16); - + left16 = _mm_unpacklo_epi64(left16, left16); + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); + pred_0 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff0), topRightTotal0), bottomLeftTotal16), _mm_mullo_epi16(top0, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); pred_1 = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff1), topRightTotal1), bottomLeftTotal16), _mm_mullo_epi16(top1, _mm_load_si128((__m128i *)(coeffArray + coefOffset)))), 5); - + _mm_storeu_si128((__m128i *)predictionPtr, pred_0); _mm_storeu_si128((__m128i *)(predictionPtr + 8), pred_1); @@ -823,25 +823,25 @@ void IntraModePlanar16bit_SSE2_INTRIN( } } else { - + topRightAddSize = _mm_add_epi16(_mm_mullo_epi16(xmm_TopRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_8))); top = _mm_loadu_si128((__m128i *)(refSamples + topOffset)); left = _mm_loadu_si128((__m128i *)(refSamples + leftOffset)); leftCoeff = _mm_load_si128((__m128i *)(coeffArray + OFFSET_7TO0)); if (!skip) { - + bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))); for (count = 0; count < 8; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); left16 = _mm_unpacklo_epi64(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); - + pred = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff), topRightAddSize), bottomLeftTotal16), _mm_mullo_epi16(top, _mm_load_si128((__m128i *)(coeffArray + OFFSET_7)))), 4); _mm_storeu_si128((__m128i *)(predictionPtr), pred); @@ -850,18 +850,18 @@ void IntraModePlanar16bit_SSE2_INTRIN( predictionPtr += pStride; left = _mm_srli_si128(left, 2); bottomLeftTotal = _mm_srli_si128(bottomLeftTotal, 2); - } - } + } + } else { bottomLeftTotal = _mm_mullo_epi16(xmm_BottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO15))); left = _mm_srli_epi32(_mm_slli_epi32(left, 16), 16); for (count = 0; count < 4; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); left16 = _mm_unpacklo_epi64(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); bottomLeftTotal16 = _mm_unpacklo_epi64(bottomLeftTotal16, bottomLeftTotal16); @@ -879,7 +879,7 @@ void IntraModePlanar16bit_SSE2_INTRIN( } } else { - + topRight = _mm_cvtsi32_si128((EB_U32)*(refSamples + topRightOffset)); topRight = _mm_unpacklo_epi16(topRight, topRight); topRight = _mm_unpacklo_epi32(topRight, topRight); @@ -887,21 +887,21 @@ void IntraModePlanar16bit_SSE2_INTRIN( bottomLeft = _mm_cvtsi32_si128((EB_U32)*(refSamples + bottomLeftOffset)); bottomLeft = _mm_unpacklo_epi16(bottomLeft, bottomLeft); bottomLeft = _mm_unpacklo_epi32(bottomLeft, bottomLeft); - + topRightAddSize = _mm_add_epi16(_mm_mullo_epi16(topRight, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))), _mm_load_si128((__m128i *)(coeffArray + OFFSET_4))); - + top = _mm_loadl_epi64((__m128i *)(refSamples + topOffset)); left = _mm_loadl_epi64((__m128i *)(refSamples + leftOffset)); leftCoeff = _mm_loadl_epi64((__m128i *)(coeffArray + OFFSET_3TO0)); if (!skip) { bottomLeftTotal = _mm_mullo_epi16(bottomLeft, _mm_load_si128((__m128i *)(coeffArray + OFFSET_1TO8))); - + for (count = 0; count < 4; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); @@ -920,13 +920,13 @@ void IntraModePlanar16bit_SSE2_INTRIN( left = _mm_srli_epi32(_mm_slli_epi32(left, 16), 16); for (count = 0; count < 2; ++count) { - + left16 = _mm_unpacklo_epi16(left, left); left16 = _mm_unpacklo_epi32(left16, left16); - + bottomLeftTotal16 = _mm_unpacklo_epi16(bottomLeftTotal, bottomLeftTotal); bottomLeftTotal16 = _mm_unpacklo_epi32(bottomLeftTotal16, bottomLeftTotal16); - + pred = _mm_srli_epi16(_mm_add_epi16(_mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(left16, leftCoeff), topRightAddSize), bottomLeftTotal16), _mm_mullo_epi16(top, _mm_load_si128((__m128i *)(coeffArray + OFFSET_3)))), 3); _mm_storel_epi64((__m128i *)predictionPtr, pred); diff --git a/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h b/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h index 726b6a433..52950eddc 100644 --- a/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbIntraPrediction_SSE2.h @@ -37,7 +37,7 @@ extern void IntraModeHorizontalLuma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeHorizontalLuma16bit_SSE2_INTRIN( @@ -52,7 +52,7 @@ extern void IntraModeHorizontalChroma_SSE2_INTRIN( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); extern void IntraModeHorizontalChroma16bit_SSE2_INTRIN( @@ -94,9 +94,9 @@ extern void IntraModeAngular16bit_Vertical_Kernel_SSE2_INTRIN( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); void IntraModeAngular16bit_Horizontal_Kernel_SSE2_INTRIN( EB_U32 size, //input parameter, denotes the size of the current PU diff --git a/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c index 3b29ad1ca..b1517cb2c 100644 --- a/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbInvTransform_Intrinsic_SSE2.c @@ -247,9 +247,9 @@ void InvTransform4x4_SSE2_INTRIN( xmm_trans_2_4 = _mm_unpackhi_epi16(xmm0, xmm2); xmm_offset = _mm_srli_epi32(_mm_set1_epi32(0x0800), bitIncrement); - + MACRO_4x4(sra_epi32, xmm_shift) - + xmm_res_3_4 = _mm_unpackhi_epi16(xmm_res_1_3, xmm_res_2_4); xmm_res_1_2 = _mm_unpacklo_epi16(xmm_res_1_3, xmm_res_2_4); xmm_res_1_2_3_4_hi = _mm_unpackhi_epi32(xmm_res_1_2, xmm_res_3_4); @@ -285,7 +285,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_odd_hi = _mm_load_si128((__m128i *)(transformInnerArrayPtrAligned + OFFSET + 8));\ XMM_RES1 = _mm_packs_epi32(_mm_##SHIFT_INSTR(_mm_add_epi32(XMM_EVEN_LO, xmm_odd_lo), SHIFT), _mm_##SHIFT_INSTR(_mm_add_epi32(XMM_EVEN_HI, xmm_odd_hi), SHIFT));\ XMM_RES2 = _mm_packs_epi32(_mm_##SHIFT_INSTR(_mm_sub_epi32(XMM_EVEN_LO, xmm_odd_lo), SHIFT), _mm_##SHIFT_INSTR(_mm_sub_epi32(XMM_EVEN_HI, xmm_odd_hi), SHIFT)); - + EB_ALIGN(16) EB_S16 * transformInnerArrayPtrAligned = transformInnerArrayPtr; __m128i xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans4, xmm_trans_1_3_hi, xmm_trans_1_3_lo, xmm_trans_2_4_hi, xmm_trans_2_4_lo; @@ -306,7 +306,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_trans_1_3_lo = _mm_unpacklo_epi16(xmm_trans1, xmm_trans3); xmm_trans_2_4_hi = _mm_unpackhi_epi16(xmm_trans2, xmm_trans4); xmm_trans_2_4_lo = _mm_unpacklo_epi16(xmm_trans2, xmm_trans4); - + //Odd0 xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_89_50)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_18)); @@ -316,17 +316,17 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_N89)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N18_N50)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x10) - + //Odd2 xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_50_18)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N89_75)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x20) - + //Odd3 xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_18_75)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N50_N89)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x30) - + // Even transform coefficients (0,2,4,6) transformCoefficients -= srcStride; xmm_trans1 = _mm_loadu_si128((__m128i *)(transformCoefficients)); @@ -342,7 +342,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_64)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_N64)); xmm_offset = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64)); - + xmm_evenEven0L = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_lo, xmm_DCT1), xmm_offset); xmm_evenEven0H = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_hi, xmm_DCT1), xmm_offset); @@ -351,7 +351,7 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_83_36)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_36_N83)); - + xmm_evenOdd0L = _mm_madd_epi16(xmm_trans_2_4_lo, xmm_DCT1); xmm_evenOdd0H = _mm_madd_epi16(xmm_trans_2_4_hi, xmm_DCT1); xmm_evenOdd1L = _mm_madd_epi16(xmm_trans_2_4_lo, xmm_DCT2); @@ -381,7 +381,7 @@ void InvTransform8x8_SSE2_INTRIN( _mm_store_si128((__m128i *)(transformInnerArrayPtrAligned + 0x48), xmm_res02_hi); _mm_store_si128((__m128i *)(transformInnerArrayPtrAligned + 0x50), xmm_res01_hi); _mm_store_si128((__m128i *)(transformInnerArrayPtrAligned + 0x58), xmm_res13_hi); - + // Odd transform coefficients from transformArrayPtr (high results from MACRO_UNPACK) xmm_trans_1_3_lo = _mm_unpacklo_epi16(xmm_res04_hi, xmm_res15_hi); xmm_trans_1_3_hi = _mm_unpackhi_epi16(xmm_res04_hi, xmm_res15_hi); @@ -390,22 +390,22 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_89_50)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_18)); - + MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0) xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_75_N89)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N18_N50)); MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x10) - + xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_50_18)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N89_75)); - + MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x20) xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_18_75)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_N50_N89)); - + MACRO_8X8_ODD(xmm_trans_1_3_lo, xmm_trans_1_3_hi, xmm_trans_2_4_lo, xmm_trans_2_4_hi, xmm_DCT1, xmm_DCT2, 0x30) // Load even transform coefficients from transformArrayPtr @@ -421,8 +421,8 @@ void InvTransform8x8_SSE2_INTRIN( xmm_DCT1 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_64)); xmm_DCT2 = _mm_load_si128((__m128i *)(InvTransformAsmConst_SSE2 + OFFSET_64_N64)); - xmm_offset = _mm_srli_epi32(_mm_set1_epi32(0x0800), bitIncrement); - + xmm_offset = _mm_srli_epi32(_mm_set1_epi32(0x0800), bitIncrement); + xmm_evenEven0L = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_lo, xmm_DCT1), xmm_offset); xmm_evenEven0H = _mm_add_epi32(_mm_madd_epi16(xmm_trans_1_3_hi, xmm_DCT1), xmm_offset); @@ -522,13 +522,13 @@ void InvDstTransform4x4_SSE2_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(InvDstTransformAsmConst_SSE2 + OFFSET_DST_64)); MACRO_DST_4X4(srai_epi32, 7) - + xmm_trans_1_3 = _mm_unpacklo_epi16(xmm_res_lo_32, xmm_res_hi_32); xmm_trans_2_4 = _mm_unpackhi_epi16(xmm_res_lo_32, xmm_res_hi_32); - + xmm_offset = _mm_srli_epi32(_mm_sll_epi32(xmm_offset, xmm_shift), 7); MACRO_DST_4X4(sra_epi32, xmm_shift) - + _mm_storel_epi64((__m128i *)(residual), xmm_res_lo_32); xmm_res_lo_32 = _mm_srli_si128(xmm_res_lo_32, 8); _mm_storel_epi64((__m128i *)(residual + dstStride), xmm_res_lo_32); diff --git a/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c index 3bc9507d0..8d01d3729 100644 --- a/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbMcp16bit_Intrinsic_SSE2.c @@ -1972,9 +1972,9 @@ void LumaInterpolationFilterPosnOutRaw16bit_SSE2_INTRIN( void ChromaInterpolationFilterOneD16bitHorizontal_SSE2_INTRIN( EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, EB_S16 *firstPassIFDst, EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr, *qtr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr, *qtr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; (void)firstPassIFDst; (void)fracPosy; @@ -2103,10 +2103,10 @@ EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, void ChromaInterpolationFilterOneD16bitVertical_SSE2_INTRIN( EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, EB_S16 *firstPassIFDst, EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr, *qtr; - __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; - __m128i sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr, *qtr; + __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; + __m128i sum; (void)firstPassIFDst; (void)fracPosx; @@ -2122,7 +2122,7 @@ EB_U16 *refPic, EB_U32 srcStride, EB_U16 *dst, EB_U32 dstStride, EB_U32 puWidth, //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); if (puWidth & 2) { - __m128i a4, a5, b2, b3, d0, d1, d2, d3; + __m128i a4, a5, b2, b3, d0, d1, d2, d3; ptr = refPic; qtr = dst; @@ -2238,9 +2238,9 @@ void ChromaInterpolationFilterOneDOutRaw16bitHorizontal_SSE2_INTRIN( EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, sum; (void)firstPassIFDst; (void)fracPosy; @@ -2366,10 +2366,10 @@ void ChromaInterpolationFilterOneDOutRaw16bitVertical_SSE2_INTRIN( EB_U32 fracPosx, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *ptr; - __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; - __m128i sum; + EB_U32 rowCount, colCount; + EB_U16 *ptr; + __m128i a0, a1, a2, a3, b0, b1, c0, c1, c2, c3; + __m128i sum; (void)firstPassIFDst; (void)fracPosx; @@ -2385,7 +2385,7 @@ void ChromaInterpolationFilterOneDOutRaw16bitVertical_SSE2_INTRIN( //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); if (puWidth & 2) { - __m128i a4, a5, b2, b3, d0, d1, d2, d3; + __m128i a4, a5, b2, b3, d0, d1, d2, d3; ptr = refPic; a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptr); ptr += srcStride; @@ -2487,10 +2487,10 @@ void ChromaInterpolationFilterTwoDInRaw16bit_SSE2_INTRIN( EB_U32 puHeight, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - EB_U16 *qtr; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; - __m128i sum0, sum1; + EB_U32 rowCount, colCount; + EB_U16 *qtr; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; + __m128i sum0, sum1; //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); @@ -2616,9 +2616,9 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSE2_INTRIN( EB_U32 puHeight, EB_U32 fracPosy) { - EB_U32 rowCount, colCount; - __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; - __m128i sum0, sum1; + EB_U32 rowCount, colCount; + __m128i a0, a1, a2, a3, b0, b1, b2, b3, c0, c1; + __m128i sum0, sum1; //PrefetchBlock(refPic, srcStride, puWidth+8, puHeight); @@ -2823,162 +2823,162 @@ void BiPredClipping16bit_SSE2_INTRIN( while (colCount != 0); } - void BiPredClippingOnTheFly16bit_SSE2( - EB_U16 *list0Src, - EB_U32 list0SrcStride, - EB_U16 *list1Src, - EB_U32 list1SrcStride, - EB_U16 *dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight) - { - EB_U32 rowCount, colCount; - __m128i a0, a1; - __m128i a2, a3; - - if (puWidth & 2) { - __m128i a4; - EB_U16 *qtr = dst; - EB_U16 *ptrSrc0 = list0Src; - EB_U16 *ptrSrc1 = list1Src; - rowCount = puHeight; - do { - - a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi32(a0, a1); - a2 = _mm_unpacklo_epi32(a2, a3); - a0 = _mm_unpacklo_epi64(a0, a2); - a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); - a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a4 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; - a4 = _mm_unpacklo_epi32(a4, a1); - a2 = _mm_unpacklo_epi32(a2, a3); - a4 = _mm_unpacklo_epi64(a4, a2); - a4 = _mm_slli_epi16(a4, BI_SHIFT_10BIT); - a4 = _mm_sub_epi16(a4, _mm_set1_epi16(BI_OFFSET_10BIT)); - - - a0 = _mm_adds_epi16(a0, a4); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); - a0 = _mm_max_epi16(a0, _mm_setzero_si128()); - - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; - *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); qtr += dstStride; - rowCount -= 4; - } while (rowCount != 0); - - puWidth -= 2; - if (puWidth == 0) { - return; - } - - list0Src += 2; - list1Src += 2; - dst += 2; - } - - if (puWidth & 4) { - EB_U16 *qtr = dst; - EB_U16 *ptrSrc0 = list0Src; - EB_U16 *ptrSrc1 = list1Src; - rowCount = puHeight; - do { - - a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi64(a0, a1); - a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); - a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi64(a2, a3); - a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); - a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a0 = _mm_adds_epi16(a0, a2/*a1*/); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); - a0 = _mm_max_epi16(a0, _mm_setzero_si128()); - _mm_storel_epi64((__m128i *)qtr, a0); - a0 = _mm_srli_si128(a0, 8); - _mm_storel_epi64((__m128i *)(qtr + dstStride), a0); qtr += 2 * dstStride; - rowCount -= 2; - } while (rowCount != 0); - - puWidth -= 4; - if (puWidth == 0) { - return; - } - - list0Src += 4; - list1Src += 4; - dst += 4; - } - - colCount = puWidth; - do { - EB_U16 *qtr = dst; - EB_U16 *ptrSrc0 = list0Src; - EB_U16 *ptrSrc1 = list1Src; - rowCount = puHeight; - do { - a0 = _mm_loadu_si128((__m128i *)ptrSrc0); - a1 = _mm_loadu_si128((__m128i *)ptrSrc1); - ptrSrc0 += list0SrcStride; - ptrSrc1 += list1SrcStride; - a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); - a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); - a1 = _mm_slli_epi16(a1, BI_SHIFT_10BIT); - a1 = _mm_sub_epi16(a1, _mm_set1_epi16(BI_OFFSET_10BIT)); - - a0 = _mm_adds_epi16(a0, a1); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); - a0 = _mm_max_epi16(a0, _mm_setzero_si128()); - - a2 = _mm_loadu_si128((__m128i *)ptrSrc0); - a3 = _mm_loadu_si128((__m128i *)ptrSrc1); - ptrSrc0 += list0SrcStride; - ptrSrc1 += list1SrcStride; - a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); - a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); - a3 = _mm_slli_epi16(a3, BI_SHIFT_10BIT); - a3 = _mm_sub_epi16(a3, _mm_set1_epi16(BI_OFFSET_10BIT)); - a2 = _mm_adds_epi16(a2, a3); - a2 = _mm_adds_epi16(a2, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); - a2 = _mm_srai_epi16(a2, BI_AVG_SHIFT_10BIT); - a2 = _mm_max_epi16(a2, _mm_setzero_si128()); - - _mm_storeu_si128((__m128i *)qtr, a0); - _mm_storeu_si128((__m128i *)(qtr + dstStride), a2); - qtr += 2 * dstStride; - - rowCount -= 2; - } while (rowCount != 0); - - colCount -= 8; - list0Src += 8; - list1Src += 8; - dst += 8; - } while (colCount != 0); - - } + void BiPredClippingOnTheFly16bit_SSE2( + EB_U16 *list0Src, + EB_U32 list0SrcStride, + EB_U16 *list1Src, + EB_U32 list1SrcStride, + EB_U16 *dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight) + { + EB_U32 rowCount, colCount; + __m128i a0, a1; + __m128i a2, a3; + + if (puWidth & 2) { + __m128i a4; + EB_U16 *qtr = dst; + EB_U16 *ptrSrc0 = list0Src; + EB_U16 *ptrSrc1 = list1Src; + rowCount = puHeight; + do { + + a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi32(a0, a1); + a2 = _mm_unpacklo_epi32(a2, a3); + a0 = _mm_unpacklo_epi64(a0, a2); + a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); + a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a4 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a3 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list0SrcStride; + a4 = _mm_unpacklo_epi32(a4, a1); + a2 = _mm_unpacklo_epi32(a2, a3); + a4 = _mm_unpacklo_epi64(a4, a2); + a4 = _mm_slli_epi16(a4, BI_SHIFT_10BIT); + a4 = _mm_sub_epi16(a4, _mm_set1_epi16(BI_OFFSET_10BIT)); + + + a0 = _mm_adds_epi16(a0, a4); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); + a0 = _mm_max_epi16(a0, _mm_setzero_si128()); + + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); a0 = _mm_srli_si128(a0, 4); qtr += dstStride; + *(EB_U32 *)qtr = _mm_cvtsi128_si32(a0); qtr += dstStride; + rowCount -= 4; + } while (rowCount != 0); + + puWidth -= 2; + if (puWidth == 0) { + return; + } + + list0Src += 2; + list1Src += 2; + dst += 2; + } + + if (puWidth & 4) { + EB_U16 *qtr = dst; + EB_U16 *ptrSrc0 = list0Src; + EB_U16 *ptrSrc1 = list1Src; + rowCount = puHeight; + do { + + a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi64(a0, a1); + a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); + a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi64(a2, a3); + a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); + a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a0 = _mm_adds_epi16(a0, a2/*a1*/); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); + a0 = _mm_max_epi16(a0, _mm_setzero_si128()); + _mm_storel_epi64((__m128i *)qtr, a0); + a0 = _mm_srli_si128(a0, 8); + _mm_storel_epi64((__m128i *)(qtr + dstStride), a0); qtr += 2 * dstStride; + rowCount -= 2; + } while (rowCount != 0); + + puWidth -= 4; + if (puWidth == 0) { + return; + } + + list0Src += 4; + list1Src += 4; + dst += 4; + } + + colCount = puWidth; + do { + EB_U16 *qtr = dst; + EB_U16 *ptrSrc0 = list0Src; + EB_U16 *ptrSrc1 = list1Src; + rowCount = puHeight; + do { + a0 = _mm_loadu_si128((__m128i *)ptrSrc0); + a1 = _mm_loadu_si128((__m128i *)ptrSrc1); + ptrSrc0 += list0SrcStride; + ptrSrc1 += list1SrcStride; + a0 = _mm_slli_epi16(a0, BI_SHIFT_10BIT); + a0 = _mm_sub_epi16(a0, _mm_set1_epi16(BI_OFFSET_10BIT)); + a1 = _mm_slli_epi16(a1, BI_SHIFT_10BIT); + a1 = _mm_sub_epi16(a1, _mm_set1_epi16(BI_OFFSET_10BIT)); + + a0 = _mm_adds_epi16(a0, a1); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a0 = _mm_srai_epi16(a0, BI_AVG_SHIFT_10BIT); + a0 = _mm_max_epi16(a0, _mm_setzero_si128()); + + a2 = _mm_loadu_si128((__m128i *)ptrSrc0); + a3 = _mm_loadu_si128((__m128i *)ptrSrc1); + ptrSrc0 += list0SrcStride; + ptrSrc1 += list1SrcStride; + a2 = _mm_slli_epi16(a2, BI_SHIFT_10BIT); + a2 = _mm_sub_epi16(a2, _mm_set1_epi16(BI_OFFSET_10BIT)); + a3 = _mm_slli_epi16(a3, BI_SHIFT_10BIT); + a3 = _mm_sub_epi16(a3, _mm_set1_epi16(BI_OFFSET_10BIT)); + a2 = _mm_adds_epi16(a2, a3); + a2 = _mm_adds_epi16(a2, _mm_set1_epi16(BI_AVG_OFFSET_10BIT)); + a2 = _mm_srai_epi16(a2, BI_AVG_SHIFT_10BIT); + a2 = _mm_max_epi16(a2, _mm_setzero_si128()); + + _mm_storeu_si128((__m128i *)qtr, a0); + _mm_storeu_si128((__m128i *)(qtr + dstStride), a2); + qtr += 2 * dstStride; + + rowCount -= 2; + } while (rowCount != 0); + + colCount -= 8; + list0Src += 8; + list1Src += 8; + dst += 8; + } while (colCount != 0); + + } void LumaInterpolationFilterPose16bit_SSE2_INTRIN( EB_U16 *refPic, diff --git a/Source/Lib/ASM_SSE2/EbMcp_SSE2.h b/Source/Lib/ASM_SSE2/EbMcp_SSE2.h index 09e754b29..335d55c8a 100644 --- a/Source/Lib/ASM_SSE2/EbMcp_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbMcp_SSE2.h @@ -15,27 +15,27 @@ extern EB_ALIGN(16) const EB_S16 IntraPredictionConst_SSE2[344]; /************************************************** * Assembly Declarations **************************************************/ -extern void PictureCopyKernel_SSE2(EB_BYTE src, EB_U32 srcStride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); +extern void PictureCopyKernel_SSE2(EB_BYTE src, EB_U32 srcStride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); void PictureAverageKernel_SSE2(EB_BYTE src0, EB_U32 src0Stride, EB_BYTE src1, EB_U32 src1Stride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); void PictureAverageKernel_SSE2_INTRIN(EB_BYTE src0, EB_U32 src0Stride, EB_BYTE src1, EB_U32 src1Stride, EB_BYTE dst, EB_U32 dstStride, EB_U32 areaWidth, EB_U32 areaHeight); void PictureAverageKernel1Line_SSE2_INTRIN( - EB_BYTE src0, - EB_BYTE src1, - EB_BYTE dst, - EB_U32 areaWidth); + EB_BYTE src0, + EB_BYTE src1, + EB_BYTE dst, + EB_U32 areaWidth); extern void BiPredClipping16bit_SSE2_INTRIN(EB_U32 puWidth, EB_U32 puHeight, EB_S16 *list0Src, EB_S16 *list1Src, EB_U16 *dst, EB_U32 dstStride); void BiPredClippingOnTheFly16bit_SSE2( - EB_U16 *list0Src, - EB_U32 list0SrcStride, - EB_U16 *list1Src, - EB_U32 list1SrcStride, - EB_U16 *dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight); + EB_U16 *list0Src, + EB_U32 list0SrcStride, + EB_U16 *list1Src, + EB_U32 list1SrcStride, + EB_U16 *dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight); // 16Bit extern void LumaInterpolationCopy16bit_SSE2(EB_U16* refPic, EB_U32 srcStride, EB_U16* dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, EB_S16 *firstPassIFDst); diff --git a/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c index 86bd06fa9..4ae905d4b 100644 --- a/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbMeSadCalculation_Intrinsic_SSE2.c @@ -8,137 +8,137 @@ #include "EbDefinitions.h" void SadCalculation_8x8_16x16_SSE2_INTRIN( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 *pBestSad8x8, - EB_U32 *pBestSad16x16, - EB_U32 *pBestMV8x8, - EB_U32 *pBestMV16x16, - EB_U32 mv, - EB_U32 *pSad16x16) + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 *pBestSad8x8, + EB_U32 *pBestSad16x16, + EB_U32 *pBestMV8x8, + EB_U32 *pBestMV16x16, + EB_U32 mv, + EB_U32 *pSad16x16) { __m128i xmm_sad16x16, xmm_sad8x8_0_1, xmm_sad8x8_2_3, xmm_sad16x16_total, sad8x8_0_3, sad8x8_less_than_bitmask, xmm_N1; __m128i sad8x8_greater_or_eq_bitmask, BestMV8x8, BestSad8x8, xmm_pBestSad8x8, xmm_pBestMV8x8, xmm_mv; - srcStride <<= 1; - refStride <<= 1; + srcStride <<= 1; + refStride <<= 1; //sad8x8_0, sad8x8_1 - - xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), + + xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src+srcStride)), _mm_loadu_si128((__m128i*)(ref+refStride)))); - xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2*srcStride))), _mm_loadu_si128((__m128i*)(ref + (2*refStride)))), xmm_sad8x8_0_1); - xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_0_1); - - src += srcStride<<2; - ref += refStride<<2; - + xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2*srcStride))), _mm_loadu_si128((__m128i*)(ref + (2*refStride)))), xmm_sad8x8_0_1); + xmm_sad8x8_0_1 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_0_1); + + src += srcStride<<2; + ref += refStride<<2; + //sad8x8_2, sad8x8_3 - xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), + xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)src), _mm_loadu_si128((__m128i*)ref)), _mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + srcStride)), _mm_loadu_si128((__m128i*)(ref + refStride)))); - xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (2 * refStride)))), xmm_sad8x8_2_3); - xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_2_3); - - xmm_sad16x16 = _mm_add_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3); + xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (2 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (2 * refStride)))), xmm_sad8x8_2_3); + xmm_sad8x8_2_3 = _mm_add_epi32(_mm_sad_epu8(_mm_loadu_si128((__m128i*)(src + (3 * srcStride))), _mm_loadu_si128((__m128i*)(ref + (3 * refStride)))), xmm_sad8x8_2_3); - xmm_sad16x16_total = _mm_slli_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sad16x16, 8), xmm_sad16x16), 1); + xmm_sad16x16 = _mm_add_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3); - *pSad16x16 = _mm_cvtsi128_si32(xmm_sad16x16_total); + xmm_sad16x16_total = _mm_slli_epi32(_mm_add_epi32(_mm_srli_si128(xmm_sad16x16, 8), xmm_sad16x16), 1); - sad8x8_0_3 = _mm_slli_epi32(_mm_packs_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3), 1); + *pSad16x16 = _mm_cvtsi128_si32(xmm_sad16x16_total); - xmm_mv = _mm_cvtsi64_si128(mv); - xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); - xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); + sad8x8_0_3 = _mm_slli_epi32(_mm_packs_epi32(xmm_sad8x8_0_1, xmm_sad8x8_2_3), 1); + + xmm_mv = _mm_cvtsi64_si128(mv); + xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); + xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); + + xmm_pBestSad8x8 = _mm_loadu_si128((__m128i*)pBestSad8x8); + xmm_pBestMV8x8 = _mm_loadu_si128((__m128i*)pBestMV8x8); - xmm_pBestSad8x8 = _mm_loadu_si128((__m128i*)pBestSad8x8); - xmm_pBestMV8x8 = _mm_loadu_si128((__m128i*)pBestMV8x8); - // sad8x8_0 < pBestSad8x8[0] for 0 to 3 - sad8x8_less_than_bitmask = _mm_cmplt_epi32(sad8x8_0_3, xmm_pBestSad8x8); + sad8x8_less_than_bitmask = _mm_cmplt_epi32(sad8x8_0_3, xmm_pBestSad8x8); + + xmm_N1 = _mm_cmpeq_epi8(xmm_sad8x8_0_1, xmm_sad8x8_0_1); - xmm_N1 = _mm_cmpeq_epi8(xmm_sad8x8_0_1, xmm_sad8x8_0_1); + sad8x8_greater_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad8x8_less_than_bitmask); - sad8x8_greater_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad8x8_less_than_bitmask); + BestSad8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestSad8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, sad8x8_0_3)); + BestMV8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestMV8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, xmm_mv)); - BestSad8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestSad8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, sad8x8_0_3)); - BestMV8x8 = _mm_or_si128(_mm_and_si128(xmm_pBestMV8x8, sad8x8_greater_or_eq_bitmask), _mm_and_si128(sad8x8_less_than_bitmask, xmm_mv)); + _mm_storeu_si128((__m128i*)pBestSad8x8, BestSad8x8); + _mm_storeu_si128((__m128i*)pBestMV8x8, BestMV8x8); - _mm_storeu_si128((__m128i*)pBestSad8x8, BestSad8x8); - _mm_storeu_si128((__m128i*)pBestMV8x8, BestMV8x8); - - EB_U64 sad16x16 = _mm_cvtsi128_si64(xmm_sad16x16_total); - if (sad16x16 < pBestSad16x16[0]){ - pBestSad16x16[0] = (EB_U32)sad16x16; - pBestMV16x16[0] = _mm_cvtsi128_si32(xmm_mv); - } + EB_U64 sad16x16 = _mm_cvtsi128_si64(xmm_sad16x16_total); + if (sad16x16 < pBestSad16x16[0]){ + pBestSad16x16[0] = (EB_U32)sad16x16; + pBestMV16x16[0] = _mm_cvtsi128_si32(xmm_mv); + } } void SadCalculation_32x32_64x64_SSE2_INTRIN( - EB_U32 *pSad16x16, - EB_U32 *pBestSad32x32, - EB_U32 *pBestSad64x64, - EB_U32 *pBestMV32x32, - EB_U32 *pBestMV64x64, - EB_U32 mv) + EB_U32 *pSad16x16, + EB_U32 *pBestSad32x32, + EB_U32 *pBestSad64x64, + EB_U32 *pBestMV32x32, + EB_U32 *pBestMV64x64, + EB_U32 mv) { __m128i xmm_N1, sad32x32_greater_than_bitmask, sad32x32_less_than_or_eq_bitmask, BestSad32x32, BestMV32x32, xmm_mv; __m128i Sad16x16_0_7_lo, Sad16x16_0_7_hi, Sad16x16_8_15_lo, Sad16x16_8_15_hi, xmm_sad64x64, xmm_sad64x64_total, xmm_pBestSad32x32, xmm_pBestMV32x32; - Sad16x16_0_7_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); - Sad16x16_0_7_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); - Sad16x16_8_15_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); - Sad16x16_8_15_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); + Sad16x16_0_7_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); + Sad16x16_0_7_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)pSad16x16), _mm_loadu_si128((__m128i*)(pSad16x16 + 4))); + Sad16x16_8_15_lo = _mm_unpacklo_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); + Sad16x16_8_15_hi = _mm_unpackhi_epi32(_mm_loadu_si128((__m128i*)(pSad16x16 + 8)), _mm_loadu_si128((__m128i*)(pSad16x16 + 12))); - xmm_sad64x64 = _mm_add_epi32(_mm_add_epi32(_mm_unpacklo_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo), _mm_unpackhi_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo)), + xmm_sad64x64 = _mm_add_epi32(_mm_add_epi32(_mm_unpacklo_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo), _mm_unpackhi_epi64(Sad16x16_0_7_lo, Sad16x16_8_15_lo)), _mm_add_epi32(_mm_unpacklo_epi64(Sad16x16_0_7_hi, Sad16x16_8_15_hi), _mm_unpackhi_epi64(Sad16x16_0_7_hi, Sad16x16_8_15_hi))); - xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64, 8), xmm_sad64x64); - - xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64_total, 4), xmm_sad64x64_total); + xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64, 8), xmm_sad64x64); + + xmm_sad64x64_total = _mm_add_epi32(_mm_srli_si128(xmm_sad64x64_total, 4), xmm_sad64x64_total); + + xmm_mv = _mm_cvtsi32_si128(mv); + xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); + xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); - xmm_mv = _mm_cvtsi32_si128(mv); - xmm_mv = _mm_unpacklo_epi32(xmm_mv, xmm_mv); - xmm_mv = _mm_unpacklo_epi64(xmm_mv, xmm_mv); + xmm_pBestSad32x32 = _mm_loadu_si128((__m128i*)pBestSad32x32); + xmm_pBestMV32x32 = _mm_loadu_si128((__m128i*)pBestMV32x32); - xmm_pBestSad32x32 = _mm_loadu_si128((__m128i*)pBestSad32x32); - xmm_pBestMV32x32 = _mm_loadu_si128((__m128i*)pBestMV32x32); + sad32x32_greater_than_bitmask = _mm_cmpgt_epi32(xmm_pBestSad32x32, xmm_sad64x64);// _mm_cmplt_epi32(xmm_pBestSad32x32, xmm_sad64x64); - sad32x32_greater_than_bitmask = _mm_cmpgt_epi32(xmm_pBestSad32x32, xmm_sad64x64);// _mm_cmplt_epi32(xmm_pBestSad32x32, xmm_sad64x64); - - xmm_N1 = _mm_cmpeq_epi8(xmm_mv, xmm_mv); // anything compared to itself is equal (get 0xFFFFFFFF) - sad32x32_less_than_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad32x32_greater_than_bitmask); - - BestSad32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestSad32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_sad64x64, sad32x32_greater_than_bitmask)); - BestMV32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestMV32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_mv, sad32x32_greater_than_bitmask)); + xmm_N1 = _mm_cmpeq_epi8(xmm_mv, xmm_mv); // anything compared to itself is equal (get 0xFFFFFFFF) + sad32x32_less_than_or_eq_bitmask = _mm_sub_epi32(xmm_N1, sad32x32_greater_than_bitmask); - _mm_storeu_si128((__m128i*)pBestSad32x32, BestSad32x32); - _mm_storeu_si128((__m128i*)pBestMV32x32, BestMV32x32); + BestSad32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestSad32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_sad64x64, sad32x32_greater_than_bitmask)); + BestMV32x32 = _mm_or_si128(_mm_and_si128(xmm_pBestMV32x32, sad32x32_less_than_or_eq_bitmask), _mm_and_si128(xmm_mv, sad32x32_greater_than_bitmask)); + _mm_storeu_si128((__m128i*)pBestSad32x32, BestSad32x32); + _mm_storeu_si128((__m128i*)pBestMV32x32, BestMV32x32); - EB_U32 sad64x64 = _mm_cvtsi128_si32(xmm_sad64x64_total); - if (sad64x64 < pBestSad64x64[0]){ - pBestSad64x64[0] = sad64x64; - pBestMV64x64[0] = _mm_cvtsi128_si32(xmm_mv); - } + + EB_U32 sad64x64 = _mm_cvtsi128_si32(xmm_sad64x64_total); + if (sad64x64 < pBestSad64x64[0]){ + pBestSad64x64[0] = sad64x64; + pBestMV64x64[0] = _mm_cvtsi128_si32(xmm_mv); + } } void InitializeBuffer_32bits_SSE2_INTRIN( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value) + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value) { __m128i xmm1, xmm2; EB_U32 index128; xmm2 = _mm_cvtsi32_si128(Value); xmm1 = _mm_or_si128(_mm_slli_si128(xmm2, 4), xmm2); xmm2 = _mm_or_si128(_mm_slli_si128(xmm1, 8), xmm1); - + for (index128 = 0; index128 < Count128; ++index128){ _mm_storeu_si128((__m128i *)Pointer, xmm2); Pointer += 4; diff --git a/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h b/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h index aadb8e1fe..641a1c81a 100644 --- a/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbMeSadCalculation_SSE2.h @@ -9,35 +9,35 @@ #include "EbDefinitions.h" #ifdef __cplusplus extern "C" { -#endif +#endif extern void InitializeBuffer_32bits_SSE2_INTRIN( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value); + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value); void SadCalculation_8x8_16x16_SSE2_INTRIN( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 *pBestSad8x8, - EB_U32 *pBestSad16x16, - EB_U32 *pBestMV8x8, - EB_U32 *pBestMV16x16, - EB_U32 mv, - EB_U32 *pSad16x16); + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 *pBestSad8x8, + EB_U32 *pBestSad16x16, + EB_U32 *pBestMV8x8, + EB_U32 *pBestMV16x16, + EB_U32 mv, + EB_U32 *pSad16x16); void SadCalculation_32x32_64x64_SSE2_INTRIN( - EB_U32 *pSad16x16, - EB_U32 *pBestSad32x32, - EB_U32 *pBestSad64x64, - EB_U32 *pBestMV32x32, - EB_U32 *pBestMV64x64, - EB_U32 mv); + EB_U32 *pSad16x16, + EB_U32 *pBestSad32x32, + EB_U32 *pBestSad64x64, + EB_U32 *pBestMV32x32, + EB_U32 *pBestMV64x64, + EB_U32 mv); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c index 4f29cb43c..06874f11e 100644 --- a/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbPackUnPack_Intrinsic_SSE2.c @@ -11,77 +11,77 @@ #include "EbDefinitions.h" void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, EB_U32 height ) { - EB_U32 x, y; + EB_U32 x, y; __m128i xmm_00FF, inPixel0, inPixel1, inPixel1_shftR_2_U8, inPixel0_shftR_2_U8, inPixel0_shftR_2, inPixel1_shftR_2; - xmm_00FF = _mm_set1_epi16(0x00FF); + xmm_00FF = _mm_set1_epi16(0x00FF); if (width == 8) - { - for (y = 0; y < height; y += 2) - { + { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - - } - else if (width == 16) - { + + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + + } + else if (width == 16) + { __m128i inPixel2, inPixel3; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + - - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - } - else if (width == 32) - { + + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + + } + else if (width == 32) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -91,31 +91,31 @@ void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - - } - else if (width == 64) - { + + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + + } + else if (width == 64) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -125,294 +125,294 @@ void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - - out8BitBuffer += out8Stride; - in16BitBuffer += inStride; - } - - } else - { - EB_U32 inStrideDiff = (2 * inStride) - width; - EB_U32 out8StrideDiff = (2 * out8Stride) - width; - - EB_U32 inStrideDiff64 = inStride - width; - EB_U32 out8StrideDiff64 = out8Stride - width; - - if (!(width & 63)) - { - __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; - __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - - for (x = 0; x < height; x += 1){ - for (y = 0; y < width; y += 64){ - - inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); - inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); - inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); - inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 32)); - inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 40)); - inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); - inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); - out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - out8BitBuffer += 64; - in16BitBuffer += 64; - } - in16BitBuffer += inStrideDiff64; - out8BitBuffer += out8StrideDiff64; - } - } - else if (!(width & 31)) - { - __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; - __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 32) - { - inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); - inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); - inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); - inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride)); - inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride + 8)); - inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); - inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); - out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - out8BitBuffer += 32; - in16BitBuffer += 32; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 15)) - { - __m128i inPixel2, inPixel3; - - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 16) - { - inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); - inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - - - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - out8BitBuffer += 16; - in16BitBuffer += 16; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 7)) - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 8) - { - inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); - inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - out8BitBuffer += 8; - in16BitBuffer += 8; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 4) - { - inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); - inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); - - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); - *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); - - out8BitBuffer += 4; - in16BitBuffer += 4; - } - in16BitBuffer += inStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - - } + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + + out8BitBuffer += out8Stride; + in16BitBuffer += inStride; + } + + } else + { + EB_U32 inStrideDiff = (2 * inStride) - width; + EB_U32 out8StrideDiff = (2 * out8Stride) - width; + + EB_U32 inStrideDiff64 = inStride - width; + EB_U32 out8StrideDiff64 = out8Stride - width; + + if (!(width & 63)) + { + __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; + __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; + + for (x = 0; x < height; x += 1){ + for (y = 0; y < width; y += 64){ + + inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); + inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); + inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); + inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 32)); + inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 40)); + inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); + inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); + + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); + + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + out8BitBuffer += 64; + in16BitBuffer += 64; + } + in16BitBuffer += inStrideDiff64; + out8BitBuffer += out8StrideDiff64; + } + } + else if (!(width & 31)) + { + __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; + __m128i out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; + + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 32) + { + inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); + inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); + inPixel3 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 24)); + inPixel4 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride)); + inPixel5 = _mm_loadu_si128((__m128i*)(in16BitBuffer + inStride + 8)); + inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); + inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); + + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); + + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + out8BitBuffer += 32; + in16BitBuffer += 32; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 15)) + { + __m128i inPixel2, inPixel3; + + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 16) + { + inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); + inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); + inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + + + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + out8BitBuffer += 16; + in16BitBuffer += 16; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 7)) + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 8) + { + inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); + inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + out8BitBuffer += 8; + in16BitBuffer += 8; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 4) + { + inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); + inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); + + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); + *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); + + out8BitBuffer += 4; + in16BitBuffer += 4; + } + in16BitBuffer += inStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + + } return; } void EB_ENC_UnPack8BitData_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, - EB_U32 height) + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, + EB_U32 height) { - EB_U32 x, y; + EB_U32 x, y; __m128i xmm_00FF, inPixel0, inPixel1, inPixel1_shftR_2_U8, inPixel0_shftR_2_U8, inPixel0_shftR_2, inPixel1_shftR_2; // __m128i tempPixel0_U8, tempPixel1_U8; - xmm_00FF = _mm_set1_epi16(0x00FF); + xmm_00FF = _mm_set1_epi16(0x00FF); - if (width == 4) - { - for (y = 0; y < height; y += 2) - { + if (width == 4) + { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); - - //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); - //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); - // - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); - //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); - *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); - *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); - - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 8) - { - for (y = 0; y < height; y += 2) - { + + //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); + //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); + // + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); + //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); + *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); + *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); + + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 8) + { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); - //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); - // - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 16) - { + //tempPixel0 = _mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6); + //tempPixel1 = _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6); + // + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 16) + { __m128i inPixel2, inPixel3; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 32) - { + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 32) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8,*/ out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; y += 2) - { + for (y = 0; y < height; y += 2) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -422,38 +422,38 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_and_si128(inPixel6, xmm_3), _mm_and_si128(inPixel7, xmm_3)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride + 16), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - //outnBitBuffer += 2 * outnStride; - out8BitBuffer += 2 * out8Stride; - in16BitBuffer += 2 * inStride; - } - } - else if (width == 64) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + //outnBitBuffer += 2 * outnStride; + out8BitBuffer += 2 * out8Stride; + in16BitBuffer += 2 * inStride; + } + } + else if (width == 64) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8,*/ out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -463,48 +463,48 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_and_si128(inPixel6, xmm_3), _mm_and_si128(inPixel7, xmm_3)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + 48), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - //outnBitBuffer += outnStride; - out8BitBuffer += out8Stride; - in16BitBuffer += inStride; - } - } - else - { - EB_U32 inStrideDiff = (2 * inStride) - width; - EB_U32 out8StrideDiff = (2 * out8Stride) - width; - //EB_U32 outnStrideDiff = (2 * outnStride) - width; - - EB_U32 inStrideDiff64 = inStride - width; - EB_U32 out8StrideDiff64 = out8Stride - width; - //EB_U32 outnStrideDiff64 = outnStride - width; - - if (!(width & 63)) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + //outnBitBuffer += outnStride; + out8BitBuffer += out8Stride; + in16BitBuffer += inStride; + } + } + else + { + EB_U32 inStrideDiff = (2 * inStride) - width; + EB_U32 out8StrideDiff = (2 * out8Stride) - width; + //EB_U32 outnStrideDiff = (2 * outnStride) - width; + + EB_U32 inStrideDiff64 = inStride - width; + EB_U32 out8StrideDiff64 = out8Stride - width; + //EB_U32 outnStrideDiff64 = outnStride - width; + + if (!(width & 63)) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8, */out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (x = 0; x < height; x += 1){ - for (y = 0; y < width; y += 64){ + for (x = 0; x < height; x += 1){ + for (y = 0; y < width; y += 64){ inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); @@ -515,44 +515,44 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 56)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel6, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel7, xmm_3), 6)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 32), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + 48), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); - - //outnBitBuffer += 64; - out8BitBuffer += 64; - in16BitBuffer += 64; - } - in16BitBuffer += inStrideDiff64; - //outnBitBuffer += outnStrideDiff64; - out8BitBuffer += out8StrideDiff64; - } - } - else if (!(width & 31)) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 32), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 48), out8_3_U8); + + //outnBitBuffer += 64; + out8BitBuffer += 64; + in16BitBuffer += 64; + } + in16BitBuffer += inStrideDiff64; + //outnBitBuffer += outnStrideDiff64; + out8BitBuffer += out8StrideDiff64; + } + } + else if (!(width & 31)) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i /*outn0_U8, outn1_U8, outn2_U8, outn3_U8,*/ out8_0_U8, out8_1_U8, out8_2_U8, out8_3_U8; - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 32) - { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 32) + { inPixel0 = _mm_loadu_si128((__m128i*)in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(in16BitBuffer + 16)); @@ -562,236 +562,236 @@ void EB_ENC_UnPack8BitData_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 24)); - //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); - //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); + //outn0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //outn1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //outn2_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel4, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel5, xmm_3), 6)); //outn3_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel6, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel7, xmm_3), 6)); - out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); + out8_0_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + out8_1_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + out8_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel4, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel5, 2), xmm_00FF)); out8_3_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel6, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel7, 2), xmm_00FF)); - + //_mm_storeu_si128((__m128i*)outnBitBuffer, outn0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + 16), outn1_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), outn2_U8); //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride + 16), outn3_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); - - //outnBitBuffer += 32; - out8BitBuffer += 32; - in16BitBuffer += 32; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 15)) - { + _mm_storeu_si128((__m128i*)out8BitBuffer, out8_0_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + 16), out8_1_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), out8_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride + 16), out8_3_U8); + + //outnBitBuffer += 32; + out8BitBuffer += 32; + in16BitBuffer += 32; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 15)) + { __m128i inPixel2, inPixel3; - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 16) - { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 16) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + 8)); inPixel2 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); inPixel3 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride + 8)); - //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); - //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); + //tempPixel0_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel0, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel1, xmm_3), 6)); + //tempPixel1_U8 = _mm_packus_epi16(_mm_slli_epi16(_mm_and_si128(inPixel2, xmm_3), 6), _mm_slli_epi16(_mm_and_si128(inPixel3, xmm_3), 6)); // - inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); - inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); - - //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - //outnBitBuffer += 16; - out8BitBuffer += 16; - in16BitBuffer += 16; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else if (!(width & 7)) - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 8) - { + inPixel0_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF)); + inPixel1_shftR_2_U8 = _mm_packus_epi16(_mm_and_si128(_mm_srli_epi16(inPixel2, 2), xmm_00FF), _mm_and_si128(_mm_srli_epi16(inPixel3, 2), xmm_00FF)); + + //_mm_storeu_si128((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storeu_si128((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storeu_si128((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storeu_si128((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + //outnBitBuffer += 16; + out8BitBuffer += 16; + in16BitBuffer += 16; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else if (!(width & 7)) + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 8) + { inPixel0 = _mm_loadu_si128((__m128i*) in16BitBuffer); inPixel1 = _mm_loadu_si128((__m128i*) (in16BitBuffer + inStride)); - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); - //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); - _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); - _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); - - //outnBitBuffer += 8; - out8BitBuffer += 8; - in16BitBuffer += 8; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - else - { - for (x = 0; x < height; x += 2) - { - for (y = 0; y < width; y += 4) - { + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //_mm_storel_epi64((__m128i*)outnBitBuffer, tempPixel0_U8); + //_mm_storel_epi64((__m128i*)(outnBitBuffer + outnStride), tempPixel1_U8); + _mm_storel_epi64((__m128i*)out8BitBuffer, inPixel0_shftR_2_U8); + _mm_storel_epi64((__m128i*)(out8BitBuffer + out8Stride), inPixel1_shftR_2_U8); + + //outnBitBuffer += 8; + out8BitBuffer += 8; + in16BitBuffer += 8; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + else + { + for (x = 0; x < height; x += 2) + { + for (y = 0; y < width; y += 4) + { inPixel0 = _mm_loadl_epi64((__m128i*)in16BitBuffer); inPixel1 = _mm_loadl_epi64((__m128i*)(in16BitBuffer + inStride)); - - //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); - //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); - - inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); - inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); - - inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); - inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); - - //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); - //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); - *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); - *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); - - //outnBitBuffer += 4; - out8BitBuffer += 4; - in16BitBuffer += 4; - } - in16BitBuffer += inStrideDiff; - //outnBitBuffer += outnStrideDiff; - out8BitBuffer += out8StrideDiff; - } - } - } + + //tempPixel0_U8 = _mm_packus_epi16(tempPixel0, tempPixel0); + //tempPixel1_U8 = _mm_packus_epi16(tempPixel1, tempPixel1); + + inPixel0_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel0, 2), xmm_00FF); + inPixel1_shftR_2 = _mm_and_si128(_mm_srli_epi16(inPixel1, 2), xmm_00FF); + + inPixel0_shftR_2_U8 = _mm_packus_epi16(inPixel0_shftR_2, inPixel0_shftR_2); + inPixel1_shftR_2_U8 = _mm_packus_epi16(inPixel1_shftR_2, inPixel1_shftR_2); + + //*(EB_U32*)outnBitBuffer = _mm_cvtsi128_si32(tempPixel0_U8); + //*(EB_U32*)(outnBitBuffer + outnStride) = _mm_cvtsi128_si32(tempPixel1_U8); + *(EB_U32*)out8BitBuffer = _mm_cvtsi128_si32(inPixel0_shftR_2_U8); + *(EB_U32*)(out8BitBuffer + out8Stride) = _mm_cvtsi128_si32(inPixel1_shftR_2_U8); + + //outnBitBuffer += 4; + out8BitBuffer += 4; + in16BitBuffer += 4; + } + in16BitBuffer += inStrideDiff; + //outnBitBuffer += outnStrideDiff; + out8BitBuffer += out8StrideDiff; + } + } + } return; } void UnpackAvg_SSE2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height) { - EB_U32 y; - __m128i inPixel0, inPixel1; + EB_U32 y; + __m128i inPixel0, inPixel1; - - if (width == 4) - { + + if (width == 4) + { __m128i out8_0_U8_L0, out8_0_U8_L1; __m128i avg8_0_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)ref16L1); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)dstPtr = _mm_cvtsi128_si32(avg8_0_U8); - //-------- + //-------- //Line Two //-------- //List0 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L0+ refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadl_epi64((__m128i*)(ref16L1+ refL1Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); *(EB_U32*)(dstPtr+dstStride) = _mm_cvtsi128_si32(avg8_0_U8); dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; - - } - - } - else if (width == 8) - { - + ref16L1 += 2*refL1Stride; + + } + + } + else if (width == 8) + { + __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- //List0 - inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); + inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_0_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_0_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + + _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - _mm_storel_epi64((__m128i*) dstPtr , avg8_0_U8); - //-------- //Line Two @@ -801,36 +801,36 @@ void UnpackAvg_SSE2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*)(ref16L0 + refL0Stride) ); - inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); + inPixel1 = _mm_srli_epi16(inPixel0, 2) ; + out8_2_U8_L0 = _mm_packus_epi16( inPixel1 , inPixel1 ); //List1 inPixel0 = _mm_loadu_si128((__m128i*)(ref16L1 + refL1Stride) ); inPixel1 = _mm_srli_epi16(inPixel0, 2) ; - out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); + out8_2_U8_L1 = _mm_packus_epi16( inPixel1 , inPixel1 ); //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - _mm_storel_epi64((__m128i*)(dstPtr +dstStride) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 16) - { + + } + else if (width == 16) + { __m128i inPixel4, inPixel5; __m128i out8_0_U8_L0, out8_0_U8_L1, out8_2_U8_L0,out8_2_U8_L1; __m128i avg8_0_U8,avg8_2_U8; for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- @@ -839,22 +839,22 @@ void UnpackAvg_SSE2_INTRIN( inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); inPixel1 = _mm_loadu_si128((__m128i*) (ref16L0 + 8)); - - out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); + + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); - inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); - + inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - + //AVG - avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); + + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - //-------- //Line Two @@ -863,40 +863,40 @@ void UnpackAvg_SSE2_INTRIN( //List0 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 8)); + + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - //List1 inPixel4 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride)); - inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + inPixel5 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 8)); + + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); - - //AVG - avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); + + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - - } - else if (width == 32) - { + + } + else if (width == 32) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; __m128i avg8_0_U8, avg8_1_U8, avg8_2_U8, avg8_3_U8; - + for (y = 0; y < height; y += 2) - { + { //-------- //Line One //-------- @@ -909,7 +909,7 @@ void UnpackAvg_SSE2_INTRIN( inPixel3 = _mm_loadu_si128((__m128i*) (ref16L0 + 24)); out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //List1 @@ -917,16 +917,16 @@ void UnpackAvg_SSE2_INTRIN( inPixel1 = _mm_loadu_si128((__m128i*)(ref16L1 + 8)); inPixel2 = _mm_loadu_si128((__m128i*)(ref16L1 + 16)); inPixel3 = _mm_loadu_si128((__m128i*)(ref16L1 + 24)); - + out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); //AVG avg8_0_U8 = _mm_avg_epu8 (out8_0_U8_L0 , out8_0_U8_L1); - avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); + avg8_1_U8 = _mm_avg_epu8 (out8_1_U8_L0 , out8_1_U8_L1); - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); //-------- @@ -940,7 +940,7 @@ void UnpackAvg_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L0 + refL0Stride + 24)); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //List1 @@ -950,32 +950,32 @@ void UnpackAvg_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 16)); inPixel7 = _mm_loadu_si128((__m128i*) (ref16L1 + refL1Stride + 24)); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - + //AVG avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); - avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); + avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); + + _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride ) , avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + dstStride + 16 ) , avg8_3_U8); - dstPtr += 2*dstStride; ref16L0 += 2*refL0Stride; - ref16L1 += 2*refL1Stride; + ref16L1 += 2*refL1Stride; } - } - else if (width == 64) - { + } + else if (width == 64) + { __m128i inPixel2, inPixel3, inPixel4, inPixel5, inPixel6, inPixel7; __m128i out8_0_U8_L0, out8_1_U8_L0, out8_2_U8_L0, out8_3_U8_L0; __m128i out8_0_U8_L1, out8_1_U8_L1, out8_2_U8_L1, out8_3_U8_L1; __m128i avg8_0_U8, avg8_1_U8, avg8_2_U8, avg8_3_U8; - for (y = 0; y < height; ++y) - { + for (y = 0; y < height; ++y) + { //List0 inPixel0 = _mm_loadu_si128((__m128i*) ref16L0); @@ -987,14 +987,14 @@ void UnpackAvg_SSE2_INTRIN( inPixel6 = _mm_loadu_si128((__m128i*)(ref16L0 + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(ref16L0 + 56)); - + out8_0_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L0 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); - + //List1 inPixel0 = _mm_loadu_si128((__m128i*) ref16L1); @@ -1005,12 +1005,12 @@ void UnpackAvg_SSE2_INTRIN( inPixel5 = _mm_loadu_si128((__m128i*)(ref16L1 + 40)); inPixel6 = _mm_loadu_si128((__m128i*)(ref16L1 + 48)); inPixel7 = _mm_loadu_si128((__m128i*)(ref16L1 + 56)); - - //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels + + //Note: old Version used to use _mm_and_si128 to mask the MSB bits of the pixels out8_0_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel0, 2) , _mm_srli_epi16(inPixel1, 2) ); - out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); - out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); + out8_1_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel2, 2) , _mm_srli_epi16(inPixel3, 2) ); + out8_2_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel4, 2) , _mm_srli_epi16(inPixel5, 2) ); out8_3_U8_L1 = _mm_packus_epi16( _mm_srli_epi16(inPixel6, 2) , _mm_srli_epi16(inPixel7, 2) ); //AVG @@ -1019,18 +1019,18 @@ void UnpackAvg_SSE2_INTRIN( avg8_2_U8 = _mm_avg_epu8 (out8_2_U8_L0 , out8_2_U8_L1); avg8_3_U8 = _mm_avg_epu8 (out8_3_U8_L0 , out8_3_U8_L1); - _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); - _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + _mm_storeu_si128((__m128i*) dstPtr , avg8_0_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 16), avg8_1_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 32), avg8_2_U8); + _mm_storeu_si128((__m128i*)(dstPtr + 48), avg8_3_U8); + - - dstPtr += dstStride; + dstPtr += dstStride; ref16L0 += refL0Stride; - ref16L1 += refL1Stride; - } - } - + ref16L1 += refL1Stride; + } + } + return; } diff --git a/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h b/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h index a1a3e99db..50baef2d0 100644 --- a/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbPackUnPack_SSE2.h @@ -13,29 +13,29 @@ extern "C" { #endif void EB_ENC_UnPack8BitData_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, - EB_U32 height); + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, + EB_U32 height); void EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN( - EB_U16 *in16BitBuffer, - EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, - EB_U32 width, + EB_U16 *in16BitBuffer, + EB_U32 inStride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, + EB_U32 width, EB_U32 height ); void UnpackAvg_SSE2_INTRIN( - EB_U16 *ref16L0, + EB_U16 *ref16L0, EB_U32 refL0Stride, EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height); diff --git a/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c index cb26131b6..533fce0a7 100644 --- a/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbPictureOperators_Intrinsic_SSE2.c @@ -17,42 +17,42 @@ static __m128i _mm_loadh_epi64(__m128i x, __m128i *p) //------- void FullDistortionKernel4x4_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; __m128i sum = _mm_setzero_si128(); __m128i sum2 = _mm_setzero_si128(); - + rowCount = 2; do { __m128i x0; __m128i y0; __m128i z0; - + x0 = _mm_loadl_epi64((__m128i *)coeff); coeff += coeffStride; x0 = _mm_loadh_epi64(x0, (__m128i *)coeff); coeff += coeffStride; y0 = _mm_loadl_epi64((__m128i *)reconCoeff); reconCoeff += reconCoeffStride; y0 = _mm_loadh_epi64(y0, (__m128i *)reconCoeff); reconCoeff += reconCoeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum2); @@ -64,43 +64,43 @@ void FullDistortionKernel4x4_32bit_BT_SSE2( } void FullDistortionKernel8x8_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; - + __m128i sum = _mm_setzero_si128(); __m128i sum2 = _mm_setzero_si128(); - + rowCount = 8; do { __m128i x0; __m128i y0; __m128i z0; - + x0 = _mm_loadu_si128((__m128i *)(coeff + 0x00)); y0 = _mm_loadu_si128((__m128i *)(reconCoeff + 0x00)); coeff += coeffStride; reconCoeff += reconCoeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum2); @@ -112,61 +112,61 @@ void FullDistortionKernel8x8_32bit_BT_SSE2( } void FullDistortionKernel16MxN_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount, colCount; __m128i sum = _mm_setzero_si128(); __m128i sum2 = _mm_setzero_si128(); - + colCount = areaWidth; do { EB_S16 *coeffTemp = coeff; EB_S16 *reconCoeffTemp = reconCoeff; - + rowCount = areaHeight; do { __m128i x0, x1; __m128i y0, y1; __m128i z0, z1; - + x0 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x00)); x1 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x08)); y0 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x00)); y1 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x08)); coeffTemp += coeffStride; reconCoeffTemp += reconCoeffStride; - + z0 = _mm_madd_epi16(x0, x0); z1 = _mm_madd_epi16(x1, x1); - + sum2 = _mm_add_epi32(sum2, z0); sum2 = _mm_add_epi32(sum2, z1); - + x0 = _mm_sub_epi16(x0, y0); x1 = _mm_sub_epi16(x1, y1); - + x0 = _mm_madd_epi16(x0, x0); x1 = _mm_madd_epi16(x1, x1); - + sum = _mm_add_epi32(sum, x0); sum = _mm_add_epi32(sum, x1); } while (--rowCount); - + coeff += 16; reconCoeff += 16; colCount -= 16; } while (colCount > 0); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum2); @@ -176,37 +176,37 @@ void FullDistortionKernel16MxN_32bit_BT_SSE2( void FullDistortionKernelIntra4x4_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; - + __m128i sum = _mm_setzero_si128(); - + rowCount = 2; do { __m128i x0; __m128i y0; - + x0 = _mm_loadl_epi64((__m128i *)coeff); coeff += coeffStride; x0 = _mm_loadh_epi64(x0, (__m128i *)coeff); coeff += coeffStride; y0 = _mm_loadl_epi64((__m128i *)reconCoeff); reconCoeff += reconCoeffStride; y0 = _mm_loadh_epi64(y0, (__m128i *)reconCoeff); reconCoeff += reconCoeffStride; - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum); sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 @@ -217,37 +217,37 @@ void FullDistortionKernelIntra4x4_32bit_BT_SSE2( } void FullDistortionKernelIntra8x8_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; - + __m128i sum = _mm_setzero_si128(); - + rowCount = 8; do { __m128i x0; __m128i y0; - + x0 = _mm_loadu_si128((__m128i *)(coeff + 0x00)); y0 = _mm_loadu_si128((__m128i *)(reconCoeff + 0x00)); coeff += coeffStride; reconCoeff += reconCoeffStride; - + x0 = _mm_sub_epi16(x0, y0); - + x0 = _mm_madd_epi16(x0, x0); - + sum = _mm_add_epi32(sum, x0); } while (--rowCount); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum); sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 @@ -258,53 +258,53 @@ void FullDistortionKernelIntra8x8_32bit_BT_SSE2( } void FullDistortionKernelIntra16MxN_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount, colCount; __m128i sum = _mm_setzero_si128(); - + colCount = areaWidth; do { EB_S16 *coeffTemp = coeff; EB_S16 *reconCoeffTemp = reconCoeff; - + rowCount = areaHeight; do { __m128i x0, x1; __m128i y0, y1; - + x0 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x00)); x1 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x08)); y0 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x00)); y1 = _mm_loadu_si128((__m128i *)(reconCoeffTemp + 0x08)); coeffTemp += coeffStride; reconCoeffTemp += reconCoeffStride; - + x0 = _mm_sub_epi16(x0, y0); x1 = _mm_sub_epi16(x1, y1); - + x0 = _mm_madd_epi16(x0, x0); x1 = _mm_madd_epi16(x1, x1); - + sum = _mm_add_epi32(sum, x0); sum = _mm_add_epi32(sum, x1); } while (--rowCount); - + coeff += 16; reconCoeff += 16; colCount -= 16; } while (colCount > 0); - + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 sum = _mm_unpacklo_epi32(sum, sum); sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4e)); // 01001110 @@ -314,32 +314,32 @@ void FullDistortionKernelIntra16MxN_32bit_BT_SSE2( void FullDistortionKernelCbfZero4x4_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; __m128i sum2 = _mm_setzero_si128(); - + rowCount = 2; do { __m128i x0; __m128i z0; - + x0 = _mm_loadl_epi64((__m128i *)coeff); coeff += coeffStride; x0 = _mm_loadh_epi64(x0, (__m128i *)coeff); coeff += coeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); } while (--rowCount); - + sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum2 = _mm_unpacklo_epi32(sum2, sum2); sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 @@ -352,32 +352,32 @@ void FullDistortionKernelCbfZero4x4_32bit_BT_SSE2( } void FullDistortionKernelCbfZero8x8_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount; __m128i sum2 = _mm_setzero_si128(); - + rowCount = 8; do { __m128i x0; __m128i z0; - + x0 = _mm_loadu_si128((__m128i *)(coeff + 0x00)); coeff += coeffStride; - + z0 = _mm_madd_epi16(x0, x0); - + sum2 = _mm_add_epi32(sum2, z0); } while (--rowCount); - + sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum2 = _mm_unpacklo_epi32(sum2, sum2); sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 @@ -390,13 +390,13 @@ void FullDistortionKernelCbfZero8x8_32bit_BT_SSE2( } void FullDistortionKernelCbfZero16MxN_32bit_BT_SSE2( - EB_S16 *coeff, - EB_U32 coeffStride, - EB_S16 *reconCoeff, - EB_U32 reconCoeffStride, - EB_U64 distortionResult[2], - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_S16 *coeff, + EB_U32 coeffStride, + EB_S16 *reconCoeff, + EB_U32 reconCoeffStride, + EB_U64 distortionResult[2], + EB_U32 areaWidth, + EB_U32 areaHeight) { EB_S32 rowCount, colCount; __m128i sum2 = _mm_setzero_si128(); @@ -405,70 +405,70 @@ void FullDistortionKernelCbfZero16MxN_32bit_BT_SSE2( do { EB_S16 *coeffTemp = coeff; - + rowCount = areaHeight; do { __m128i x0, x1; __m128i z0, z1; - + x0 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x00)); x1 = _mm_loadu_si128((__m128i *)(coeffTemp + 0x08)); coeffTemp += coeffStride; - + z0 = _mm_madd_epi16(x0, x0); z1 = _mm_madd_epi16(x1, x1); - + sum2 = _mm_add_epi32(sum2, z0); sum2 = _mm_add_epi32(sum2, z1); } while (--rowCount); - + coeff += 16; reconCoeff += 16; colCount -= 16; } while (colCount > 0); - + sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 sum2 = _mm_unpacklo_epi32(sum2, sum2); sum2 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 0x4e)); // 01001110 _mm_storeu_si128((__m128i *)distortionResult, _mm_unpacklo_epi32(sum2, _mm_setzero_si128())); (void)reconCoeffStride; - + } /******************************************************************************* PictureCopyKernel_INTRIN *******************************************************************************/ void PictureCopyKernel4x4_SSE_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) -{ - *(EB_U32 *)dst = *(EB_U32 *)src; - *(EB_U32 *)(dst + dstStride) = *(EB_U32 *)(src + srcStride); - *(EB_U32 *)(dst + (dstStride << 1)) = *(EB_U32 *)(src + (srcStride << 1)); - *(EB_U32 *)(dst + (dstStride * 3)) = *(EB_U32 *)(src + (srcStride * 3)); - - (void)areaWidth; - (void)areaHeight; - - return; + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) +{ + *(EB_U32 *)dst = *(EB_U32 *)src; + *(EB_U32 *)(dst + dstStride) = *(EB_U32 *)(src + srcStride); + *(EB_U32 *)(dst + (dstStride << 1)) = *(EB_U32 *)(src + (srcStride << 1)); + *(EB_U32 *)(dst + (dstStride * 3)) = *(EB_U32 *)(src + (srcStride * 3)); + + (void)areaWidth; + (void)areaHeight; + + return; } void PictureCopyKernel8x8_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) -{ - _mm_storel_epi64((__m128i*)dst, _mm_cvtsi64_si128(*(EB_U64 *)src)); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) +{ + _mm_storel_epi64((__m128i*)dst, _mm_cvtsi64_si128(*(EB_U64 *)src)); _mm_storel_epi64((__m128i*)(dst + srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + srcStride))); _mm_storel_epi64((__m128i*)(dst + (srcStride << 1)), _mm_cvtsi64_si128(*(EB_U64 *)(src + (srcStride << 1)))); _mm_storel_epi64((__m128i*)(dst + 3*srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + 3*srcStride))); @@ -480,35 +480,35 @@ void PictureCopyKernel8x8_SSE2_INTRIN( _mm_storel_epi64((__m128i*)(dst + srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + srcStride))); _mm_storel_epi64((__m128i*)(dst + (srcStride << 1)), _mm_cvtsi64_si128(*(EB_U64 *)(src + (srcStride << 1)))); _mm_storel_epi64((__m128i*)(dst + 3*srcStride), _mm_cvtsi64_si128(*(EB_U64 *)(src + 3*srcStride))); - - (void)areaWidth; - (void)areaHeight; - return; + (void)areaWidth; + (void)areaHeight; + + return; } void PictureCopyKernel16x16_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); @@ -516,270 +516,270 @@ void PictureCopyKernel16x16_SSE2_INTRIN( _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); _mm_storeu_si128((__m128i*)(dst + (dstStride * 3)), _mm_loadu_si128((__m128i*)(src + (srcStride * 3)))); - src += (srcStride << 2); + src += (srcStride << 2); dst += (dstStride << 2); - (void)areaWidth; - (void)areaHeight; + (void)areaWidth; + (void)areaHeight; - return; + return; } void PictureCopyKernel32x32_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - EB_U32 y; - - for (y = 0; y < 4; ++y){ - - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + EB_U32 y; + + for (y = 0; y < 4; ++y){ + + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); src += (srcStride << 2); dst += (dstStride << 2); _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); src += (srcStride << 2); dst += (dstStride << 2); - } - (void)areaWidth; - (void)areaHeight; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void PictureCopyKernel64x64_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - EB_U32 y; - - for (y = 0; y < 8; ++y){ - - _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); - _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); - _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); + EB_U32 y; + + for (y = 0; y < 8; ++y){ + + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); + _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); src += (srcStride << 2); dst += (dstStride << 2); - + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((__m128i*)src)); - _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); - _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); - _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); + _mm_storeu_si128((__m128i*)(dst + 16), _mm_loadu_si128((__m128i*)(src + 16))); + _mm_storeu_si128((__m128i*)(dst + 32), _mm_loadu_si128((__m128i*)(src + 32))); + _mm_storeu_si128((__m128i*)(dst + 48), _mm_loadu_si128((__m128i*)(src + 48))); _mm_storeu_si128((__m128i*)(dst + dstStride), _mm_loadu_si128((__m128i*)(src + srcStride))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 16), _mm_loadu_si128((__m128i*)(src + srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 32), _mm_loadu_si128((__m128i*)(src + srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + dstStride + 48), _mm_loadu_si128((__m128i*)(src + srcStride + 48))); _mm_storeu_si128((__m128i*)(dst + (dstStride << 1)), _mm_loadu_si128((__m128i*)(src + (srcStride << 1)))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); - _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 16), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 16))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 32), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 32))); + _mm_storeu_si128((__m128i*)(dst + (dstStride << 1) + 48), _mm_loadu_si128((__m128i*)(src + (srcStride << 1) + 48))); _mm_storeu_si128((__m128i*)(dst + 3 * dstStride), _mm_loadu_si128((__m128i*)(src + 3 * srcStride))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); - _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 16), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 16))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 32), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 32))); + _mm_storeu_si128((__m128i*)(dst + 3 * dstStride + 48), _mm_loadu_si128((__m128i*)(src + 3 * srcStride + 48))); src += (srcStride << 2); dst += (dstStride << 2); - } - (void)areaWidth; - (void)areaHeight; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } /******************************************************************************* PictureAdditionKernel_INTRIN *******************************************************************************/ void PictureAdditionKernel4x4_SSE_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - EB_U32 y; + EB_U32 y; __m128i xmm0, recon_0_3; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 4; ++y){ + for (y = 0; y < 4; ++y){ - recon_0_3 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)predPtr), xmm0), _mm_loadl_epi64((__m128i *)residualPtr)), xmm0); + recon_0_3 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)predPtr), xmm0), _mm_loadl_epi64((__m128i *)residualPtr)), xmm0); - *(EB_U32 *)reconPtr = _mm_cvtsi128_si32(recon_0_3); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + *(EB_U32 *)reconPtr = _mm_cvtsi128_si32(recon_0_3); + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } void PictureAdditionKernel8x8_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - __m128i recon_0_7, xmm0; - EB_U32 y; + __m128i recon_0_7, xmm0; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 8; ++y){ + for (y = 0; y < 8; ++y){ - recon_0_7 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)predPtr), xmm0), _mm_loadu_si128((__m128i *)residualPtr)), xmm0); + recon_0_7 = _mm_packus_epi16(_mm_add_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)predPtr), xmm0), _mm_loadu_si128((__m128i *)residualPtr)), xmm0); - *(EB_U64 *)reconPtr = _mm_cvtsi128_si64(recon_0_7); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + *(EB_U64 *)reconPtr = _mm_cvtsi128_si64(recon_0_7); + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } void PictureAdditionKernel16x16_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - __m128i xmm0, xmm_clip_U8, pred_0_15, recon_0_7, recon_8_15; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); + __m128i xmm0, xmm_clip_U8, pred_0_15, recon_0_7, recon_8_15; + EB_U32 y; + + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 16; ++y){ + for (y = 0; y < 16; ++y){ - pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); - recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); - recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); - xmm_clip_U8 = _mm_packus_epi16(recon_0_7, recon_8_15); - - _mm_storeu_si128((__m128i*)reconPtr, xmm_clip_U8); + pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); + recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); + recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); + xmm_clip_U8 = _mm_packus_epi16(recon_0_7, recon_8_15); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + _mm_storeu_si128((__m128i*)reconPtr, xmm_clip_U8); - return; + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; + + return; } void PictureAdditionKernel32x32_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - EB_U32 y; + EB_U32 y; __m128i xmm0, pred_0_15, pred_16_31, recon_0_15_clipped, recon_0_7, recon_8_15, recon_16_23, recon_24_31, recon_16_31_clipped; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 32; ++y){ - pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); + for (y = 0; y < 32; ++y){ + pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); pred_16_31 = _mm_loadu_si128((__m128i *)(predPtr + 16)); - recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); - recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); - recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); - recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); - + recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); + recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); + recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); + recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); + recon_0_15_clipped = _mm_packus_epi16(recon_0_7, recon_8_15); - recon_16_31_clipped = _mm_packus_epi16(recon_16_23, recon_24_31); + recon_16_31_clipped = _mm_packus_epi16(recon_16_23, recon_24_31); _mm_storeu_si128((__m128i*)reconPtr, recon_0_15_clipped); - _mm_storeu_si128((__m128i*)(reconPtr + 16), recon_16_31_clipped); + _mm_storeu_si128((__m128i*)(reconPtr + 16), recon_16_31_clipped); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } void PictureAdditionKernel64x64_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { - EB_U32 y; + EB_U32 y; __m128i xmm0, pred_0_15, pred_16_31, pred_32_47, pred_48_63; __m128i recon_0_15_clipped, recon_16_31_clipped, recon_32_47_clipped, recon_48_63_clipped; @@ -787,40 +787,40 @@ void PictureAdditionKernel64x64_SSE2_INTRIN( xmm0 = _mm_setzero_si128(); - for (y = 0; y < 64; ++y){ + for (y = 0; y < 64; ++y){ - pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); + pred_0_15 = _mm_loadu_si128((__m128i *)predPtr); pred_16_31 = _mm_loadu_si128((__m128i *)(predPtr + 16)); pred_32_47 = _mm_loadu_si128((__m128i *)(predPtr + 32)); pred_48_63 = _mm_loadu_si128((__m128i *)(predPtr + 48)); - recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); - recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); - recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); - recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); - recon_32_39 = _mm_add_epi16(_mm_unpacklo_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 32))); - recon_40_47 = _mm_add_epi16(_mm_unpackhi_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 40))); - recon_48_55 = _mm_add_epi16(_mm_unpacklo_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 48))); - recon_56_63 = _mm_add_epi16(_mm_unpackhi_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 56))); + recon_0_7 = _mm_add_epi16(_mm_unpacklo_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)residualPtr)); + recon_8_15 = _mm_add_epi16(_mm_unpackhi_epi8(pred_0_15, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 8))); + recon_16_23 = _mm_add_epi16(_mm_unpacklo_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 16))); + recon_24_31 = _mm_add_epi16(_mm_unpackhi_epi8(pred_16_31, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 24))); + recon_32_39 = _mm_add_epi16(_mm_unpacklo_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 32))); + recon_40_47 = _mm_add_epi16(_mm_unpackhi_epi8(pred_32_47, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 40))); + recon_48_55 = _mm_add_epi16(_mm_unpacklo_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 48))); + recon_56_63 = _mm_add_epi16(_mm_unpackhi_epi8(pred_48_63, xmm0), _mm_loadu_si128((__m128i *)(residualPtr + 56))); recon_0_15_clipped = _mm_packus_epi16(recon_0_7, recon_8_15); recon_16_31_clipped = _mm_packus_epi16(recon_16_23, recon_24_31); recon_32_47_clipped = _mm_packus_epi16(recon_32_39, recon_40_47); - recon_48_63_clipped = _mm_packus_epi16(recon_48_55, recon_56_63); + recon_48_63_clipped = _mm_packus_epi16(recon_48_55, recon_56_63); _mm_storeu_si128((__m128i*)reconPtr, recon_0_15_clipped); _mm_storeu_si128((__m128i*)(reconPtr + 16), recon_16_31_clipped); _mm_storeu_si128((__m128i*)(reconPtr + 32), recon_32_47_clipped); - _mm_storeu_si128((__m128i*)(reconPtr + 48), recon_48_63_clipped); + _mm_storeu_si128((__m128i*)(reconPtr + 48), recon_48_63_clipped); - predPtr += predStride; - residualPtr += residualStride; - reconPtr += reconStride; - } - (void)width; - (void)height; + predPtr += predStride; + residualPtr += residualStride; + reconPtr += reconStride; + } + (void)width; + (void)height; - return; + return; } /****************************************************************************************************** @@ -828,648 +828,648 @@ ResidualKernel ***********************************************************************************************************/ void ResidualKernel4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i residual_0_3, xmm0 = _mm_setzero_si128(); - EB_U32 y; + __m128i residual_0_3, xmm0 = _mm_setzero_si128(); + EB_U32 y; - for (y = 0; y < 4; ++y){ + for (y = 0; y < 4; ++y){ - residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), + residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)pred), xmm0)); - *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); + *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void ResidualKernel8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm0, residual_0_7; - EB_U32 y; + __m128i xmm0, residual_0_7; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 8; ++y){ + for (y = 0; y < 8; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void ResidualKernel16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { __m128i xmm0, residual_0_7, residual_8_15; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); + EB_U32 y; - for (y = 0; y < 16; ++y){ + xmm0 = _mm_setzero_si128(); + + for (y = 0; y < 16; ++y){ - residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; - return; + return; } void ResidualKernel32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; - EB_U32 y; + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); - for (y = 0; y < 32; ++y){ + for (y = 0; y < 32; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; - - return; + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; + + return; } void ResidualKernel64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); - - for (y = 0; y < 64; ++y){ - - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; + EB_U32 y; + + xmm0 = _mm_setzero_si128(); + + for (y = 0; y < 64; ++y){ + + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; - (void)areaHeight; - - return; + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; + (void)areaHeight; + + return; } void ResidualKernelSubSampled4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine) { - __m128i residual_0_3, xmm0 = _mm_setzero_si128(); - EB_U32 y; + __m128i residual_0_3, xmm0 = _mm_setzero_si128(); + EB_U32 y; //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), + residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)pred), xmm0)); - *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); + *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); residual += residualStride; *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_3 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)input), xmm0), _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(EB_U32 *)pred), xmm0)); - *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); + *(EB_U64 *)residual = _mm_cvtsi128_si64(residual_0_3); } - return; + return; } void ResidualKernelSubSampled8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine - + ) { - __m128i xmm0, residual_0_7; - EB_U32 y; + __m128i xmm0, residual_0_7; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)residual, residual_0_7); residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)residual, residual_0_7); } - return; + return; } void ResidualKernelSubSampled16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine - + ) { __m128i xmm0, residual_0_7, residual_8_15; - EB_U32 y; - - xmm0 = _mm_setzero_si128(); + EB_U32 y; + + xmm0 = _mm_setzero_si128(); //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)residual, residual_0_7); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); } - return; + return; } void ResidualKernelSubSampled32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; - EB_U32 y; + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31; + EB_U32 y; + + xmm0 = _mm_setzero_si128(); - xmm0 = _mm_setzero_si128(); - //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ + for (y = 0; y < areaHeight; ++y){ - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16( _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); } - return; + return; } void ResidualKernelSubSampled64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine) { - __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; - EB_U32 y; + __m128i xmm0, residual_0_7, residual_8_15, residual_16_23, residual_24_31, resdiaul_32_39, residual_40_47, residual_48_55, residual_56_63; + EB_U32 y; - xmm0 = _mm_setzero_si128(); + xmm0 = _mm_setzero_si128(); //hard code subampling dimensions, keep residualStride areaHeight>>=1; inputStride<<=1; predStride<<=1; - for (y = 0; y < areaHeight; ++y){ - - residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - + for (y = 0; y < areaHeight; ++y){ + + residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); //duplicate top field residual to bottom field residual += residualStride; _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); - - input += inputStride; - pred += predStride; - residual += residualStride; - } - (void)areaWidth; + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + + input += inputStride; + pred += predStride; + residual += residualStride; + } + (void)areaWidth; //compute the last line if(lastLine){ input -= (inputStride)>>1; - pred -= (predStride )>>1; - residual -= residualStride; + pred -= (predStride )>>1; + residual -= residualStride; residual_0_7 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); - residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); - resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); - residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); - + residual_8_15 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)input), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)pred), xmm0)); + residual_16_23 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + residual_24_31 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 16)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 16)), xmm0)); + resdiaul_32_39 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_40_47 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 32)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 32)), xmm0)); + residual_48_55 = _mm_sub_epi16(_mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpacklo_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + residual_56_63 = _mm_sub_epi16(_mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(input + 48)), xmm0), _mm_unpackhi_epi8(_mm_loadu_si128((__m128i *)(pred + 48)), xmm0)); + _mm_storeu_si128((__m128i*)residual, residual_0_7); - _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); - _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); - _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); + _mm_storeu_si128((__m128i*)(residual + 8), residual_8_15); + _mm_storeu_si128((__m128i*)(residual + 16), residual_16_23); + _mm_storeu_si128((__m128i*)(residual + 24), residual_24_31); _mm_storeu_si128((__m128i*)(residual + 32), resdiaul_32_39); - _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); - _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); - _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); + _mm_storeu_si128((__m128i*)(residual + 40), residual_40_47); + _mm_storeu_si128((__m128i*)(residual + 48), residual_48_55); + _mm_storeu_si128((__m128i*)(residual + 56), residual_56_63); } - return; + return; } /****************************************************************************************************** ResidualKernel16bit_SSE2_INTRIN ******************************************************************************************************/ void ResidualKernel16bit_SSE2_INTRIN( - EB_U16 *input, - EB_U32 inputStride, - EB_U16 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight) + EB_U16 *input, + EB_U32 inputStride, + EB_U16 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight) { - EB_U32 x, y; + EB_U32 x, y; __m128i residual0, residual1; - - if (areaWidth == 4) - { - for (y = 0; y < areaHeight; y += 2){ - - residual0 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)input), _mm_loadl_epi64((__m128i*)pred)); - residual1 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)(input + inputStride)), _mm_loadl_epi64((__m128i*)(pred + predStride))); - - _mm_storel_epi64((__m128i*)residual, residual0); - _mm_storel_epi64((__m128i*)(residual + residualStride), residual1); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if (areaWidth == 8){ - for (y = 0; y < areaHeight; y += 2){ - - residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); - residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride))); - - _mm_storeu_si128((__m128i*) residual, residual0); - _mm_storeu_si128((__m128i*) (residual + residualStride), residual1); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if(areaWidth == 16){ + + if (areaWidth == 4) + { + for (y = 0; y < areaHeight; y += 2){ + + residual0 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)input), _mm_loadl_epi64((__m128i*)pred)); + residual1 = _mm_sub_epi16(_mm_loadl_epi64((__m128i*)(input + inputStride)), _mm_loadl_epi64((__m128i*)(pred + predStride))); + + _mm_storel_epi64((__m128i*)residual, residual0); + _mm_storel_epi64((__m128i*)(residual + residualStride), residual1); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if (areaWidth == 8){ + for (y = 0; y < areaHeight; y += 2){ + + residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); + residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride))); + + _mm_storeu_si128((__m128i*) residual, residual0); + _mm_storeu_si128((__m128i*) (residual + residualStride), residual1); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if(areaWidth == 16){ __m128i residual2, residual3; - for (y = 0; y < areaHeight; y += 2){ - - residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); - residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8))); - residual2 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride))); - residual3 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride+8)), _mm_loadu_si128((__m128i*)(pred + predStride+8))); - - _mm_storeu_si128((__m128i*)residual, residual0); - _mm_storeu_si128((__m128i*)(residual + 8), residual1); - _mm_storeu_si128((__m128i*)(residual+residualStride), residual2); - _mm_storeu_si128((__m128i*)(residual +residualStride+ 8), residual3); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if(areaWidth == 32){ - - for (y = 0; y < areaHeight; y += 2){ + for (y = 0; y < areaHeight; y += 2){ + + residual0 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred)); + residual1 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8))); + residual2 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride))); + residual3 = _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride+8)), _mm_loadu_si128((__m128i*)(pred + predStride+8))); + + _mm_storeu_si128((__m128i*)residual, residual0); + _mm_storeu_si128((__m128i*)(residual + 8), residual1); + _mm_storeu_si128((__m128i*)(residual+residualStride), residual2); + _mm_storeu_si128((__m128i*)(residual +residualStride+ 8), residual3); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if(areaWidth == 32){ + + for (y = 0; y < areaHeight; y += 2){ //residual[columnIndex] = ((EB_S16)input[columnIndex]) - ((EB_S16)pred[columnIndex]); - _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); - _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); - _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); - - _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred+predStride + 8)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride+ 16)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride+ 24)))); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else if(areaWidth == 64){ // Branch was not tested because the encoder had max tuSize of 32 - - for (y = 0; y < areaHeight; y += 2){ - - //residual[columnIndex] = ((EB_S16)input[columnIndex]) - ((EB_S16)pred[columnIndex]) 8 indices per _mm_sub_epi16 - _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); - _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); - _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); - _mm_storeu_si128((__m128i*) (residual + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 32)), _mm_loadu_si128((__m128i*)(pred + 32)))); - _mm_storeu_si128((__m128i*) (residual + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 40)), _mm_loadu_si128((__m128i*)(pred + 40)))); - _mm_storeu_si128((__m128i*) (residual + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 48)), _mm_loadu_si128((__m128i*)(pred + 48)))); - _mm_storeu_si128((__m128i*) (residual + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 56)), _mm_loadu_si128((__m128i*)(pred + 56)))); - - _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred + predStride + 8)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride + 16)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride + 24)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 32)), _mm_loadu_si128((__m128i*)(pred + predStride + 32)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 40)), _mm_loadu_si128((__m128i*)(pred + predStride + 40)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 48)), _mm_loadu_si128((__m128i*)(pred + predStride + 48)))); - _mm_storeu_si128((__m128i*) (residual + residualStride + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 56)), _mm_loadu_si128((__m128i*)(pred + predStride + 56)))); - - input += inputStride << 1; - pred += predStride << 1; - residual += residualStride << 1; - } - } - else { - - EB_U32 inputStrideDiff = 2 * inputStride; - EB_U32 predStrideDiff = 2 * predStride; - EB_U32 residualStrideDiff = 2 * residualStride; - inputStrideDiff -= areaWidth; - predStrideDiff -= areaWidth; - residualStrideDiff -= areaWidth; - - if (!(areaWidth & 7)){ - - for (x = 0; x < areaHeight; x += 2){ - for (y = 0; y < areaWidth; y += 8){ - - _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); - - input += 8; - pred += 8; - residual += 8; - } - input = input + inputStrideDiff; - pred = pred + predStrideDiff; - residual = residual + residualStrideDiff; - } - } - else{ - for (x = 0; x < areaHeight; x += 2){ - for (y = 0; y < areaWidth; y += 4){ - - _mm_storel_epi64((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); - _mm_storel_epi64((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); - - input += 4; - pred += 4; - residual += 4; - } - input = input + inputStrideDiff; - pred = pred + predStrideDiff; - residual = residual + residualStrideDiff; - } - } - } - return; + _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); + _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); + _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); + + _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input+inputStride)), _mm_loadu_si128((__m128i*)(pred+predStride)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred+predStride + 8)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride+ 16)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride+ 24)))); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else if(areaWidth == 64){ // Branch was not tested because the encoder had max tuSize of 32 + + for (y = 0; y < areaHeight; y += 2){ + + //residual[columnIndex] = ((EB_S16)input[columnIndex]) - ((EB_S16)pred[columnIndex]) 8 indices per _mm_sub_epi16 + _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storeu_si128((__m128i*) (residual + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 8)), _mm_loadu_si128((__m128i*)(pred + 8)))); + _mm_storeu_si128((__m128i*) (residual + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 16)), _mm_loadu_si128((__m128i*)(pred + 16)))); + _mm_storeu_si128((__m128i*) (residual + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 24)), _mm_loadu_si128((__m128i*)(pred + 24)))); + _mm_storeu_si128((__m128i*) (residual + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 32)), _mm_loadu_si128((__m128i*)(pred + 32)))); + _mm_storeu_si128((__m128i*) (residual + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 40)), _mm_loadu_si128((__m128i*)(pred + 40)))); + _mm_storeu_si128((__m128i*) (residual + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 48)), _mm_loadu_si128((__m128i*)(pred + 48)))); + _mm_storeu_si128((__m128i*) (residual + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + 56)), _mm_loadu_si128((__m128i*)(pred + 56)))); + + _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 8), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 8)), _mm_loadu_si128((__m128i*)(pred + predStride + 8)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 16), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 16)), _mm_loadu_si128((__m128i*)(pred + predStride + 16)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 24), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 24)), _mm_loadu_si128((__m128i*)(pred + predStride + 24)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 32), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 32)), _mm_loadu_si128((__m128i*)(pred + predStride + 32)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 40), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 40)), _mm_loadu_si128((__m128i*)(pred + predStride + 40)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 48), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 48)), _mm_loadu_si128((__m128i*)(pred + predStride + 48)))); + _mm_storeu_si128((__m128i*) (residual + residualStride + 56), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride + 56)), _mm_loadu_si128((__m128i*)(pred + predStride + 56)))); + + input += inputStride << 1; + pred += predStride << 1; + residual += residualStride << 1; + } + } + else { + + EB_U32 inputStrideDiff = 2 * inputStride; + EB_U32 predStrideDiff = 2 * predStride; + EB_U32 residualStrideDiff = 2 * residualStride; + inputStrideDiff -= areaWidth; + predStrideDiff -= areaWidth; + residualStrideDiff -= areaWidth; + + if (!(areaWidth & 7)){ + + for (x = 0; x < areaHeight; x += 2){ + for (y = 0; y < areaWidth; y += 8){ + + _mm_storeu_si128((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storeu_si128((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); + + input += 8; + pred += 8; + residual += 8; + } + input = input + inputStrideDiff; + pred = pred + predStrideDiff; + residual = residual + residualStrideDiff; + } + } + else{ + for (x = 0; x < areaHeight; x += 2){ + for (y = 0; y < areaWidth; y += 4){ + + _mm_storel_epi64((__m128i*) residual, _mm_sub_epi16(_mm_loadu_si128((__m128i*)input), _mm_loadu_si128((__m128i*)pred))); + _mm_storel_epi64((__m128i*) (residual + residualStride), _mm_sub_epi16(_mm_loadu_si128((__m128i*)(input + inputStride)), _mm_loadu_si128((__m128i*)(pred + predStride)))); + + input += 4; + pred += 4; + residual += 4; + } + input = input + inputStrideDiff; + pred = pred + predStrideDiff; + residual = residual + residualStrideDiff; + } + } + } + return; } /****************************************************************************************************** @@ -1478,226 +1478,226 @@ void ResidualKernel16bit_SSE2_INTRIN( void PictureAdditionKernel16bit_SSE2_INTRIN( - EB_U16 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U16 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height) + EB_U16 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U16 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height) { __m128i xmm_0, xmm_Max10bit; - - EB_U32 y, x; - xmm_0 = _mm_setzero_si128(); - xmm_Max10bit = _mm_set1_epi16(1023); + EB_U32 y, x; + + xmm_0 = _mm_setzero_si128(); + xmm_Max10bit = _mm_set1_epi16(1023); - if (width == 4) - { + if (width == 4) + { __m128i xmm_sum_0_3, xmm_sum_s0_s3, xmm_clip3_0_3, xmm_clip3_s0_s3; - for (y = 0; y < height; y += 2){ + for (y = 0; y < height; y += 2){ - xmm_sum_0_3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)predPtr), _mm_loadl_epi64((__m128i*)residualPtr)); - xmm_sum_s0_s3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)(predPtr + predStride)), _mm_loadl_epi64((__m128i*)(residualPtr + residualStride))); + xmm_sum_0_3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)predPtr), _mm_loadl_epi64((__m128i*)residualPtr)); + xmm_sum_s0_s3 = _mm_adds_epi16(_mm_loadl_epi64((__m128i*)(predPtr + predStride)), _mm_loadl_epi64((__m128i*)(residualPtr + residualStride))); - xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_3, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s3, xmm_Max10bit), xmm_0); + xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_3, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s3, xmm_Max10bit), xmm_0); - _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); - _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); + _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); + _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 8){ + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 8){ __m128i xmm_sum_0_7, xmm_sum_s0_s7, xmm_clip3_0_7, xmm_clip3_s0_s7; - for (y = 0; y < height; y += 2){ - - xmm_sum_0_7 = _mm_adds_epi16( _mm_loadu_si128((__m128i*)predPtr),_mm_loadu_si128((__m128i*)residualPtr)); - xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - - xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); - - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 16){ - + for (y = 0; y < height; y += 2){ + + xmm_sum_0_7 = _mm_adds_epi16( _mm_loadu_si128((__m128i*)predPtr),_mm_loadu_si128((__m128i*)residualPtr)); + xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + + xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); + + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 16){ + __m128i sum_0_7, sum_8_15, sum_s0_s7, sum_s8_s15, clip3_0_7, clip3_8_15, clip3_s0_s7, clip3_s8_s15; - for (y = 0; y < height; y += 2){ - - sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); - sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); - - clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); - clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15, xmm_Max10bit), xmm_0); - clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); - clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); - - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 32){ + for (y = 0; y < height; y += 2){ + + sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); + sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); + + clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); + clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15, xmm_Max10bit), xmm_0); + clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); + clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); + + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 32){ __m128i sum_0_7, sum_8_15, sum_16_23, sum_24_31, sum_s0_s7, sum_s8_s15, sum_s16_s23, sum_s24_s31; __m128i clip3_0_7, clip3_8_15, clip3_16_23, clip3_24_31, clip3_s0_s7, clip3_s8_s15, clip3_s16_s23, clip3_s24_s31; - for (y = 0; y < height; y += 2){ - - sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); - sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); - sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); - - sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); - sum_s16_s23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 16)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 16))); - sum_s24_s31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 24)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 24))); - - clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); - clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); - clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); - clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); - - clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); - clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); - clip3_s16_s23 = _mm_max_epi16(_mm_min_epi16(sum_s16_s23, xmm_Max10bit), xmm_0); - clip3_s24_s31 = _mm_max_epi16(_mm_min_epi16(sum_s24_s31, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); - _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); - _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); - - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 16), clip3_s16_s23); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 24), clip3_s24_s31); - - predPtr += predStride << 1; - residualPtr += residualStride << 1; - reconPtr += reconStride << 1; - } - } - else if (width == 64){ // Branch not tested due to Max TU size is 32 at time of development + for (y = 0; y < height; y += 2){ + + sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); + sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); + sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); + + sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + sum_s8_s15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 8)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 8))); + sum_s16_s23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 16)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 16))); + sum_s24_s31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride + 24)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride + 24))); + + clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7, xmm_Max10bit), xmm_0); + clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); + clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); + clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); + + clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(sum_s0_s7, xmm_Max10bit), xmm_0); + clip3_s8_s15 = _mm_max_epi16(_mm_min_epi16(sum_s8_s15, xmm_Max10bit), xmm_0); + clip3_s16_s23 = _mm_max_epi16(_mm_min_epi16(sum_s16_s23, xmm_Max10bit), xmm_0); + clip3_s24_s31 = _mm_max_epi16(_mm_min_epi16(sum_s24_s31, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15); + _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); + _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); + + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), clip3_s0_s7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 8), clip3_s8_s15); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 16), clip3_s16_s23); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride + 24), clip3_s24_s31); + + predPtr += predStride << 1; + residualPtr += residualStride << 1; + reconPtr += reconStride << 1; + } + } + else if (width == 64){ // Branch not tested due to Max TU size is 32 at time of development __m128i sum_0_7, sum_8_15, sum_16_23, sum_24_31, sum_32_39, sum_40_47, sum_48_55, sum_56_63; __m128i clip3_0_7, clip3_8_15, clip3_16_23, clip3_24_31, clip3_32_39, clip3_40_47, clip3_48_55, clip3_56_63; - for (y = 0; y < height; ++y ){ - - sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); - sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); - sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); - sum_32_39 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 32)), _mm_loadu_si128((__m128i*)(residualPtr + 32))); - sum_40_47 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 40)), _mm_loadu_si128((__m128i*)(residualPtr + 40))); - sum_48_55 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 48)), _mm_loadu_si128((__m128i*)(residualPtr + 48))); - sum_56_63 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 56)), _mm_loadu_si128((__m128i*)(residualPtr + 56))); - - clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7 , xmm_Max10bit), xmm_0); - clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); - clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); - clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); - clip3_32_39 = _mm_max_epi16(_mm_min_epi16(sum_32_39, xmm_Max10bit), xmm_0); - clip3_40_47 = _mm_max_epi16(_mm_min_epi16(sum_40_47, xmm_Max10bit), xmm_0); - clip3_48_55 = _mm_max_epi16(_mm_min_epi16(sum_48_55, xmm_Max10bit), xmm_0); - clip3_56_63 = _mm_max_epi16(_mm_min_epi16(sum_56_63, xmm_Max10bit), xmm_0); - - _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7 ); - _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15 ); - _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); - _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); - _mm_storeu_si128((__m128i*) (reconPtr + 32), clip3_32_39); - _mm_storeu_si128((__m128i*) (reconPtr + 40), clip3_40_47); - _mm_storeu_si128((__m128i*) (reconPtr + 48), clip3_48_55); - _mm_storeu_si128((__m128i*) (reconPtr + 56), clip3_56_63); - - predPtr += predStride ; - residualPtr += residualStride ; - reconPtr += reconStride ; - } - } - else - { - EB_U32 predStrideDiff = 2 * predStride; - EB_U32 residualStrideDiff = 2 * residualStride; - EB_U32 reconStrideDiff = 2 * reconStride; - predStrideDiff -= width; - residualStrideDiff -= width; - reconStrideDiff -= width; - - if (!(width & 7)){ + for (y = 0; y < height; ++y ){ + + sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + sum_8_15 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 8)), _mm_loadu_si128((__m128i*)(residualPtr + 8))); + sum_16_23 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 16)), _mm_loadu_si128((__m128i*)(residualPtr + 16))); + sum_24_31 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 24)), _mm_loadu_si128((__m128i*)(residualPtr + 24))); + sum_32_39 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 32)), _mm_loadu_si128((__m128i*)(residualPtr + 32))); + sum_40_47 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 40)), _mm_loadu_si128((__m128i*)(residualPtr + 40))); + sum_48_55 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 48)), _mm_loadu_si128((__m128i*)(residualPtr + 48))); + sum_56_63 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + 56)), _mm_loadu_si128((__m128i*)(residualPtr + 56))); + + clip3_0_7 = _mm_max_epi16(_mm_min_epi16(sum_0_7 , xmm_Max10bit), xmm_0); + clip3_8_15 = _mm_max_epi16(_mm_min_epi16(sum_8_15 , xmm_Max10bit), xmm_0); + clip3_16_23 = _mm_max_epi16(_mm_min_epi16(sum_16_23, xmm_Max10bit), xmm_0); + clip3_24_31 = _mm_max_epi16(_mm_min_epi16(sum_24_31, xmm_Max10bit), xmm_0); + clip3_32_39 = _mm_max_epi16(_mm_min_epi16(sum_32_39, xmm_Max10bit), xmm_0); + clip3_40_47 = _mm_max_epi16(_mm_min_epi16(sum_40_47, xmm_Max10bit), xmm_0); + clip3_48_55 = _mm_max_epi16(_mm_min_epi16(sum_48_55, xmm_Max10bit), xmm_0); + clip3_56_63 = _mm_max_epi16(_mm_min_epi16(sum_56_63, xmm_Max10bit), xmm_0); + + _mm_storeu_si128((__m128i*) reconPtr, clip3_0_7 ); + _mm_storeu_si128((__m128i*) (reconPtr + 8), clip3_8_15 ); + _mm_storeu_si128((__m128i*) (reconPtr + 16), clip3_16_23); + _mm_storeu_si128((__m128i*) (reconPtr + 24), clip3_24_31); + _mm_storeu_si128((__m128i*) (reconPtr + 32), clip3_32_39); + _mm_storeu_si128((__m128i*) (reconPtr + 40), clip3_40_47); + _mm_storeu_si128((__m128i*) (reconPtr + 48), clip3_48_55); + _mm_storeu_si128((__m128i*) (reconPtr + 56), clip3_56_63); + + predPtr += predStride ; + residualPtr += residualStride ; + reconPtr += reconStride ; + } + } + else + { + EB_U32 predStrideDiff = 2 * predStride; + EB_U32 residualStrideDiff = 2 * residualStride; + EB_U32 reconStrideDiff = 2 * reconStride; + predStrideDiff -= width; + residualStrideDiff -= width; + reconStrideDiff -= width; + + if (!(width & 7)){ __m128i xmm_sum_0_7, xmm_sum_s0_s7, xmm_clip3_0_7, xmm_clip3_s0_s7; - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 8){ + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 8){ - xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride ))); + xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride ))); - xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); + xmm_clip3_0_7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s7 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); - _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); - _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); + _mm_storeu_si128((__m128i*) reconPtr, xmm_clip3_0_7); + _mm_storeu_si128((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s7); - predPtr += 8; - residualPtr += 8; - reconPtr += 8; - } - predPtr += predStrideDiff; - residualPtr += residualStrideDiff; - reconPtr += reconStrideDiff; - } - } - else{ + predPtr += 8; + residualPtr += 8; + reconPtr += 8; + } + predPtr += predStrideDiff; + residualPtr += residualStrideDiff; + reconPtr += reconStrideDiff; + } + } + else{ __m128i xmm_sum_0_7, xmm_sum_s0_s7, xmm_clip3_0_3, xmm_clip3_s0_s3; - for (x = 0; x < height; x += 2){ - for (y = 0; y < width; y += 4){ - - xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); - xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); - - xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); - xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); - - _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); - _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); - - predPtr += 4; - residualPtr += 4; - reconPtr += 4; - } - predPtr += predStrideDiff; - residualPtr += residualStrideDiff; - reconPtr += reconStrideDiff; - } - } - } - return; + for (x = 0; x < height; x += 2){ + for (y = 0; y < width; y += 4){ + + xmm_sum_0_7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)predPtr), _mm_loadu_si128((__m128i*)residualPtr)); + xmm_sum_s0_s7 = _mm_adds_epi16(_mm_loadu_si128((__m128i*)(predPtr + predStride)), _mm_loadu_si128((__m128i*)(residualPtr + residualStride))); + + xmm_clip3_0_3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_0_7, xmm_Max10bit), xmm_0); + xmm_clip3_s0_s3 = _mm_max_epi16(_mm_min_epi16(xmm_sum_s0_s7, xmm_Max10bit), xmm_0); + + _mm_storel_epi64((__m128i*) reconPtr, xmm_clip3_0_3); + _mm_storel_epi64((__m128i*) (reconPtr + reconStride), xmm_clip3_s0_s3); + + predPtr += 4; + residualPtr += 4; + reconPtr += 4; + } + predPtr += predStrideDiff; + residualPtr += residualStrideDiff; + reconPtr += reconStrideDiff; + } + } + } + return; } diff --git a/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h b/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h index cf81d0541..027b84a42 100644 --- a/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbPictureOperators_SSE2.h @@ -121,220 +121,220 @@ extern void ZeroOutCoeff32x32_SSE2( EB_U32 areaHeight); extern void ResidualKernel16bit_SSE2_INTRIN( - EB_U16 *input, - EB_U32 inputStride, - EB_U16 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U16 *input, + EB_U32 inputStride, + EB_U16 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel4x4_SSE_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel8x8_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel16x16_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel32x32_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureCopyKernel64x64_SSE2_INTRIN( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureAdditionKernel4x4_SSE_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel8x8_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel16x16_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel32x32_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void PictureAdditionKernel64x64_SSE2_INTRIN( - EB_U8 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U8 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U8 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U8 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); void ResidualKernel4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernel8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernel16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernelSubSampled4x4_SSE_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine ); void ResidualKernelSubSampled8x8_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernelSubSampled16x16_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernelSubSampled32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernelSubSampled64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight, + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight, EB_U8 lastLine); void ResidualKernel32x32_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void ResidualKernel64x64_SSE2_INTRIN( - EB_U8 *input, - EB_U32 inputStride, - EB_U8 *pred, - EB_U32 predStride, - EB_S16 *residual, - EB_U32 residualStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_U8 *input, + EB_U32 inputStride, + EB_U8 *pred, + EB_U32 predStride, + EB_S16 *residual, + EB_U32 residualStride, + EB_U32 areaWidth, + EB_U32 areaHeight); void PictureAdditionKernel16bit_SSE2_INTRIN( - EB_U16 *predPtr, - EB_U32 predStride, - EB_S16 *residualPtr, - EB_U32 residualStride, - EB_U16 *reconPtr, - EB_U32 reconStride, - EB_U32 width, - EB_U32 height); + EB_U16 *predPtr, + EB_U32 predStride, + EB_S16 *residualPtr, + EB_U32 residualStride, + EB_U16 *reconPtr, + EB_U32 reconStride, + EB_U32 width, + EB_U32 height); diff --git a/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h b/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h index bcc3b4eda..31138cb2e 100644 --- a/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbSampleAdaptiveOffset_SSE2.h @@ -23,12 +23,12 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN( EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] extern EB_ERRORTYPE SAOApplyBO16bit_SSE2_INTRIN( - EB_U16 *reconSamplePtr, - EB_U32 reconStride, - EB_U32 saoBandPosition, - EB_S8 *saoOffsetPtr, - EB_U32 lcuHeight, - EB_U32 lcuWidth); + EB_U16 *reconSamplePtr, + EB_U32 reconStride, + EB_U32 saoBandPosition, + EB_S8 *saoOffsetPtr, + EB_U32 lcuHeight, + EB_U32 lcuWidth); extern EB_ERRORTYPE SAOApplyEO_45_16bit_SSE2_INTRIN( EB_U16 *reconSamplePtr, diff --git a/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c index 25ecc6b96..88473e663 100644 --- a/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbSaoStatistics_Intrinsic_SSE2.c @@ -30,29 +30,29 @@ static void countEdge(__m128i *eoDiff, __m128i *eoCount, EB_BYTE ptr, EB_S32 off __m128i x1, x2; __m128i c1, c2; __m128i cat, select; - + x1 = _mm_loadu_si128((__m128i *)(ptr + offset)); x2 = _mm_loadu_si128((__m128i *)(ptr - offset)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); x2 = _mm_xor_si128(x2, _mm_set1_epi8(-128)); - + c1 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x1), _mm_cmpgt_epi8(x0, x1)); c2 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x2), _mm_cmpgt_epi8(x0, x2)); cat = _mm_add_epi8(c1, c2); cat = _mm_and_si128(cat, mask); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(-2)); eoCount[0] = _mm_sub_epi8(eoCount[0], select); eoDiff[0] = _mm_add_epi64(eoDiff[0], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(-1)); eoCount[1] = _mm_sub_epi8(eoCount[1], select); eoDiff[1] = _mm_add_epi64(eoDiff[1], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(1)); eoCount[2] = _mm_sub_epi8(eoCount[2], select); eoDiff[2] = _mm_add_epi64(eoDiff[2], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); - + select = _mm_cmpeq_epi8(cat, _mm_set1_epi8(2)); eoCount[3] = _mm_sub_epi8(eoCount[3], select); eoDiff[3] = _mm_add_epi64(eoDiff[3], _mm_sad_epu8(_mm_and_si128(diff, select), _mm_setzero_si128())); @@ -102,7 +102,7 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_BT_SSE2( EB_U32 lcuWidth, // input parameter, LCU width EB_U32 lcuHeight, // input parameter, LCU height EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { @@ -263,28 +263,28 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_BT_SSE2( EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2( - EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U8 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES+1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES+1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U8 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES+1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES+1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { EB_S32 colCount, rowCount; EB_S32 i, j; - + __m128i eoDiffX[SAO_EO_TYPES][SAO_EO_CATEGORIES]; __m128i eoCountX[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - + lcuWidth -= 2; lcuHeight -= 2; inputSamplePtr += inputStride + 1; reconSamplePtr += reconStride + 1; - + colCount = lcuWidth; - + for (i = 1; i < SAO_EO_TYPES; i++) { for (j = 0; j < SAO_EO_CATEGORIES; j++) @@ -293,52 +293,52 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2( eoCountX[i][j] = _mm_setzero_si128(); } } - + do { __m128i mask; EB_BYTE ptr = reconSamplePtr; EB_BYTE qtr = inputSamplePtr; EB_S32 idx; - + rowCount = lcuHeight; - + idx = (colCount >> 1) - 1; - mask = (idx >= 0 && idx < 8) ? _mm_loadu_si128((__m128i *)maskTable[idx]) : _mm_loadu_si128((__m128i *)maskTable[7]); + mask = (idx >= 0 && idx < 8) ? _mm_loadu_si128((__m128i *)maskTable[idx]) : _mm_loadu_si128((__m128i *)maskTable[7]); do { __m128i x0, y0; __m128i diff; x0 = _mm_loadu_si128((__m128i *)ptr); y0 = _mm_loadu_si128((__m128i *)qtr); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); y0 = _mm_xor_si128(y0, _mm_set1_epi8(-128)); diff = _mm_subs_epi8(y0, x0); diff = _mm_and_si128(diff, mask); // Edge offset - + // Add 128 to difference to make it an unsigned integer to allow use of _mm_sad_epu8 intrinsic // This difference will be subtracted from the end result diff = _mm_xor_si128(diff, _mm_set1_epi8(-128)); - + countEdge(eoDiffX[1], eoCountX[1], ptr, reconStride, x0, diff, mask); countEdge(eoDiffX[2], eoCountX[2], ptr, reconStride+1, x0, diff, mask); countEdge(eoDiffX[3], eoCountX[3], ptr, reconStride-1, x0, diff, mask); - + ptr += reconStride; qtr += inputStride; } while (--rowCount); - + reconSamplePtr += 16; inputSamplePtr += 16; - + colCount -= 16; } while (colCount > 0); - + for (i = 1; i < SAO_EO_TYPES; i++) { for (j = 0; j < SAO_EO_CATEGORIES; j++) @@ -346,17 +346,17 @@ EB_EXTERN EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2( __m128i x0; EB_U32 *p; EB_U16/*EB_U32*/ count; - + // Note: accumulation of counts over 8 bits is ok since the maximum count is 62*4 = 248 x0 = _mm_sad_epu8(eoCountX[i][j], _mm_setzero_si128()); count =(EB_U16)(_mm_extract_epi32(x0, 0) + _mm_extract_epi32(x0, 2)); eoCount[i][j] = count; - + // Note: subtracting 128 that was previously added in main loop p = (EB_U32 *)&eoDiffX[i][j]; eoDiff[i][j] = p[0] + p[2] - 128 * count; } } - + return EB_ErrorNone; } diff --git a/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c b/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c index 3b93a6ebe..1739ac7a0 100644 --- a/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c +++ b/Source/Lib/ASM_SSE2/EbTransforms_Intrinsic_SSE2.c @@ -87,7 +87,7 @@ /*sum4 = _mm_add_epi32(_mm_madd_epi16(XMM7, _mm_loadu_si128((__m128i *)(MEM + OFST3))), _mm_madd_epi16(XMM8, _mm_loadu_si128((__m128i *)(MEM + OFST4))));*/\ /*sum3 = _mm_srai_epi32(_mm_add_epi32(XMM_OFST, _mm_add_epi32(sum3, sum4)), SHIFT);*/\ /*sum = _mm_packs_epi32(sum1, sum3);*/\ - sum = _mm_packs_epi32(sum1, sum1);\ + sum = _mm_packs_epi32(sum1, sum1);\ INSTR((__m128i *)(DST + OFST5), sum); #define MACRO_TRANS_8MAC_PF_N4(XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM_OFST, MEM, OFST1, OFST2, OFST3, OFST4, SHIFT, INSTR, DST, OFST5)\ sum1 = _mm_add_epi32(_mm_madd_epi16(XMM1, _mm_loadu_si128((__m128i *)(MEM + OFST1))), _mm_madd_epi16(XMM2, _mm_loadu_si128((__m128i *)(MEM + OFST2))));\ @@ -97,7 +97,7 @@ /*sum4 = _mm_add_epi32(_mm_madd_epi16(XMM7, _mm_loadu_si128((__m128i *)(MEM + OFST3))), _mm_madd_epi16(XMM8, _mm_loadu_si128((__m128i *)(MEM + OFST4))));*/\ /*sum3 = _mm_srai_epi32(_mm_add_epi32(XMM_OFST, _mm_add_epi32(sum3, sum4)), SHIFT);*/\ /*sum = _mm_packs_epi32(sum1, sum3);*/\ - sum = _mm_packs_epi32(sum1, sum1);\ + sum = _mm_packs_epi32(sum1, sum1);\ INSTR((__m128i *)(DST + OFST5), sum); #ifdef __GNUC__ @@ -674,132 +674,132 @@ static void PfreqTranspose32_SSE2( } static void PfreqN4SecTranspose32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - - i = j = 0; - { - { - __m128i a0, a1, a2, a3, a4, a5, a6, a7; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); - a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); - a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); - a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); - a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); - a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); - a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); - a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); - - b0 = _mm_unpacklo_epi16(a0, a4); - b1 = _mm_unpacklo_epi16(a1, a5); - b2 = _mm_unpacklo_epi16(a2, a6); - b3 = _mm_unpacklo_epi16(a3, a7); - b4 = _mm_unpackhi_epi16(a0, a4); - b5 = _mm_unpackhi_epi16(a1, a5); - b6 = _mm_unpackhi_epi16(a2, a6); - b7 = _mm_unpackhi_epi16(a3, a7); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - a4 = _mm_unpacklo_epi16(b4, b6); - a5 = _mm_unpacklo_epi16(b5, b7); - a6 = _mm_unpackhi_epi16(b4, b6); - a7 = _mm_unpackhi_epi16(b5, b7); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - b4 = _mm_unpacklo_epi16(a4, a5); - b5 = _mm_unpackhi_epi16(a4, a5); - b6 = _mm_unpacklo_epi16(a6, a7); - b7 = _mm_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); - - } - } - } + EB_U32 i, j; + + i = j = 0; + { + { + __m128i a0, a1, a2, a3, a4, a5, a6, a7; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); + a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); + a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); + a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); + a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); + a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); + a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); + a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); + + b0 = _mm_unpacklo_epi16(a0, a4); + b1 = _mm_unpacklo_epi16(a1, a5); + b2 = _mm_unpacklo_epi16(a2, a6); + b3 = _mm_unpacklo_epi16(a3, a7); + b4 = _mm_unpackhi_epi16(a0, a4); + b5 = _mm_unpackhi_epi16(a1, a5); + b6 = _mm_unpackhi_epi16(a2, a6); + b7 = _mm_unpackhi_epi16(a3, a7); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + a4 = _mm_unpacklo_epi16(b4, b6); + a5 = _mm_unpacklo_epi16(b5, b7); + a6 = _mm_unpackhi_epi16(b4, b6); + a7 = _mm_unpackhi_epi16(b5, b7); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + b4 = _mm_unpacklo_epi16(a4, a5); + b5 = _mm_unpackhi_epi16(a4, a5); + b6 = _mm_unpacklo_epi16(a6, a7); + b7 = _mm_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); + + } + } + } static void PfreqN4FirstTranspose32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - - for (i = 0; i < 4; i++) - { - //for (j = 0; j < 2; j++) - j = 0; - { - - __m128i a0, a1, a2, a3, a4, a5, a6, a7; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - - a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); - a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); - a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); - a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); - a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); - a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); - a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); - a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); - - b0 = _mm_unpacklo_epi16(a0, a4); - b1 = _mm_unpacklo_epi16(a1, a5); - b2 = _mm_unpacklo_epi16(a2, a6); - b3 = _mm_unpacklo_epi16(a3, a7); - b4 = _mm_unpackhi_epi16(a0, a4); - b5 = _mm_unpackhi_epi16(a1, a5); - b6 = _mm_unpackhi_epi16(a2, a6); - b7 = _mm_unpackhi_epi16(a3, a7); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - a4 = _mm_unpacklo_epi16(b4, b6); - a5 = _mm_unpacklo_epi16(b5, b7); - a6 = _mm_unpackhi_epi16(b4, b6); - a7 = _mm_unpackhi_epi16(b5, b7); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - b4 = _mm_unpacklo_epi16(a4, a5); - b5 = _mm_unpackhi_epi16(a4, a5); - b6 = _mm_unpacklo_epi16(a6, a7); - b7 = _mm_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); - - } - } - } + EB_U32 i, j; + + for (i = 0; i < 4; i++) + { + //for (j = 0; j < 2; j++) + j = 0; + { + + __m128i a0, a1, a2, a3, a4, a5, a6, a7; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + + a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); + a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); + a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); + a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); + a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); + a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); + a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); + a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); + + b0 = _mm_unpacklo_epi16(a0, a4); + b1 = _mm_unpacklo_epi16(a1, a5); + b2 = _mm_unpacklo_epi16(a2, a6); + b3 = _mm_unpacklo_epi16(a3, a7); + b4 = _mm_unpackhi_epi16(a0, a4); + b5 = _mm_unpackhi_epi16(a1, a5); + b6 = _mm_unpackhi_epi16(a2, a6); + b7 = _mm_unpackhi_epi16(a3, a7); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + a4 = _mm_unpacklo_epi16(b4, b6); + a5 = _mm_unpacklo_epi16(b5, b7); + a6 = _mm_unpackhi_epi16(b4, b6); + a7 = _mm_unpackhi_epi16(b5, b7); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + b4 = _mm_unpacklo_epi16(a4, a5); + b5 = _mm_unpackhi_epi16(a4, a5); + b6 = _mm_unpacklo_epi16(a6, a7); + b7 = _mm_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); + + } + } + } void EbHevcPfreqTranspose32Type1_SSE2( EB_S16 *src, @@ -1812,314 +1812,6 @@ static void Pfreq2DTransform32_SSE2( } static void PfreqN41DTransform32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) -{ - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); - const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; - - for (i = 0; i < 32; i++) - { - __m128i x0, x1, x2, x3; - __m128i y0, y1, y2, y3; - __m128i a0, a2, a4/*, a5*/; - __m128i b0, b1, b2, b3, b4/*, b5*/; - - - b1 = s0; - b3 = s0; - - x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); - x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); - x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); - - - // 32-point butterfly - x2 = reverse_epi16(x2); - x3 = reverse_epi16(x3); - - y0 = _mm_add_epi16(x0, x3); - y1 = _mm_add_epi16(x1, x2); - - y2 = _mm_sub_epi16(x0, x3); - y3 = _mm_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = reverse_epi16(y1); - - x0 = _mm_add_epi16(y0, y1); - x1 = _mm_sub_epi16(y0, y1); - - - x2 = y2; - x3 = y3; - - - - a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); - - /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); - //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); - b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); - //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); - b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); - /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); - //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); - //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); - - x0 = _mm_packs_epi32(b0, b1); - x1 = _mm_packs_epi32(b2, b3); - x2 = _mm_packs_epi32(b4, b4); - - //x3 = _mm_packs_epi32(b6, b7); - - y0 = _mm_unpacklo_epi16(x0, x1); - //y1 = _mm_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm_unpacklo_epi16(y0, y2); - /**/// x1 = _mm_unpackhi_epi16(y0, y2); - //x2 = _mm_unpacklo_epi16(y1, y3); - //x3 = _mm_unpackhi_epi16(y1, y3); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); - /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); - } -} -static void PfreqN42DTransform32_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) -{ - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); - const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; - - for (i = 0; i < 8; i++) - - { - __m128i x0, x1, x2, x3; - __m128i y0, y1, y2, y3; - __m128i a0, a2, a4/*, a5*/; - __m128i b0, b1, b2, b3, b4/*, b5*/; - - b1 = s0; - b3 = s0; - - x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); - x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); - x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); - - - // 32-point butterfly - x2 = reverse_epi16(x2); - x3 = reverse_epi16(x3); - - y0 = _mm_add_epi16(x0, x3); - y1 = _mm_add_epi16(x1, x2); - - y2 = _mm_sub_epi16(x0, x3); - y3 = _mm_sub_epi16(x1, x2); - - // 16-point butterfly - y1 = reverse_epi16(y1); - - x0 = _mm_add_epi16(y0, y1); - x1 = _mm_sub_epi16(y0, y1); - - - x2 = y2; - x3 = y3; - - - - a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); - - //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); - //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); - - a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - - //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); - //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); - - a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); - a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); - - /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); - /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); - - //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); - //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); - // - //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); - //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); - - b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); - //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); - b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); - //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); - b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); - /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); - //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); - //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); - - x0 = _mm_packs_epi32(b0, b1); - x1 = _mm_packs_epi32(b2, b3); - x2 = _mm_packs_epi32(b4, b4);//do not use b5 - - //x3 = _mm_packs_epi32(b6, b7); - - y0 = _mm_unpacklo_epi16(x0, x1); - //y1 = _mm_unpackhi_epi16(x0, x1); - y2 = x2; - //y3 = x3; - x0 = _mm_unpacklo_epi16(y0, y2); - /**/// x1 = _mm_unpackhi_epi16(y0, y2); - //x2 = _mm_unpacklo_epi16(y1, y3); - //x3 = _mm_unpackhi_epi16(y1, y3); - - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); - /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); - - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); - //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); - } -} - -void Transform32x32_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) -{ - Transform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); - Transpose32_SSE2(intermediate, 32, dst, dst_stride); - Transform32_SSE2(dst, dst_stride, intermediate, 32, 9); - Transpose32_SSE2(intermediate, 32, dst, dst_stride); - - return; -} - -void PfreqN4Transform32x32_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) -{ - PfreqN41DTransform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); - PfreqN4FirstTranspose32_SSE2(intermediate, 32, dst, dst_stride); - PfreqN42DTransform32_SSE2(dst, dst_stride, intermediate, 32, 9); - PfreqN4SecTranspose32_SSE2(intermediate, 32, dst, dst_stride); - - return; -} - -static void Pfreq1DTransform16_SSE2( EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, @@ -2131,19 +1823,32 @@ static void Pfreq1DTransform16_SSE2( __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; - for (i = 0; i < 16; i++) + for (i = 0; i < 32; i++) { - __m128i x0, x1; - __m128i y0, y1; - __m128i a0, a2; - __m128i b0, b1, b2, b3; + __m128i x0, x1, x2, x3; + __m128i y0, y1, y2, y3; + __m128i a0, a2, a4/*, a5*/; + __m128i b0, b1, b2, b3, b4/*, b5*/; + b1 = s0; b3 = s0; - y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); + x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); + + + // 32-point butterfly + x2 = reverse_epi16(x2); + x3 = reverse_epi16(x3); + y0 = _mm_add_epi16(x0, x3); + y1 = _mm_add_epi16(x1, x2); + + y2 = _mm_sub_epi16(x0, x3); + y3 = _mm_sub_epi16(x1, x2); // 16-point butterfly y1 = reverse_epi16(y1); @@ -2151,29 +1856,99 @@ static void Pfreq1DTransform16_SSE2( x0 = _mm_add_epi16(y0, y1); x1 = _mm_sub_epi16(y0, y1); + + x2 = y2; + x3 = y3; + + + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); + + /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); + b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); + /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); + //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); + //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); x0 = _mm_packs_epi32(b0, b1); x1 = _mm_packs_epi32(b2, b3); + x2 = _mm_packs_epi32(b4, b4); + + //x3 = _mm_packs_epi32(b6, b7); y0 = _mm_unpacklo_epi16(x0, x1); + //y1 = _mm_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm_unpacklo_epi16(y0, y2); + /**/// x1 = _mm_unpackhi_epi16(y0, y2); + //x2 = _mm_unpacklo_epi16(y1, y3); + //x3 = _mm_unpackhi_epi16(y1, y3); - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0); + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); + /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); } } - -static void Pfreq2DTransform16_SSE2( +static void PfreqN42DTransform32_SSE2( EB_S16 *src, EB_U32 src_stride, EB_S16 *dst, @@ -2186,23 +1961,248 @@ static void Pfreq2DTransform16_SSE2( const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; for (i = 0; i < 8; i++) + { - __m128i x0, x1; - __m128i y0, y1; - __m128i a0, a2; - __m128i b0, b1, b2, b3; + __m128i x0, x1, x2, x3; + __m128i y0, y1, y2, y3; + __m128i a0, a2, a4/*, a5*/; + __m128i b0, b1, b2, b3, b4/*, b5*/; b1 = s0; b3 = s0; - y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + x1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + x2 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x10)); + x3 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x18)); - // 16-point butterfly - y1 = reverse_epi16(y1); + // 32-point butterfly + x2 = reverse_epi16(x2); + x3 = reverse_epi16(x3); - x0 = _mm_add_epi16(y0, y1); + y0 = _mm_add_epi16(x0, x3); + y1 = _mm_add_epi16(x1, x2); + + y2 = _mm_sub_epi16(x0, x3); + y3 = _mm_sub_epi16(x1, x2); + + // 16-point butterfly + y1 = reverse_epi16(y1); + + x0 = _mm_add_epi16(y0, y1); + x1 = _mm_sub_epi16(y0, y1); + + + x2 = y2; + x3 = y3; + + + + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + + //a1 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[1]); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[3])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[5])); + //a1 = _mm_add_epi32(a1, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[7])); + + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + + //a3 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[9]); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[11])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[13])); + //a3 = _mm_add_epi32(a3, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[15])); + + a4 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[16]); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[20])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[24])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[28])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[32])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[36])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[40])); + a4 = _mm_add_epi32(a4, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[44])); + + /**/// a5 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[17]); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[21])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[25])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[29])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[33])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[37])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[41])); + /**/// a5 = _mm_add_epi32(a5, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[45])); + + //a6 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[18]); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[22])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[26])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[30])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[34])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[38])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[42])); + //a6 = _mm_add_epi32(a6, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[46])); + // + //a7 = _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x00), coeff32[19]); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0x55), coeff32[23])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xaa), coeff32[27])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x2, 0xff), coeff32[31])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x00), coeff32[35])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0x55), coeff32[39])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xaa), coeff32[43])); + //a7 = _mm_add_epi32(a7, _mm_madd_epi16(_mm_shuffle_epi32(x3, 0xff), coeff32[47])); + + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + //b1 = _mm_sra_epi32(_mm_add_epi32(a1, o0), s0); + b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + //b3 = _mm_sra_epi32(_mm_add_epi32(a3, o0), s0); + b4 = _mm_sra_epi32(_mm_add_epi32(a4, o0), s0); + /**/// b5 = _mm_sra_epi32(_mm_add_epi32(a5, o0), s0); + //b6 = _mm_sra_epi32(_mm_add_epi32(a6, o0), s0); + //b7 = _mm_sra_epi32(_mm_add_epi32(a7, o0), s0); + + x0 = _mm_packs_epi32(b0, b1); + x1 = _mm_packs_epi32(b2, b3); + x2 = _mm_packs_epi32(b4, b4);//do not use b5 + + //x3 = _mm_packs_epi32(b6, b7); + + y0 = _mm_unpacklo_epi16(x0, x1); + //y1 = _mm_unpackhi_epi16(x0, x1); + y2 = x2; + //y3 = x3; + x0 = _mm_unpacklo_epi16(y0, y2); + /**/// x1 = _mm_unpackhi_epi16(y0, y2); + //x2 = _mm_unpacklo_epi16(y1, y3); + //x3 = _mm_unpackhi_epi16(y1, y3); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), x0); + /**/// _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x08), x1); + + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x10), x2); + //_mm_storeu_si128((__m128i *)(dst+i*dst_stride+0x18), x3); + } +} + +void Transform32x32_SSE2( + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) +{ + Transform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); + Transpose32_SSE2(intermediate, 32, dst, dst_stride); + Transform32_SSE2(dst, dst_stride, intermediate, 32, 9); + Transpose32_SSE2(intermediate, 32, dst, dst_stride); + + return; +} + +void PfreqN4Transform32x32_SSE2( + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) +{ + PfreqN41DTransform32_SSE2(src, src_stride, intermediate, 32, 6 + addshift); + PfreqN4FirstTranspose32_SSE2(intermediate, 32, dst, dst_stride); + PfreqN42DTransform32_SSE2(dst, dst_stride, intermediate, 32, 9); + PfreqN4SecTranspose32_SSE2(intermediate, 32, dst, dst_stride); + + return; +} + +static void Pfreq1DTransform16_SSE2( + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) +{ + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); + const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; + + for (i = 0; i < 16; i++) + { + __m128i x0, x1; + __m128i y0, y1; + __m128i a0, a2; + __m128i b0, b1, b2, b3; + + b1 = s0; + b3 = s0; + + y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + + + // 16-point butterfly + y1 = reverse_epi16(y1); + + x0 = _mm_add_epi16(y0, y1); + x1 = _mm_sub_epi16(y0, y1); + + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + + x0 = _mm_packs_epi32(b0, b1); + x1 = _mm_packs_epi32(b2, b3); + + y0 = _mm_unpacklo_epi16(x0, x1); + + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0); + } +} + +static void Pfreq2DTransform16_SSE2( + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) +{ + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); + const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; + + for (i = 0; i < 8; i++) + { + __m128i x0, x1; + __m128i y0, y1; + __m128i a0, a2; + __m128i b0, b1, b2, b3; + + b1 = s0; + b3 = s0; + + y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + + + // 16-point butterfly + y1 = reverse_epi16(y1); + + x0 = _mm_add_epi16(y0, y1); x1 = _mm_sub_epi16(y0, y1); a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); @@ -2306,162 +2306,162 @@ void PfreqTransform16x16_SSE2( } static void PfreqN42DTransform16_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride, - EB_U32 shift) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride, + EB_U32 shift) { - EB_U32 i; - __m128i s0 = _mm_cvtsi32_si128(shift); - __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); - const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; + EB_U32 i; + __m128i s0 = _mm_cvtsi32_si128(shift); + __m128i o0 = _mm_set1_epi32(1 << (shift - 1)); + const __m128i *coeff32 = (const __m128i *)EbHevcCoeff_tbl; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) - { - __m128i x0, x1; - __m128i y0, y1; - __m128i a0, a2; - __m128i b0, b1, b2, b3; + { + __m128i x0, x1; + __m128i y0, y1; + __m128i a0, a2; + __m128i b0, b1, b2, b3; - b1 = s0; - b3 = s0; + b1 = s0; + b3 = s0; - y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); - y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); + y0 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x00)); + y1 = _mm_loadu_si128((const __m128i *)(src + i*src_stride + 0x08)); - // 16-point butterfly - y1 = reverse_epi16(y1); + // 16-point butterfly + y1 = reverse_epi16(y1); - x0 = _mm_add_epi16(y0, y1); - x1 = _mm_sub_epi16(y0, y1); + x0 = _mm_add_epi16(y0, y1); + x1 = _mm_sub_epi16(y0, y1); - a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); - a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); + a0 = _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x00), coeff32[0]); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0x55), coeff32[2])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xaa), coeff32[4])); + a0 = _mm_add_epi32(a0, _mm_madd_epi16(_mm_shuffle_epi32(x0, 0xff), coeff32[6])); - a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); - a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); + a2 = _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x00), coeff32[8]); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0x55), coeff32[10])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xaa), coeff32[12])); + a2 = _mm_add_epi32(a2, _mm_madd_epi16(_mm_shuffle_epi32(x1, 0xff), coeff32[14])); - b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); - b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); + b0 = _mm_sra_epi32(_mm_add_epi32(a0, o0), s0); + b2 = _mm_sra_epi32(_mm_add_epi32(a2, o0), s0); - x0 = _mm_packs_epi32(b0, b1); - x1 = _mm_packs_epi32(b2, b3); + x0 = _mm_packs_epi32(b0, b1); + x1 = _mm_packs_epi32(b2, b3); - y0 = _mm_unpacklo_epi16(x0, x1); + y0 = _mm_unpacklo_epi16(x0, x1); - _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0);//TODO change to 64bit - } + _mm_storeu_si128((__m128i *)(dst + i*dst_stride + 0x00), y0);//TODO change to 64bit + } } static void PfreqN4FirstTranspose16_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - for (i = 0; i < 2; i++) - { - for (j = 0; j < 1; j++) - { - __m128i a0, a1, a2, a3, a4, a5, a6, a7; - __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; - - a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); - a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); - a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); - a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); - a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); - a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); - a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); - a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); - - b0 = _mm_unpacklo_epi16(a0, a4); - b1 = _mm_unpacklo_epi16(a1, a5); - b2 = _mm_unpacklo_epi16(a2, a6); - b3 = _mm_unpacklo_epi16(a3, a7); - // b4 = _mm_unpackhi_epi16(a0, a4); - // b5 = _mm_unpackhi_epi16(a1, a5); - // b6 = _mm_unpackhi_epi16(a2, a6); - // b7 = _mm_unpackhi_epi16(a3, a7); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - // a4 = _mm_unpacklo_epi16(b4, b6); - // a5 = _mm_unpacklo_epi16(b5, b7); - // a6 = _mm_unpackhi_epi16(b4, b6); - // a7 = _mm_unpackhi_epi16(b5, b7); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - // b4 = _mm_unpacklo_epi16(a4, a5); - // b5 = _mm_unpackhi_epi16(a4, a5); - // b6 = _mm_unpacklo_epi16(a6, a7); - // b7 = _mm_unpackhi_epi16(a6, a7); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); - // _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); - } - } + EB_U32 i, j; + for (i = 0; i < 2; i++) + { + for (j = 0; j < 1; j++) + { + __m128i a0, a1, a2, a3, a4, a5, a6, a7; + __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; + + a0 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 0)*src_stride + 8 * j)); + a1 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 1)*src_stride + 8 * j)); + a2 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 2)*src_stride + 8 * j)); + a3 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 3)*src_stride + 8 * j)); + a4 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 4)*src_stride + 8 * j)); + a5 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 5)*src_stride + 8 * j)); + a6 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 6)*src_stride + 8 * j)); + a7 = _mm_loadu_si128((const __m128i *)(src + (8 * i + 7)*src_stride + 8 * j)); + + b0 = _mm_unpacklo_epi16(a0, a4); + b1 = _mm_unpacklo_epi16(a1, a5); + b2 = _mm_unpacklo_epi16(a2, a6); + b3 = _mm_unpacklo_epi16(a3, a7); + // b4 = _mm_unpackhi_epi16(a0, a4); + // b5 = _mm_unpackhi_epi16(a1, a5); + // b6 = _mm_unpackhi_epi16(a2, a6); + // b7 = _mm_unpackhi_epi16(a3, a7); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + // a4 = _mm_unpacklo_epi16(b4, b6); + // a5 = _mm_unpacklo_epi16(b5, b7); + // a6 = _mm_unpackhi_epi16(b4, b6); + // a7 = _mm_unpackhi_epi16(b5, b7); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + // b4 = _mm_unpacklo_epi16(a4, a5); + // b5 = _mm_unpackhi_epi16(a4, a5); + // b6 = _mm_unpacklo_epi16(a6, a7); + // b7 = _mm_unpackhi_epi16(a6, a7); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 4)*dst_stride + 8 * i), b4); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 5)*dst_stride + 8 * i), b5); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 6)*dst_stride + 8 * i), b6); + // _mm_storeu_si128((__m128i *)(dst + (8 * j + 7)*dst_stride + 8 * i), b7); + } + } } static void PfreqN4SecondTranspose16_SSE2( - EB_S16 *src, - EB_U32 src_stride, - EB_S16 *dst, - EB_U32 dst_stride) + EB_S16 *src, + EB_U32 src_stride, + EB_S16 *dst, + EB_U32 dst_stride) { - EB_U32 i, j; - - i = j = 0; - { - { - __m128i a0, a1, a2, a3/*, a4, a5, a6, a7*/; - __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; - - a0 = _mm_loadu_si128((const __m128i *)(src + (0)*src_stride)); //TODO load only 64bit - a1 = _mm_loadu_si128((const __m128i *)(src + (1)*src_stride)); - a2 = _mm_loadu_si128((const __m128i *)(src + (2)*src_stride)); - a3 = _mm_loadu_si128((const __m128i *)(src + (3)*src_stride)); - - b0 = _mm_unpacklo_epi16(a0, a0/*a4*/); - b1 = _mm_unpacklo_epi16(a1, a1/*a5*/); - b2 = _mm_unpacklo_epi16(a2, a2/*a6*/); - b3 = _mm_unpacklo_epi16(a3, a3/*a7*/); - - a0 = _mm_unpacklo_epi16(b0, b2); - a1 = _mm_unpacklo_epi16(b1, b3); - a2 = _mm_unpackhi_epi16(b0, b2); - a3 = _mm_unpackhi_epi16(b1, b3); - - b0 = _mm_unpacklo_epi16(a0, a1); - b1 = _mm_unpackhi_epi16(a0, a1); - b2 = _mm_unpacklo_epi16(a2, a3); - b3 = _mm_unpackhi_epi16(a2, a3); - - _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); - _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); - } - } + EB_U32 i, j; + + i = j = 0; + { + { + __m128i a0, a1, a2, a3/*, a4, a5, a6, a7*/; + __m128i b0, b1, b2, b3/*, b4, b5, b6, b7*/; + + a0 = _mm_loadu_si128((const __m128i *)(src + (0)*src_stride)); //TODO load only 64bit + a1 = _mm_loadu_si128((const __m128i *)(src + (1)*src_stride)); + a2 = _mm_loadu_si128((const __m128i *)(src + (2)*src_stride)); + a3 = _mm_loadu_si128((const __m128i *)(src + (3)*src_stride)); + + b0 = _mm_unpacklo_epi16(a0, a0/*a4*/); + b1 = _mm_unpacklo_epi16(a1, a1/*a5*/); + b2 = _mm_unpacklo_epi16(a2, a2/*a6*/); + b3 = _mm_unpacklo_epi16(a3, a3/*a7*/); + + a0 = _mm_unpacklo_epi16(b0, b2); + a1 = _mm_unpacklo_epi16(b1, b3); + a2 = _mm_unpackhi_epi16(b0, b2); + a3 = _mm_unpackhi_epi16(b1, b3); + + b0 = _mm_unpacklo_epi16(a0, a1); + b1 = _mm_unpackhi_epi16(a0, a1); + b2 = _mm_unpacklo_epi16(a2, a3); + b3 = _mm_unpackhi_epi16(a2, a3); + + _mm_storeu_si128((__m128i *)(dst + (8 * j + 0)*dst_stride + 8 * i), b0); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 1)*dst_stride + 8 * i), b1); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 2)*dst_stride + 8 * i), b2); + _mm_storeu_si128((__m128i *)(dst + (8 * j + 3)*dst_stride + 8 * i), b3); + } + } } void PfreqTransform32x32_SSE2( @@ -2481,19 +2481,19 @@ void PfreqTransform32x32_SSE2( } void PfreqN4Transform16x16_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift) + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift) { - Pfreq1DTransform16_SSE2(src, src_stride, intermediate, 16, 4 + addshift); - PfreqN4FirstTranspose16_SSE2(intermediate, 16, dst, dst_stride); - PfreqN42DTransform16_SSE2(dst, dst_stride, intermediate, 16, 9); - PfreqN4SecondTranspose16_SSE2(intermediate, 16, dst, dst_stride); + Pfreq1DTransform16_SSE2(src, src_stride, intermediate, 16, 4 + addshift); + PfreqN4FirstTranspose16_SSE2(intermediate, 16, dst, dst_stride); + PfreqN42DTransform16_SSE2(dst, dst_stride, intermediate, 16, 9); + PfreqN4SecondTranspose16_SSE2(intermediate, 16, dst, dst_stride); - return; + return; } @@ -2761,229 +2761,229 @@ void Transform8x8_SSE2_INTRIN( void PfreqTransform8x8_SSE2_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { - // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth - // Use a smaller table with values just for Transform8x8. - - EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { - 83, 36, 83, 36, 83, 36, 83, 36, - 36, -83, 36, -83, 36, -83, 36, -83, - 89, 75, 89, 75, 89, 75, 89, 75, - 50, 18, 50, 18, 50, 18, 50, 18, - 75, -18, 75, -18, 75, -18, 75, -18, - -89, -50, -89, -50, -89, -50, -89, -50, - 50, -89, 50, -89, 50, -89, 50, -89, - 18, 75, 18, 75, 18, 75, 18, 75, - 18, -50, 18, -50, 18, -50, 18, -50, - 75, -89, 75, -89, 75, -89, 75, -89, - 256, 0, 256, 0, 256, 0, 256, 0, - 64, 64, 64, 64, 64, 64, 64, 64, - -18, -50, -18, -50, -18, -50, -18, -50, - -75, -89, -75, -89, -75, -89, -75, -89, - -36, -83, -36, -83, -36, -83, -36, -83, - -83, -36, -83, -36, -83, -36, -83, -36, - 36, 83, 36, 83, 36, 83, 36, 83, - 50, 89, 50, 89, 50, 89, 50, 89, - 18, -75, 18, -75, 18, -75, 18, -75, - -64, 64, -64, 64, -64, 64, -64, 64, - 64, -64, 64, -64, 64, -64, 64, -64, - -75, -18, -75, -18, -75, -18, -75, -18, - 89, -50, 89, -50, 89, -50, 89, -50, - 83, -36, 83, -36, 83, -36, 83, -36, - -36, 83, -36, 83, -36, 83, -36, 83, - -83, 36, -83, 36, -83, 36, -83, 36, - 89, -75, 89, -75, 89, -75, 89, -75, - 50, -18, 50, -18, 50, -18, 50, -18, - }; - __m128i sum, sum1, sum2/*, sum3, sum4*/; - __m128i res0, res1, res2, res3, res4, res5, res6, res7; - __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; - __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; - __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; - __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; - __m128i trans02, trans0123; - __m128i xmm_offset; - EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; - EB_U32 shift; - - res0 = _mm_loadu_si128((__m128i *)residual); - res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - residual += (srcStride << 2); - res4 = _mm_loadu_si128((__m128i *)residual); - res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - - MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) - MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) - MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) - MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) - - evenEven0 = _mm_add_epi16(even0, even3); - evenEven1 = _mm_add_epi16(even1, even2); - evenOdd0 = _mm_sub_epi16(even0, even3); - evenOdd1 = _mm_sub_epi16(even1, even2); - - shift = 4 - bitIncrement; - trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); - trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); - - xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); - shift = bitIncrement + 2; - - trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - // TransformCoefficients 1, 3, 5, 7 - odd01_lo = _mm_unpacklo_epi16(odd0, odd1); - odd01_hi = _mm_unpackhi_epi16(odd0, odd1); - odd23_lo = _mm_unpacklo_epi16(odd2, odd3); - odd23_hi = _mm_unpackhi_epi16(odd2, odd3); - - MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) + // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth + // Use a smaller table with values just for Transform8x8. + + EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { + 83, 36, 83, 36, 83, 36, 83, 36, + 36, -83, 36, -83, 36, -83, 36, -83, + 89, 75, 89, 75, 89, 75, 89, 75, + 50, 18, 50, 18, 50, 18, 50, 18, + 75, -18, 75, -18, 75, -18, 75, -18, + -89, -50, -89, -50, -89, -50, -89, -50, + 50, -89, 50, -89, 50, -89, 50, -89, + 18, 75, 18, 75, 18, 75, 18, 75, + 18, -50, 18, -50, 18, -50, 18, -50, + 75, -89, 75, -89, 75, -89, 75, -89, + 256, 0, 256, 0, 256, 0, 256, 0, + 64, 64, 64, 64, 64, 64, 64, 64, + -18, -50, -18, -50, -18, -50, -18, -50, + -75, -89, -75, -89, -75, -89, -75, -89, + -36, -83, -36, -83, -36, -83, -36, -83, + -83, -36, -83, -36, -83, -36, -83, -36, + 36, 83, 36, 83, 36, 83, 36, 83, + 50, 89, 50, 89, 50, 89, 50, 89, + 18, -75, 18, -75, 18, -75, 18, -75, + -64, 64, -64, 64, -64, 64, -64, 64, + 64, -64, 64, -64, 64, -64, 64, -64, + -75, -18, -75, -18, -75, -18, -75, -18, + 89, -50, 89, -50, 89, -50, 89, -50, + 83, -36, 83, -36, 83, -36, 83, -36, + -36, 83, -36, 83, -36, 83, -36, 83, + -83, 36, -83, 36, -83, 36, -83, 36, + 89, -75, 89, -75, 89, -75, 89, -75, + 50, -18, 50, -18, 50, -18, 50, -18, + }; + __m128i sum, sum1, sum2/*, sum3, sum4*/; + __m128i res0, res1, res2, res3, res4, res5, res6, res7; + __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; + __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; + __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; + __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; + __m128i trans02, trans0123; + __m128i xmm_offset; + EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; + EB_U32 shift; + + res0 = _mm_loadu_si128((__m128i *)residual); + res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + residual += (srcStride << 2); + res4 = _mm_loadu_si128((__m128i *)residual); + res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + + MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) + MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) + MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) + MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) + + evenEven0 = _mm_add_epi16(even0, even3); + evenEven1 = _mm_add_epi16(even1, even2); + evenOdd0 = _mm_sub_epi16(even0, even3); + evenOdd1 = _mm_sub_epi16(even1, even2); + + shift = 4 - bitIncrement; + trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); + trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); + + xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); + shift = bitIncrement + 2; + + trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + // TransformCoefficients 1, 3, 5, 7 + odd01_lo = _mm_unpacklo_epi16(odd0, odd1); + odd01_hi = _mm_unpackhi_epi16(odd0, odd1); + odd23_lo = _mm_unpacklo_epi16(odd2, odd3); + odd23_hi = _mm_unpackhi_epi16(odd2, odd3); + + MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans3, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, shift) //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans5, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, shift) //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans7, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, shift) - MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) - MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) + MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) + MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) xmm_offset = _mm_loadu_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_256)); - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - //transformCoefficients += 4 * dstStride; - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - - (void)transformInnerArrayPtr; + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + //transformCoefficients += 4 * dstStride; + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + + (void)transformInnerArrayPtr; } void PfreqN4Transform8x8_SSE2_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { - // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth - // Use a smaller table with values just for Transform8x8. - - EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { - 83, 36, 83, 36, 83, 36, 83, 36, - 36, -83, 36, -83, 36, -83, 36, -83, - 89, 75, 89, 75, 89, 75, 89, 75, - 50, 18, 50, 18, 50, 18, 50, 18, - 75, -18, 75, -18, 75, -18, 75, -18, - -89, -50, -89, -50, -89, -50, -89, -50, - 50, -89, 50, -89, 50, -89, 50, -89, - 18, 75, 18, 75, 18, 75, 18, 75, - 18, -50, 18, -50, 18, -50, 18, -50, - 75, -89, 75, -89, 75, -89, 75, -89, - 256, 0, 256, 0, 256, 0, 256, 0, - 64, 64, 64, 64, 64, 64, 64, 64, - -18, -50, -18, -50, -18, -50, -18, -50, - -75, -89, -75, -89, -75, -89, -75, -89, - -36, -83, -36, -83, -36, -83, -36, -83, - -83, -36, -83, -36, -83, -36, -83, -36, - 36, 83, 36, 83, 36, 83, 36, 83, - 50, 89, 50, 89, 50, 89, 50, 89, - 18, -75, 18, -75, 18, -75, 18, -75, - -64, 64, -64, 64, -64, 64, -64, 64, - 64, -64, 64, -64, 64, -64, 64, -64, - -75, -18, -75, -18, -75, -18, -75, -18, - 89, -50, 89, -50, 89, -50, 89, -50, - 83, -36, 83, -36, 83, -36, 83, -36, - -36, 83, -36, 83, -36, 83, -36, 83, - -83, 36, -83, 36, -83, 36, -83, 36, - 89, -75, 89, -75, 89, -75, 89, -75, - 50, -18, 50, -18, 50, -18, 50, -18, - }; - __m128i sum, sum1, sum2/*, sum3, sum4*/; - __m128i res0, res1, res2, res3, res4, res5, res6, res7; - __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; - __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; - __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; - __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; - __m128i trans02, trans0123; - __m128i xmm_offset; - EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; - EB_U32 shift; - - res0 = _mm_loadu_si128((__m128i *)residual); - res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - residual += (srcStride << 2); - res4 = _mm_loadu_si128((__m128i *)residual); - res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - - MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) - MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) - MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) - MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) - - evenEven0 = _mm_add_epi16(even0, even3); - evenEven1 = _mm_add_epi16(even1, even2); - evenOdd0 = _mm_sub_epi16(even0, even3); - evenOdd1 = _mm_sub_epi16(even1, even2); - - shift = 4 - bitIncrement; - trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); - trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); - - xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); - shift = bitIncrement + 2; - - trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), - // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); - - // TransformCoefficients 1, 3, 5, 7 - odd01_lo = _mm_unpacklo_epi16(odd0, odd1); - odd01_hi = _mm_unpackhi_epi16(odd0, odd1); - odd23_lo = _mm_unpacklo_epi16(odd2, odd3); - odd23_hi = _mm_unpackhi_epi16(odd2, odd3); - - MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) - MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans3, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, shift) - //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans5, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, shift) - //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans7, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, shift) - - MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) - MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) - - xmm_offset = _mm_loadu_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_256)); - - MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - //transformCoefficients += 4 * dstStride; - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) - //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) - - (void)transformInnerArrayPtr; + // Transform8x8 has its own table because the larger table's offset macros exceed 256 (which is maximum macro expansion depth + // Use a smaller table with values just for Transform8x8. + + EB_ALIGN(16) EB_S16 transformIntrinConst_8x8[] = { + 83, 36, 83, 36, 83, 36, 83, 36, + 36, -83, 36, -83, 36, -83, 36, -83, + 89, 75, 89, 75, 89, 75, 89, 75, + 50, 18, 50, 18, 50, 18, 50, 18, + 75, -18, 75, -18, 75, -18, 75, -18, + -89, -50, -89, -50, -89, -50, -89, -50, + 50, -89, 50, -89, 50, -89, 50, -89, + 18, 75, 18, 75, 18, 75, 18, 75, + 18, -50, 18, -50, 18, -50, 18, -50, + 75, -89, 75, -89, 75, -89, 75, -89, + 256, 0, 256, 0, 256, 0, 256, 0, + 64, 64, 64, 64, 64, 64, 64, 64, + -18, -50, -18, -50, -18, -50, -18, -50, + -75, -89, -75, -89, -75, -89, -75, -89, + -36, -83, -36, -83, -36, -83, -36, -83, + -83, -36, -83, -36, -83, -36, -83, -36, + 36, 83, 36, 83, 36, 83, 36, 83, + 50, 89, 50, 89, 50, 89, 50, 89, + 18, -75, 18, -75, 18, -75, 18, -75, + -64, 64, -64, 64, -64, 64, -64, 64, + 64, -64, 64, -64, 64, -64, 64, -64, + -75, -18, -75, -18, -75, -18, -75, -18, + 89, -50, 89, -50, 89, -50, 89, -50, + 83, -36, 83, -36, 83, -36, 83, -36, + -36, 83, -36, 83, -36, 83, -36, 83, + -83, 36, -83, 36, -83, 36, -83, 36, + 89, -75, 89, -75, 89, -75, 89, -75, + 50, -18, 50, -18, 50, -18, 50, -18, + }; + __m128i sum, sum1, sum2/*, sum3, sum4*/; + __m128i res0, res1, res2, res3, res4, res5, res6, res7; + __m128i res01, res23, res45, res67, res02, res0123, res46, res4567, res04, res0246, res0145, res0_to_7; + __m128i even0, even1, even2, even3, odd0, odd1, odd2, odd3, odd01_lo, odd01_hi, odd23_lo, odd23_hi; + __m128i evenEven0, evenEven1, evenOdd0, evenOdd1; + __m128i trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans01, trans23, trans45, trans67; + __m128i trans02, trans0123; + __m128i xmm_offset; + EB_ALIGN(16) EB_S16 * TransformIntrinConst = transformIntrinConst_8x8; + EB_U32 shift; + + res0 = _mm_loadu_si128((__m128i *)residual); + res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + residual += (srcStride << 2); + res4 = _mm_loadu_si128((__m128i *)residual); + res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + + MACRO_UNPACK(16, res0, res1, res2, res3, res4, res5, res6, res7, res01, res23, res45, res67) + MACRO_UNPACK(32, res0, res2, res01, res23, res4, res6, res45, res67, res02, res0123, res46, res4567) + MACRO_UNPACK(64, res0, res4, res02, res46, res01, res45, res0123, res4567, res04, res0246, res0145, res0_to_7) + MACRO_CALC_EVEN_ODD(res0, res04, res02, res0246, res01, res0145, res0123, res0_to_7) + + evenEven0 = _mm_add_epi16(even0, even3); + evenEven1 = _mm_add_epi16(even1, even2); + evenOdd0 = _mm_sub_epi16(even0, even3); + evenOdd1 = _mm_sub_epi16(even1, even2); + + shift = 4 - bitIncrement; + trans0 = _mm_slli_epi16(_mm_add_epi16(evenEven0, evenEven1), shift); + trans4 = _mm_slli_epi16(_mm_sub_epi16(evenEven0, evenEven1), shift); + + xmm_offset = _mm_slli_epi32(_mm_set1_epi32(0x00000002), bitIncrement); + shift = bitIncrement + 2; + + trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_83_36)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + //trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpacklo_epi16(evenOdd0, evenOdd1)), xmm_offset), shift), + // _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_36_N83)), _mm_unpackhi_epi16(evenOdd0, evenOdd1)), xmm_offset), shift)); + + // TransformCoefficients 1, 3, 5, 7 + odd01_lo = _mm_unpacklo_epi16(odd0, odd1); + odd01_hi = _mm_unpackhi_epi16(odd0, odd1); + odd23_lo = _mm_unpacklo_epi16(odd2, odd3); + odd23_hi = _mm_unpackhi_epi16(odd2, odd3); + + MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans1, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, shift) + MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans3, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, shift) + //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans5, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, shift) + //MACRO_TRANS_4MAC_NO_SAVE(odd01_lo, odd01_hi, odd23_lo, odd23_hi, trans7, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, shift) + + MACRO_UNPACK(32, trans0, trans1, trans2, trans3, trans4/*, trans5, trans6, trans7*/, trans1, trans1, trans1, trans01, trans23, trans45, trans67) + MACRO_UNPACK_V2(64, trans0, trans2, trans01, trans23, trans4, trans0, /*trans6,*/ trans45, trans67, trans02, trans0123) + + xmm_offset = _mm_loadu_si128((__m128i *)(TransformIntrinConst + TRANS8x8_OFFSET_256)); + + MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, TRANS8x8_OFFSET_64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + MACRO_TRANS_8MAC_PF_N4(trans0, trans02, trans01, trans0123, trans4, trans45, trans45, trans45, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_89_75, TRANS8x8_OFFSET_50_18, TRANS8x8_OFFSET_N18_N50, TRANS8x8_OFFSET_N75_N89, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_83_36, TRANS8x8_OFFSET_N36_N83, TRANS8x8_OFFSET_N83_N36, TRANS8x8_OFFSET_36_83, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + //MACRO_TRANS_8MAC_PF_N2(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_75_N18, TRANS8x8_OFFSET_N89_N50, TRANS8x8_OFFSET_50_89, TRANS8x8_OFFSET_18_N75, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + //transformCoefficients += 4 * dstStride; + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, TRANS8x8_OFFSET_64_N64, TRANS8x8_OFFSET_N64_64, 9, _mm_storeu_si128, transformCoefficients, 0) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_50_N89, TRANS8x8_OFFSET_18_75, TRANS8x8_OFFSET_N75_N18, TRANS8x8_OFFSET_89_N50, 9, _mm_storeu_si128, transformCoefficients, (dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_36_N83, TRANS8x8_OFFSET_83_N36, TRANS8x8_OFFSET_N36_83, TRANS8x8_OFFSET_N83_36, 9, _mm_storeu_si128, transformCoefficients, (2 * dstStride)) + //MACRO_TRANS_8MAC(trans0, trans02, trans01, trans0123, trans4, trans46, trans45, trans4567, xmm_offset, TransformIntrinConst, TRANS8x8_OFFSET_18_N50, TRANS8x8_OFFSET_75_N89, TRANS8x8_OFFSET_89_N75, TRANS8x8_OFFSET_50_N18, 9, _mm_storeu_si128, transformCoefficients, (3 * dstStride)) + + (void)transformInnerArrayPtr; } diff --git a/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h b/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h index 206d3bf0c..3e84a0f42 100644 --- a/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h +++ b/Source/Lib/ASM_SSE2/EbTransforms_SSE2.h @@ -130,12 +130,12 @@ void PfreqTransform16x16_SSE2( EB_U32 addshift); void PfreqN4Transform16x16_SSE2( - EB_S16 *src, - const EB_U32 src_stride, - EB_S16 *dst, - const EB_U32 dst_stride, - EB_S16 *intermediate, - EB_U32 addshift); + EB_S16 *src, + const EB_U32 src_stride, + EB_S16 *dst, + const EB_U32 dst_stride, + EB_S16 *intermediate, + EB_U32 addshift); void EstimateInvTransform32x32_SSE2( EB_S16 *transformCoefficients, diff --git a/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c b/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c index 8205f95f3..43343ae5b 100644 --- a/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c +++ b/Source/Lib/ASM_SSE4_1/EbPictureOperators_Intrinsic_SSE4_1.c @@ -248,248 +248,248 @@ EB_U64 Compute8x8Satd_SSE4( } EB_U64 Compute8x8Satd_U8_SSE4( - EB_U8 *src, // input parameter, diff samples Ptr - EB_U64 *dcValue, - EB_U32 srcStride) + EB_U8 *src, // input parameter, diff samples Ptr + EB_U64 *dcValue, + EB_U32 srcStride) { - EB_U64 satdBlock8x8 = 0; - EB_S16 m2[8][8]; - - EB_U32 j; - __m128i s0, s1, s2, s3, s4, s5, s6, s7, s9, s10, s11, s12; - __m128i s8 = _mm_setzero_si128(); - __m128i sum01Neg, sum01Pos, sum23Neg, sum23Pos, sum45Neg, sum45Pos, sum67Neg, sum67Pos; - __m128i sum0to3Pos, sum4to7Pos, sum0to3Neg, sum4to7Neg, diff0to3Pos, diff4to7Pos, diff0to3Neg, diff4to7Neg; - __m128i sum0, sum1, difference0, difference1; - - for (j = 0; j < 8; j += 2) - { - s0 = _mm_loadl_epi64((__m128i*)(src + (j *srcStride))); - s10 = _mm_loadl_epi64((__m128i*)(src + ((j + 1) *srcStride))); - s10 = _mm_unpacklo_epi8(s10, _mm_setzero_si128()); - s0 = _mm_unpacklo_epi8(s0, _mm_setzero_si128()); - - sum0 = _mm_hadd_epi16(s0, s8); - sum1 = _mm_hadd_epi16(s10, s8); - - difference0 = _mm_hsub_epi16(s0, s8); - difference1 = _mm_hsub_epi16(s10, s8); - - // m2[j][0] - // diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] + diff[jj + 1] + diff[jj + 5] + diff[jj + 3] + diff[jj + 7] - // diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] + diff[jj + 4] + diff[jj + 5] + diff[jj + 6] + diff[jj + 7] - s1 = _mm_hadd_epi16(sum0, sum1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][0] = _mm_extract_epi16(s1, 0); - m2[j + 1][0] = _mm_extract_epi16(s1, 2); - - - //m2[j][1] - //diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] - diff[jj + 1] - diff[jj + 5] - diff[jj + 3] - diff[jj + 7] - //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] + diff[jj + 4] - diff[jj + 5] + diff[jj + 6] - diff[jj + 7] - //(diff[jj] - diff[jj + 1]) + (diff[jj + 2] - diff[jj + 3]) + (diff[jj + 4] - diff[jj + 5]) + (diff[jj + 6] - diff[jj + 7]) - s1 = _mm_hadd_epi16(difference0, difference1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][1] = _mm_extract_epi16(s1, 0); - m2[j + 1][1] = _mm_extract_epi16(s1, 2); - - //m2[j][2] - //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] + diff[jj + 1] + diff[jj + 5] - diff[jj + 3] - diff[jj + 7] - //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] + diff[jj + 4] + diff[jj + 5] - diff[jj + 6] - diff[jj + 7] - s1 = _mm_hsub_epi16(sum0, sum1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][2] = _mm_extract_epi16(s1, 0); - m2[j + 1][2] = _mm_extract_epi16(s1, 2); - - //m2[j][3] - //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] - diff[jj + 1] - diff[jj + 5] + diff[jj + 3] + diff[jj + 7] - //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] - //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] - s1 = _mm_hsub_epi16(difference0, difference1); - s1 = _mm_hadd_epi16(s1, s8); - m2[j][3] = _mm_extract_epi16(s1, 0); - m2[j + 1][3] = _mm_extract_epi16(s1, 2); - - //m2[j][4] - //diff[jj] - diff[jj + 4] + diff[jj + 2] - diff[jj + 6] + diff[jj + 1] - diff[jj + 5] + diff[jj + 3] - diff[jj + 7] - //diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] - diff[jj + 4] - diff[jj + 5] - diff[jj + 6] - diff[jj + 7] - s1 = _mm_hadd_epi16(sum0, sum1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][4] = _mm_extract_epi16(s1, 0); - m2[j + 1][4] = _mm_extract_epi16(s1, 2); - - //m2[j][5] - //m1[j][4] - m1[j][5] - //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] - diff[jj + 4] + diff[jj + 5] - diff[jj + 6] + diff[jj + 7] - s1 = _mm_hadd_epi16(difference0, difference1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][5] = _mm_extract_epi16(s1, 0); - m2[j + 1][5] = _mm_extract_epi16(s1, 2); - - //m2[j][6] - //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] + diff[jj + 1] - diff[jj + 5] - diff[jj + 3] + diff[jj + 7] - //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] - diff[jj + 4] - diff[jj + 5] + diff[jj + 6] + diff[jj + 7] - - s1 = _mm_hsub_epi16(sum0, sum1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][6] = _mm_extract_epi16(s1, 0); - m2[j + 1][6] = _mm_extract_epi16(s1, 2); - - //m2[j][7] - //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] - diff[jj + 1] + diff[jj + 5] + diff[jj + 3] - diff[jj + 7] - //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] - diff[jj + 4] + diff[jj + 5] + diff[jj + 6] - diff[jj + 7] - s1 = _mm_hsub_epi16(difference0, difference1); - s1 = _mm_hsub_epi16(s1, s8); - m2[j][7] = _mm_extract_epi16(s1, 0); - m2[j + 1][7] = _mm_extract_epi16(s1, 2); - } - - // Vertical - s0 = _mm_loadu_si128((__m128i*)(m2[0])); - s1 = _mm_loadu_si128((__m128i*)(m2[1])); - s2 = _mm_loadu_si128((__m128i*)(m2[2])); - s3 = _mm_loadu_si128((__m128i*)(m2[3])); - s4 = _mm_loadu_si128((__m128i*)(m2[4])); - s5 = _mm_loadu_si128((__m128i*)(m2[5])); - s6 = _mm_loadu_si128((__m128i*)(m2[6])); - s7 = _mm_loadu_si128((__m128i*)(m2[7])); - - sum01Pos = _mm_add_epi16(s0, s1); - sum23Pos = _mm_add_epi16(s2, s3); - sum45Pos = _mm_add_epi16(s4, s5); - sum67Pos = _mm_add_epi16(s6, s7); - - sum01Neg = _mm_sub_epi16(s0, s1); - sum23Neg = _mm_sub_epi16(s2, s3); - sum45Neg = _mm_sub_epi16(s4, s5); - sum67Neg = _mm_sub_epi16(s6, s7); - - sum0to3Pos = _mm_add_epi16(sum01Pos, sum23Pos); - sum4to7Pos = _mm_add_epi16(sum45Pos, sum67Pos); - diff0to3Pos = _mm_sub_epi16(sum01Pos, sum23Pos); - diff4to7Pos = _mm_sub_epi16(sum45Pos, sum67Pos); - - sum0to3Neg = _mm_add_epi16(sum01Neg, sum23Neg); - sum4to7Neg = _mm_add_epi16(sum45Neg, sum67Neg); - diff0to3Neg = _mm_sub_epi16(sum01Neg, sum23Neg); - diff4to7Neg = _mm_sub_epi16(sum45Neg, sum67Neg); - - //m2[0][i] = m1[0][i] + m1[1][i] - //m2[0][i] = m3[0][i] + m3[2][i] + m3[1][i] + m3[3][i] - //m2[0][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] + m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i] - //m2[0][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] + m2[4][i] + m2[5][i] + m2[6][i] + m2[7][i] - s9 = _mm_add_epi16(sum0to3Pos, sum4to7Pos); - s9 = _mm_abs_epi16(s9); - *dcValue += _mm_extract_epi16(s9, 0); - - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - - - //m2[1][i] = m1[0][i] - m1[1][i] - //m2[1][i] = m3[0][i] + m3[2][i] -(m3[1][i] + m3[3][i]) - //m2[1][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] -(m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i]) - //m2[1][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] + m2[4][i] - m2[5][i] + m2[6][i] - m2[7][i] - s9 = _mm_add_epi16(sum0to3Neg, sum4to7Neg); - s9 = _mm_abs_epi16(s9); - s12 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s12 = _mm_add_epi32(s12, s11); - s12 = _mm_hadd_epi32(s12, s8); - s12 = _mm_hadd_epi32(s12, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[2][i] = m1[2][i] + m1[3][i] - //m2[2][i] = m3[0][i] - m3[2][i] + m3[1][i] - m3[3][i] - //m2[2][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) + m2[1][i] + m2[5][i] - (m2[3][i] + m2[7][i]) - //m2[2][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] + m2[4][i] + m2[5][i] - m2[6][i] - m2[7][i] - //m2[2][i] = m2[0][i] + m2[1][i] - (m2[2][i] + m2[3][i]) + m2[4][i] + m2[5][i] - (m2[6][i] + m2[7][i]) - s9 = _mm_add_epi16(diff0to3Pos, diff4to7Pos); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[3][i] = m1[2][i] - m1[3][i] - //m2[3][i] = m3[0][i] - m3[2][i] - (m3[1][i] - m3[3][i]) - //m2[3][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) - (m2[1][i] + m2[5][i] - m2[3][i] - m2[7][i]) - //m2[3][i] = m2[0][i] - m2[1][i] - m2[2][i] + m2[3][i] + m2[4][i] - m2[5][i] - m2[6][i] + m2[7][i] - //m2[3][i] = m2[0][i] - m2[1][i] - (m2[2][i] - m2[3][i]) + (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) - s9 = _mm_add_epi16(diff0to3Neg, diff4to7Neg); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[4][i] = m1[4][i] + m1[5][i] - //m2[4][i] = m3[4][i] + m3[6][i] + m3[5][i] + m3[7][i] - //m2[4][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] + m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i] - //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - m2[4][i] - m2[5][i] - m2[6][i] - m2[7][i] - //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - ( (m2[4][i] + m2[5][i]) + (m2[6][i] + m2[7][i]) ) - s9 = _mm_sub_epi16(sum0to3Pos, sum4to7Pos); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[5][i] = m1[4][i] - m1[5][i] - //m2[5][i] = m3[4][i] + m3[6][i] - (m3[5][i] + m3[7][i]) - //m2[5][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] - (m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i]) - //m2[5][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] - m2[4][i] + m2[5][i] - m2[6][i] + m2[7][i] - //m2[5][i] = m2[0][i] - m2[1][i] + (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) + (m2[6][i] - m2[7][i]) ) - s9 = _mm_sub_epi16(sum0to3Neg, sum4to7Neg); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[6][i] = m1[6][i] + m1[7][i] - //m2[6][i] = m3[4][i] - m3[6][i] + m3[5][i] - m3[7][i] - //m2[6][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) + m2[1][i] - m2[5][i] - (m2[3][i] - m2[7][i]) - //m2[6][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] - m2[4][i] - m2[5][i] + m2[6][i] + m2[7][i] - //m2[6][i] = (m2[0][i] + m2[1][i]) - (m2[2][i] + m2[3][i]) - ( (m2[4][i] + m2[5][i]) - (m2[6][i] + m2[7][i]) ) - s9 = _mm_sub_epi16(diff0to3Pos, diff4to7Pos); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - //m2[7][i] = m1[6][i] - m1[7][i] - //m2[7][i] = m3[4][i] - m3[6][i] - (m3[5][i] - m3[7][i]) - //m2[7][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) - ((m2[1][i] - m2[5][i]) - (m2[3][i] - m2[7][i])) - //m2[7][i] = (m2[0][i] - m2[1][i]) - (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) ) - s9 = _mm_sub_epi16(diff0to3Neg, diff4to7Neg); - s9 = _mm_abs_epi16(s9); - s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); - s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); - s10 = _mm_add_epi32(s10, s11); - s10 = _mm_hadd_epi32(s10, s8); - s10 = _mm_hadd_epi32(s10, s8); - s12 = _mm_add_epi32(s10, s12); - - satdBlock8x8 = (EB_U64)_mm_extract_epi32(s12, 0); - - satdBlock8x8 = ((satdBlock8x8 + 2) >> 2); - - return satdBlock8x8; + EB_U64 satdBlock8x8 = 0; + EB_S16 m2[8][8]; + + EB_U32 j; + __m128i s0, s1, s2, s3, s4, s5, s6, s7, s9, s10, s11, s12; + __m128i s8 = _mm_setzero_si128(); + __m128i sum01Neg, sum01Pos, sum23Neg, sum23Pos, sum45Neg, sum45Pos, sum67Neg, sum67Pos; + __m128i sum0to3Pos, sum4to7Pos, sum0to3Neg, sum4to7Neg, diff0to3Pos, diff4to7Pos, diff0to3Neg, diff4to7Neg; + __m128i sum0, sum1, difference0, difference1; + + for (j = 0; j < 8; j += 2) + { + s0 = _mm_loadl_epi64((__m128i*)(src + (j *srcStride))); + s10 = _mm_loadl_epi64((__m128i*)(src + ((j + 1) *srcStride))); + s10 = _mm_unpacklo_epi8(s10, _mm_setzero_si128()); + s0 = _mm_unpacklo_epi8(s0, _mm_setzero_si128()); + + sum0 = _mm_hadd_epi16(s0, s8); + sum1 = _mm_hadd_epi16(s10, s8); + + difference0 = _mm_hsub_epi16(s0, s8); + difference1 = _mm_hsub_epi16(s10, s8); + + // m2[j][0] + // diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] + diff[jj + 1] + diff[jj + 5] + diff[jj + 3] + diff[jj + 7] + // diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] + diff[jj + 4] + diff[jj + 5] + diff[jj + 6] + diff[jj + 7] + s1 = _mm_hadd_epi16(sum0, sum1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][0] = _mm_extract_epi16(s1, 0); + m2[j + 1][0] = _mm_extract_epi16(s1, 2); + + + //m2[j][1] + //diff[jj] + diff[jj + 4] + diff[jj + 2] + diff[jj + 6] - diff[jj + 1] - diff[jj + 5] - diff[jj + 3] - diff[jj + 7] + //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] + diff[jj + 4] - diff[jj + 5] + diff[jj + 6] - diff[jj + 7] + //(diff[jj] - diff[jj + 1]) + (diff[jj + 2] - diff[jj + 3]) + (diff[jj + 4] - diff[jj + 5]) + (diff[jj + 6] - diff[jj + 7]) + s1 = _mm_hadd_epi16(difference0, difference1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][1] = _mm_extract_epi16(s1, 0); + m2[j + 1][1] = _mm_extract_epi16(s1, 2); + + //m2[j][2] + //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] + diff[jj + 1] + diff[jj + 5] - diff[jj + 3] - diff[jj + 7] + //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] + diff[jj + 4] + diff[jj + 5] - diff[jj + 6] - diff[jj + 7] + s1 = _mm_hsub_epi16(sum0, sum1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][2] = _mm_extract_epi16(s1, 0); + m2[j + 1][2] = _mm_extract_epi16(s1, 2); + + //m2[j][3] + //diff[jj] + diff[jj + 4] - diff[jj + 2] - diff[jj + 6] - diff[jj + 1] - diff[jj + 5] + diff[jj + 3] + diff[jj + 7] + //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] + //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] + diff[jj + 4] - diff[jj + 5] - diff[jj + 6] + diff[jj + 7] + s1 = _mm_hsub_epi16(difference0, difference1); + s1 = _mm_hadd_epi16(s1, s8); + m2[j][3] = _mm_extract_epi16(s1, 0); + m2[j + 1][3] = _mm_extract_epi16(s1, 2); + + //m2[j][4] + //diff[jj] - diff[jj + 4] + diff[jj + 2] - diff[jj + 6] + diff[jj + 1] - diff[jj + 5] + diff[jj + 3] - diff[jj + 7] + //diff[jj] + diff[jj + 1] + diff[jj + 2] + diff[jj + 3] - diff[jj + 4] - diff[jj + 5] - diff[jj + 6] - diff[jj + 7] + s1 = _mm_hadd_epi16(sum0, sum1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][4] = _mm_extract_epi16(s1, 0); + m2[j + 1][4] = _mm_extract_epi16(s1, 2); + + //m2[j][5] + //m1[j][4] - m1[j][5] + //diff[jj] - diff[jj + 1] + diff[jj + 2] - diff[jj + 3] - diff[jj + 4] + diff[jj + 5] - diff[jj + 6] + diff[jj + 7] + s1 = _mm_hadd_epi16(difference0, difference1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][5] = _mm_extract_epi16(s1, 0); + m2[j + 1][5] = _mm_extract_epi16(s1, 2); + + //m2[j][6] + //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] + diff[jj + 1] - diff[jj + 5] - diff[jj + 3] + diff[jj + 7] + //diff[jj] + diff[jj + 1] - diff[jj + 2] - diff[jj + 3] - diff[jj + 4] - diff[jj + 5] + diff[jj + 6] + diff[jj + 7] + + s1 = _mm_hsub_epi16(sum0, sum1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][6] = _mm_extract_epi16(s1, 0); + m2[j + 1][6] = _mm_extract_epi16(s1, 2); + + //m2[j][7] + //diff[jj] - diff[jj + 4] - diff[jj + 2] + diff[jj + 6] - diff[jj + 1] + diff[jj + 5] + diff[jj + 3] - diff[jj + 7] + //diff[jj] - diff[jj + 1] - diff[jj + 2] + diff[jj + 3] - diff[jj + 4] + diff[jj + 5] + diff[jj + 6] - diff[jj + 7] + s1 = _mm_hsub_epi16(difference0, difference1); + s1 = _mm_hsub_epi16(s1, s8); + m2[j][7] = _mm_extract_epi16(s1, 0); + m2[j + 1][7] = _mm_extract_epi16(s1, 2); + } + + // Vertical + s0 = _mm_loadu_si128((__m128i*)(m2[0])); + s1 = _mm_loadu_si128((__m128i*)(m2[1])); + s2 = _mm_loadu_si128((__m128i*)(m2[2])); + s3 = _mm_loadu_si128((__m128i*)(m2[3])); + s4 = _mm_loadu_si128((__m128i*)(m2[4])); + s5 = _mm_loadu_si128((__m128i*)(m2[5])); + s6 = _mm_loadu_si128((__m128i*)(m2[6])); + s7 = _mm_loadu_si128((__m128i*)(m2[7])); + + sum01Pos = _mm_add_epi16(s0, s1); + sum23Pos = _mm_add_epi16(s2, s3); + sum45Pos = _mm_add_epi16(s4, s5); + sum67Pos = _mm_add_epi16(s6, s7); + + sum01Neg = _mm_sub_epi16(s0, s1); + sum23Neg = _mm_sub_epi16(s2, s3); + sum45Neg = _mm_sub_epi16(s4, s5); + sum67Neg = _mm_sub_epi16(s6, s7); + + sum0to3Pos = _mm_add_epi16(sum01Pos, sum23Pos); + sum4to7Pos = _mm_add_epi16(sum45Pos, sum67Pos); + diff0to3Pos = _mm_sub_epi16(sum01Pos, sum23Pos); + diff4to7Pos = _mm_sub_epi16(sum45Pos, sum67Pos); + + sum0to3Neg = _mm_add_epi16(sum01Neg, sum23Neg); + sum4to7Neg = _mm_add_epi16(sum45Neg, sum67Neg); + diff0to3Neg = _mm_sub_epi16(sum01Neg, sum23Neg); + diff4to7Neg = _mm_sub_epi16(sum45Neg, sum67Neg); + + //m2[0][i] = m1[0][i] + m1[1][i] + //m2[0][i] = m3[0][i] + m3[2][i] + m3[1][i] + m3[3][i] + //m2[0][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] + m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i] + //m2[0][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] + m2[4][i] + m2[5][i] + m2[6][i] + m2[7][i] + s9 = _mm_add_epi16(sum0to3Pos, sum4to7Pos); + s9 = _mm_abs_epi16(s9); + *dcValue += _mm_extract_epi16(s9, 0); + + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + + + //m2[1][i] = m1[0][i] - m1[1][i] + //m2[1][i] = m3[0][i] + m3[2][i] -(m3[1][i] + m3[3][i]) + //m2[1][i] = m2[0][i] + m2[4][i] + m2[2][i] + m2[6][i] -(m2[1][i] + m2[5][i] + m2[3][i] + m2[7][i]) + //m2[1][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] + m2[4][i] - m2[5][i] + m2[6][i] - m2[7][i] + s9 = _mm_add_epi16(sum0to3Neg, sum4to7Neg); + s9 = _mm_abs_epi16(s9); + s12 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s12 = _mm_add_epi32(s12, s11); + s12 = _mm_hadd_epi32(s12, s8); + s12 = _mm_hadd_epi32(s12, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[2][i] = m1[2][i] + m1[3][i] + //m2[2][i] = m3[0][i] - m3[2][i] + m3[1][i] - m3[3][i] + //m2[2][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) + m2[1][i] + m2[5][i] - (m2[3][i] + m2[7][i]) + //m2[2][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] + m2[4][i] + m2[5][i] - m2[6][i] - m2[7][i] + //m2[2][i] = m2[0][i] + m2[1][i] - (m2[2][i] + m2[3][i]) + m2[4][i] + m2[5][i] - (m2[6][i] + m2[7][i]) + s9 = _mm_add_epi16(diff0to3Pos, diff4to7Pos); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[3][i] = m1[2][i] - m1[3][i] + //m2[3][i] = m3[0][i] - m3[2][i] - (m3[1][i] - m3[3][i]) + //m2[3][i] = m2[0][i] + m2[4][i] - (m2[2][i] + m2[6][i]) - (m2[1][i] + m2[5][i] - m2[3][i] - m2[7][i]) + //m2[3][i] = m2[0][i] - m2[1][i] - m2[2][i] + m2[3][i] + m2[4][i] - m2[5][i] - m2[6][i] + m2[7][i] + //m2[3][i] = m2[0][i] - m2[1][i] - (m2[2][i] - m2[3][i]) + (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) + s9 = _mm_add_epi16(diff0to3Neg, diff4to7Neg); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[4][i] = m1[4][i] + m1[5][i] + //m2[4][i] = m3[4][i] + m3[6][i] + m3[5][i] + m3[7][i] + //m2[4][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] + m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i] + //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - m2[4][i] - m2[5][i] - m2[6][i] - m2[7][i] + //m2[4][i] = m2[0][i] + m2[1][i] + m2[2][i] + m2[3][i] - ( (m2[4][i] + m2[5][i]) + (m2[6][i] + m2[7][i]) ) + s9 = _mm_sub_epi16(sum0to3Pos, sum4to7Pos); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[5][i] = m1[4][i] - m1[5][i] + //m2[5][i] = m3[4][i] + m3[6][i] - (m3[5][i] + m3[7][i]) + //m2[5][i] = m2[0][i] - m2[4][i] + m2[2][i] - m2[6][i] - (m2[1][i] - m2[5][i] + m2[3][i] - m2[7][i]) + //m2[5][i] = m2[0][i] - m2[1][i] + m2[2][i] - m2[3][i] - m2[4][i] + m2[5][i] - m2[6][i] + m2[7][i] + //m2[5][i] = m2[0][i] - m2[1][i] + (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) + (m2[6][i] - m2[7][i]) ) + s9 = _mm_sub_epi16(sum0to3Neg, sum4to7Neg); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[6][i] = m1[6][i] + m1[7][i] + //m2[6][i] = m3[4][i] - m3[6][i] + m3[5][i] - m3[7][i] + //m2[6][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) + m2[1][i] - m2[5][i] - (m2[3][i] - m2[7][i]) + //m2[6][i] = m2[0][i] + m2[1][i] - m2[2][i] - m2[3][i] - m2[4][i] - m2[5][i] + m2[6][i] + m2[7][i] + //m2[6][i] = (m2[0][i] + m2[1][i]) - (m2[2][i] + m2[3][i]) - ( (m2[4][i] + m2[5][i]) - (m2[6][i] + m2[7][i]) ) + s9 = _mm_sub_epi16(diff0to3Pos, diff4to7Pos); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + //m2[7][i] = m1[6][i] - m1[7][i] + //m2[7][i] = m3[4][i] - m3[6][i] - (m3[5][i] - m3[7][i]) + //m2[7][i] = m2[0][i] - m2[4][i] - (m2[2][i] - m2[6][i]) - ((m2[1][i] - m2[5][i]) - (m2[3][i] - m2[7][i])) + //m2[7][i] = (m2[0][i] - m2[1][i]) - (m2[2][i] - m2[3][i]) - ( (m2[4][i] - m2[5][i]) - (m2[6][i] - m2[7][i]) ) + s9 = _mm_sub_epi16(diff0to3Neg, diff4to7Neg); + s9 = _mm_abs_epi16(s9); + s10 = _mm_unpacklo_epi16(s9, _mm_setzero_si128()); + s11 = _mm_unpackhi_epi16(s9, _mm_setzero_si128()); + s10 = _mm_add_epi32(s10, s11); + s10 = _mm_hadd_epi32(s10, s8); + s10 = _mm_hadd_epi32(s10, s8); + s12 = _mm_add_epi32(s10, s12); + + satdBlock8x8 = (EB_U64)_mm_extract_epi32(s12, 0); + + satdBlock8x8 = ((satdBlock8x8 + 2) >> 2); + + return satdBlock8x8; } EB_U64 SpatialFullDistortionKernel4x4_SSSE3_INTRIN( diff --git a/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h b/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h index 0851637a3..c8968cdc0 100644 --- a/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h +++ b/Source/Lib/ASM_SSE4_1/EbPictureOperators_SSE4_1.h @@ -16,9 +16,9 @@ EB_U64 Compute8x8Satd_SSE4( EB_S16 *diff); // input parameter, diff samples Ptr EB_U64 Compute8x8Satd_U8_SSE4( - EB_U8 *src, // input parameter, diff samples Ptr - EB_U64 *dcValue, - EB_U32 srcStride); + EB_U8 *src, // input parameter, diff samples Ptr + EB_U64 *dcValue, + EB_U32 srcStride); EB_U64 SpatialFullDistortionKernel4x4_SSSE3_INTRIN( EB_U8 *input, diff --git a/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c b/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c index 46a0a68e1..7157bb5c2 100644 --- a/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c +++ b/Source/Lib/ASM_SSE4_1/EbTransforms_Intrinsic_SSE4_1.c @@ -97,7 +97,7 @@ void Transform8x8_SSE4_1_INTRIN( xmm_temp5 = _mm_srai_epi32(xmm_temp5, SHIFT);\ xmm_temp1 = _mm_packs_epi32(xmm_temp1, xmm_temp5);\ _mm_storeu_si128((__m128i *)(transformCoefficients+OFST5), xmm_temp1); - + __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans4, xmm_trans5, xmm_trans6, xmm_trans7; @@ -126,7 +126,7 @@ void Transform8x8_SSE4_1_INTRIN( MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) - + // TransformCoefficients 0, 2, 4, 6 xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); @@ -136,14 +136,14 @@ void Transform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); - xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); + xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); xmm_trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36_N83)),_mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36_N83)),_mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); - + // TransformCoefficients 1, 3, 5, 7 xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); @@ -170,7 +170,7 @@ void Transform8x8_SSE4_1_INTRIN( xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - + xmm_res0H = _mm_unpacklo_epi16(xmm_trans4, _mm_srai_epi16(xmm_trans4, 15)); xmm_res1H = _mm_unpackhi_epi16(xmm_trans4, _mm_srai_epi16(xmm_trans4, 15)); xmm_res2H = _mm_unpacklo_epi16(xmm_trans46_hi, _mm_srai_epi16(xmm_trans46_hi, 15)); @@ -197,18 +197,18 @@ void Transform8x8_SSE4_1_INTRIN( xmm_odd2H = _mm_sub_epi32(xmm_res2H, xmm_res5H); xmm_even3H = _mm_add_epi32(xmm_res3H, xmm_res4H); xmm_odd3H = _mm_sub_epi32(xmm_res3H, xmm_res4H); - + // TransformCoefficients 0, 4 xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); - + xmm_evenEven0H = _mm_add_epi32(xmm_even0H, xmm_even3H); xmm_evenEven1H = _mm_add_epi32(xmm_even1H, xmm_even2H); xmm_evenOdd0H = _mm_sub_epi32(xmm_even0H, xmm_even3H); xmm_evenOdd1H = _mm_sub_epi32(xmm_even1H, xmm_even2H); - + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); @@ -230,23 +230,23 @@ void Transform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), xmm_offset), 9), _mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd0H), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1H)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1H)), xmm_offset), 9)); _mm_storeu_si128((__m128i *)(transformCoefficients + 2 * dstStride), xmm_trans2); xmm_trans6 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_sub_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1L)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1L)), xmm_offset), 9), _mm_srai_epi32(_mm_add_epi32(_mm_sub_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd0H), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1H)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd1H)), xmm_offset), 9)); _mm_storeu_si128((__m128i *)(transformCoefficients + 6 * dstStride), xmm_trans6); - + // Transform Coefficients 1, 3, 5, 7 MACRO_TRANS_4MAC_PMULLD(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_odd0H, xmm_odd1H, xmm_odd2H, xmm_odd3H, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89, OFFSET_75, OFFSET_50, OFFSET_18, add_epi32, add_epi32, add_epi32, 9, dstStride) @@ -352,7 +352,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_temp5 = _mm_srai_epi32(xmm_temp5, SHIFT);\ xmm_temp1 = _mm_packs_epi32(xmm_temp1, xmm_temp5);\ _mm_storeu_si128((__m128i *)(transformCoefficients+OFST5), xmm_temp1); - + __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3; @@ -383,7 +383,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) - + // TransformCoefficients 0, 2, 4, 6 xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); @@ -393,12 +393,12 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); - //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); + //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)),_mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); - + // TransformCoefficients 1, 3, 5, 7 xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); @@ -431,7 +431,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - + xmm_even0L = _mm_add_epi32(xmm_res0L, xmm_res7L); xmm_odd0L = _mm_sub_epi32(xmm_res0L, xmm_res7L); @@ -441,13 +441,13 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_odd2L = _mm_sub_epi32(xmm_res2L, xmm_res5L); xmm_even3L = _mm_add_epi32(xmm_res3L, xmm_res4L); xmm_odd3L = _mm_sub_epi32(xmm_res3L, xmm_res4L); - + // TransformCoefficients 0, 4 xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); - + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); @@ -459,7 +459,7 @@ void PfreqTransform8x8_SSE4_1_INTRIN( xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)),xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)),xmm_evenOdd1L)), xmm_offset), 9), xmm_junk); @@ -474,12 +474,12 @@ void PfreqTransform8x8_SSE4_1_INTRIN( } void PfreqN4Transform8x8_SSE4_1_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { #define OFFSET_2 0 #define OFFSET_4 (8+OFFSET_2) @@ -567,57 +567,57 @@ void PfreqN4Transform8x8_SSE4_1_INTRIN( xmm_temp1 = _mm_packs_epi32(xmm_temp1, xmm_temp5);\ _mm_storeu_si128((__m128i *)(transformCoefficients+OFST5), xmm_temp1); - __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; - __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; - __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3; - __m128i xmm_trans0_lo/*, xmm_trans4_lo, xmm_trans0_hi, xmm_trans4_hi*/; - __m128i xmm_even0, xmm_even1, xmm_even2, xmm_even3, xmm_odd0, xmm_odd1, xmm_odd2, xmm_odd3, xmm_evenEven0, xmm_evenEven1, xmm_evenOdd0, xmm_evenOdd1; - __m128i xmm_even0L, xmm_even1L, xmm_even2L, xmm_even3L, xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_evenEven0L, xmm_evenEven1L, xmm_evenOdd0L, xmm_evenOdd1L; - __m128i xmm_offset, xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi; - __m128i xmm_trans01_hi, xmm_trans23_hi, /*xmm_trans45_hi,*/ /*xmm_trans67_hi, */xmm_trans02_hi, xmm_trans01234_hi/*, xmm_trans46_hi, xmm_trans4567_hi*/; - __m128i xmm_res0L, xmm_res1L, xmm_res2L, xmm_res3L, xmm_res4L, xmm_res5L, xmm_res6L, xmm_res7L; - __m128i xmm_temp1, xmm_temp3/*, xmm_temp5, xmm_temp7*/; + __m128i xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi; + __m128i xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res46_hi, xmm_res0123_hi, xmm_res4567_hi; + __m128i xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3; + __m128i xmm_trans0_lo/*, xmm_trans4_lo, xmm_trans0_hi, xmm_trans4_hi*/; + __m128i xmm_even0, xmm_even1, xmm_even2, xmm_even3, xmm_odd0, xmm_odd1, xmm_odd2, xmm_odd3, xmm_evenEven0, xmm_evenEven1, xmm_evenOdd0, xmm_evenOdd1; + __m128i xmm_even0L, xmm_even1L, xmm_even2L, xmm_even3L, xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_evenEven0L, xmm_evenEven1L, xmm_evenOdd0L, xmm_evenOdd1L; + __m128i xmm_offset, xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi; + __m128i xmm_trans01_hi, xmm_trans23_hi, /*xmm_trans45_hi,*/ /*xmm_trans67_hi, */xmm_trans02_hi, xmm_trans01234_hi/*, xmm_trans46_hi, xmm_trans4567_hi*/; + __m128i xmm_res0L, xmm_res1L, xmm_res2L, xmm_res3L, xmm_res4L, xmm_res5L, xmm_res6L, xmm_res7L; + __m128i xmm_temp1, xmm_temp3/*, xmm_temp5, xmm_temp7*/; - __m128i xmm_junk = _mm_setzero_si128(); //set to zero to avoid valgrind issue + __m128i xmm_junk = _mm_setzero_si128(); //set to zero to avoid valgrind issue - xmm_res0 = _mm_loadu_si128((__m128i *)(residual)); - xmm_res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - xmm_res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - xmm_res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - residual += 4 * srcStride; - xmm_res4 = _mm_loadu_si128((__m128i *)(residual)); - xmm_res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); - xmm_res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); - xmm_res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + xmm_res0 = _mm_loadu_si128((__m128i *)(residual)); + xmm_res1 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + xmm_res2 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + xmm_res3 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); + residual += 4 * srcStride; + xmm_res4 = _mm_loadu_si128((__m128i *)(residual)); + xmm_res5 = _mm_loadu_si128((__m128i *)(residual + srcStride)); + xmm_res6 = _mm_loadu_si128((__m128i *)(residual + 2 * srcStride)); + xmm_res7 = _mm_loadu_si128((__m128i *)(residual + 3 * srcStride)); - MACRO_UNPACK(16, xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi) - MACRO_UNPACK(32, xmm_res0, xmm_res2, xmm_res01_hi, xmm_res23_hi, xmm_res4, xmm_res6, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res0123_hi, xmm_res46_hi, xmm_res4567_hi) - MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) + MACRO_UNPACK(16, xmm_res0, xmm_res1, xmm_res2, xmm_res3, xmm_res4, xmm_res5, xmm_res6, xmm_res7, xmm_res01_hi, xmm_res23_hi, xmm_res45_hi, xmm_res67_hi) + MACRO_UNPACK(32, xmm_res0, xmm_res2, xmm_res01_hi, xmm_res23_hi, xmm_res4, xmm_res6, xmm_res45_hi, xmm_res67_hi, xmm_res02_hi, xmm_res0123_hi, xmm_res46_hi, xmm_res4567_hi) + MACRO_UNPACK(64, xmm_res0, xmm_res4, xmm_res02_hi, xmm_res46_hi, xmm_res01_hi, xmm_res45_hi, xmm_res0123_hi, xmm_res4567_hi, xmm_res04_hi, xmm_res0246_hi, xmm_res0145_hi, xmm_res_1to7_hi) - MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) + MACRO_CALC_EVEN_ODD(xmm_res0, xmm_res04_hi, xmm_res02_hi, xmm_res0246_hi, xmm_res01_hi, xmm_res0145_hi, xmm_res0123_hi, xmm_res_1to7_hi) - // TransformCoefficients 0, 2, 4, 6 - xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); - xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); - xmm_evenOdd0 = _mm_sub_epi16(xmm_even0, xmm_even3); - xmm_evenOdd1 = _mm_sub_epi16(xmm_even1, xmm_even2); + // TransformCoefficients 0, 2, 4, 6 + xmm_evenEven0 = _mm_add_epi16(xmm_even0, xmm_even3); + xmm_evenEven1 = _mm_add_epi16(xmm_even1, xmm_even2); + xmm_evenOdd0 = _mm_sub_epi16(xmm_even0, xmm_even3); + xmm_evenOdd1 = _mm_sub_epi16(xmm_even1, xmm_even2); - xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_2)); - xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); - //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); + xmm_trans0 = _mm_slli_epi16(_mm_add_epi16(xmm_evenEven0, xmm_evenEven1), 4); + //xmm_trans4 = _mm_slli_epi16(_mm_sub_epi16(xmm_evenEven0, xmm_evenEven1), 4); - xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), - _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); + xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpacklo_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2), + _mm_srai_epi32(_mm_add_epi32(_mm_madd_epi16(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83_36)), _mm_unpackhi_epi16(xmm_evenOdd0, xmm_evenOdd1)), xmm_offset), 2)); - // TransformCoefficients 1, 3, 5, 7 - xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); - xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); - xmm_odd23_lo = _mm_unpacklo_epi16(xmm_odd2, xmm_odd3); - xmm_odd23_hi = _mm_unpackhi_epi16(xmm_odd2, xmm_odd3); + // TransformCoefficients 1, 3, 5, 7 + xmm_odd01_lo = _mm_unpacklo_epi16(xmm_odd0, xmm_odd1); + xmm_odd01_hi = _mm_unpackhi_epi16(xmm_odd0, xmm_odd1); + xmm_odd23_lo = _mm_unpacklo_epi16(xmm_odd2, xmm_odd3); + xmm_odd23_hi = _mm_unpackhi_epi16(xmm_odd2, xmm_odd3); - MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans1, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89_75, OFFSET_50_18, 2) - MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans3, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75_N18, OFFSET_N89_N50, 2) + MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans1, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89_75, OFFSET_50_18, 2) + MACRO_TRANS_4MAC_NO_SAVE(xmm_odd01_lo, xmm_odd01_hi, xmm_odd23_lo, xmm_odd23_hi, xmm_trans3, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75_N18, OFFSET_N89_N50, 2) #define MACRO_UNPACK_PF(ARG1, ARG2, ARG3, ARG4, ARG5, ARG10, ARG11)\ @@ -630,60 +630,60 @@ void PfreqN4Transform8x8_SSE4_1_INTRIN( /*ARG13 = _mm_unpackhi_epi##ARG1(ARG8, ARG9);*/\ /*ARG8 = _mm_unpacklo_epi##ARG1(ARG8, ARG9);*/ - MACRO_UNPACK_PF(16, xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans01_hi, xmm_trans23_hi) - MACRO_UNPACK_PF(32, xmm_trans0, xmm_trans2, xmm_trans01_hi, xmm_trans23_hi, xmm_trans02_hi, xmm_trans01234_hi) + MACRO_UNPACK_PF(16, xmm_trans0, xmm_trans1, xmm_trans2, xmm_trans3, xmm_trans01_hi, xmm_trans23_hi) + MACRO_UNPACK_PF(32, xmm_trans0, xmm_trans2, xmm_trans01_hi, xmm_trans23_hi, xmm_trans02_hi, xmm_trans01234_hi) - //---- Second Partial Butterfly ---- + //---- Second Partial Butterfly ---- - // Calculate low and high - xmm_res0L = _mm_unpacklo_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); - xmm_res1L = _mm_unpackhi_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); - xmm_res2L = _mm_unpacklo_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); - xmm_res3L = _mm_unpackhi_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); - xmm_res4L = _mm_unpacklo_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); - xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); - xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); + // Calculate low and high + xmm_res0L = _mm_unpacklo_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); + xmm_res1L = _mm_unpackhi_epi16(xmm_trans0, _mm_srai_epi16(xmm_trans0, 15)); + xmm_res2L = _mm_unpacklo_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); + xmm_res3L = _mm_unpackhi_epi16(xmm_trans02_hi, _mm_srai_epi16(xmm_trans02_hi, 15)); + xmm_res4L = _mm_unpacklo_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); + xmm_res5L = _mm_unpackhi_epi16(xmm_trans01_hi, _mm_srai_epi16(xmm_trans01_hi, 15)); + xmm_res6L = _mm_unpacklo_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); + xmm_res7L = _mm_unpackhi_epi16(xmm_trans01234_hi, _mm_srai_epi16(xmm_trans01234_hi, 15)); - xmm_even0L = _mm_add_epi32(xmm_res0L, xmm_res7L); - xmm_odd0L = _mm_sub_epi32(xmm_res0L, xmm_res7L); - xmm_even1L = _mm_add_epi32(xmm_res1L, xmm_res6L); - xmm_odd1L = _mm_sub_epi32(xmm_res1L, xmm_res6L); - xmm_even2L = _mm_add_epi32(xmm_res2L, xmm_res5L); - xmm_odd2L = _mm_sub_epi32(xmm_res2L, xmm_res5L); - xmm_even3L = _mm_add_epi32(xmm_res3L, xmm_res4L); - xmm_odd3L = _mm_sub_epi32(xmm_res3L, xmm_res4L); + xmm_even0L = _mm_add_epi32(xmm_res0L, xmm_res7L); + xmm_odd0L = _mm_sub_epi32(xmm_res0L, xmm_res7L); + xmm_even1L = _mm_add_epi32(xmm_res1L, xmm_res6L); + xmm_odd1L = _mm_sub_epi32(xmm_res1L, xmm_res6L); + xmm_even2L = _mm_add_epi32(xmm_res2L, xmm_res5L); + xmm_odd2L = _mm_sub_epi32(xmm_res2L, xmm_res5L); + xmm_even3L = _mm_add_epi32(xmm_res3L, xmm_res4L); + xmm_odd3L = _mm_sub_epi32(xmm_res3L, xmm_res4L); - // TransformCoefficients 0, 4 - xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); - xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); - xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); - xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); + // TransformCoefficients 0, 4 + xmm_evenEven0L = _mm_add_epi32(xmm_even0L, xmm_even3L); + xmm_evenEven1L = _mm_add_epi32(xmm_even1L, xmm_even2L); + xmm_evenOdd0L = _mm_sub_epi32(xmm_even0L, xmm_even3L); + xmm_evenOdd1L = _mm_sub_epi32(xmm_even1L, xmm_even2L); - xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_4)); - xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); - xmm_trans0_lo = _mm_packs_epi32(xmm_trans0_lo, xmm_trans0_lo); + xmm_trans0_lo = _mm_srai_epi32(_mm_add_epi32(xmm_offset, _mm_add_epi32(xmm_evenEven0L, xmm_evenEven1L)), 3); + xmm_trans0_lo = _mm_packs_epi32(xmm_trans0_lo, xmm_trans0_lo); - _mm_storel_epi64((__m128i *)(transformCoefficients), xmm_trans0_lo); + _mm_storel_epi64((__m128i *)(transformCoefficients), xmm_trans0_lo); - // TransformCoefficients 2, 6 - xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); + // TransformCoefficients 2, 6 + xmm_offset = _mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_256)); - xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)), xmm_evenOdd0L), - _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)), xmm_evenOdd1L)), - xmm_offset), 9), + xmm_trans2 = _mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(_mm_add_epi32(_mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_83)), xmm_evenOdd0L), + _mm_mullo_epi32(_mm_load_si128((__m128i *)(TransformAsmConst_SSE4_1 + OFFSET_36)), xmm_evenOdd1L)), + xmm_offset), 9), - xmm_junk); + xmm_junk); - _mm_storeu_si128((__m128i *)(transformCoefficients + 2 * dstStride), xmm_trans2); + _mm_storeu_si128((__m128i *)(transformCoefficients + 2 * dstStride), xmm_trans2); - MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89, OFFSET_75, OFFSET_50, OFFSET_18, add_epi32, add_epi32, add_epi32, 9, dstStride) - MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75, OFFSET_18, OFFSET_89, OFFSET_50, sub_epi32, add_epi32, sub_epi32, 9, 3 * dstStride) + MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_89, OFFSET_75, OFFSET_50, OFFSET_18, add_epi32, add_epi32, add_epi32, 9, dstStride) + MACRO_TRANS_4MAC_PMULLD_PF(xmm_odd0L, xmm_odd1L, xmm_odd2L, xmm_odd3L, xmm_junk, xmm_junk, xmm_junk, xmm_junk, xmm_offset, TransformAsmConst_SSE4_1, OFFSET_75, OFFSET_18, OFFSET_89, OFFSET_50, sub_epi32, add_epi32, sub_epi32, 9, 3 * dstStride) - (void)bitIncrement; - (void)transformInnerArrayPtr; + (void)bitIncrement; + (void)transformInnerArrayPtr; } diff --git a/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h b/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h index bea33f205..a28b014bc 100644 --- a/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h +++ b/Source/Lib/ASM_SSE4_1/EbTransforms_SSE4_1.h @@ -27,12 +27,12 @@ extern void PfreqTransform8x8_SSE4_1_INTRIN( EB_S16 *transformInnerArrayPtr, EB_U32 bitIncrement); extern void PfreqN4Transform8x8_SSE4_1_INTRIN( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement); + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c index 3c9775379..0314dc7dd 100644 --- a/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbAvcStyleMcp_Intrinsic_SSSE3.c @@ -22,13 +22,13 @@ EB_EXTERN EB_ALIGN(16) const EB_S8 EbHevcAvcStyleLumaIFCoeff8_SSSE3[]= { void PictureCopyKernel_SSSE3( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight, - EB_U32 bytesPerSample); + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight, + EB_U32 bytesPerSample); void AvcStyleLumaInterpolationFilterHorizontal_SSSE3_INTRIN( EB_BYTE refPic, diff --git a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c index e4bde2413..430684d8b 100644 --- a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_Intrinsic_SSSE3.c @@ -12,13 +12,13 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( - EB_U8 *edgeStartSample, - EB_U32 reconLumaPicStride, - EB_BOOL isVerticalEdge, - EB_S32 tc, - EB_S32 beta) + EB_U8 *edgeStartSample, + EB_U32 reconLumaPicStride, + EB_BOOL isVerticalEdge, + EB_S32 tc, + EB_S32 beta) { - + __m128i x0, x1, x2, x3; __m128i d; __m128i e; @@ -76,23 +76,23 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( x3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); } - - + + // x0: p3 q3 // x1: p2 q2 // x2: p1 q1 // x3: p0 q0 - + // d: dp0 in lane 0, dp3 in lane 3, dq0 in lane 4, dq3 in lane 7 - + d = _mm_sub_epi16(x1, x2); d = _mm_sub_epi16(d, x2); d = _mm_add_epi16(d, x3); - + // Absolute value d = _mm_abs_epi16(d); - + // Need sum of lanes 0, 3, 4, 7 // e: d0=dp0+dq0 in lanes 0 and 4, d3=dp3+dq3 in lanes 3 and 7 e = _mm_add_epi16(d, _mm_shuffle_epi32(d, 0x4e)); // 0x4e = 01001110 @@ -100,49 +100,49 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( { return; } - + d32 = d; d32 = _mm_shufflelo_epi16(d32, 0xcc); // 0xcc = 11001100 d32 = _mm_shufflehi_epi16(d32, 0xcc); d32 = _mm_madd_epi16(d32, _mm_set1_epi16(1)); // d: dp=dp0+dp3 in lanes 0 and 1, dq=dq0+dq3 in lanes 2 and 3 (note: 32-bit lanes) - + tm = 0; tm += tc; tm += tc << 16; tcx = _mm_cvtsi32_si128(tm); tcx = _mm_unpacklo_epi16(tcx, tcx); tcx = _mm_shuffle_epi32(tcx, 0x50); // 01010000 - + x3r = _mm_shuffle_epi32(x3, 0x4e); // 0x4e = 01001110 (swap 64-bit lanes) f0 = _mm_max_epi16(_mm_sub_epi16(x0, x3), _mm_sub_epi16(x3, x0)); f0 = _mm_add_epi16(f0, _mm_shuffle_epi32(f0, 0x4e)); f0 = _mm_cmplt_epi16(f0, _mm_set1_epi16((short)(beta>>3))); - + f1 = _mm_max_epi16(_mm_sub_epi16(x3, x3r), _mm_sub_epi16(x3r, x3)); f1 = _mm_cmplt_epi16(f1, _mm_set1_epi16((short)((5*tc+1)>>1))); - + f2 = _mm_cmplt_epi16(_mm_add_epi16(e, e), _mm_set1_epi16((short)(beta >> 2))); - + f0 = _mm_and_si128(f0, f1); f0 = _mm_and_si128(f0, f2); - - + + y0 = x0; y1 = x1; y2 = x2; y3 = x3; strongFilter = (_mm_movemask_epi8(f0) & 0xc3) == 0xc3; - + if (strongFilter) { tcx2 = _mm_add_epi16(tcx, tcx); - + // q0 = p1 + 2p0 + 2q0 + 2q1 + q2 // q1 = p0 + q0 + q1 + q2 // q2 = p0 + q0 + q1 + 3q2 + 2q3 - + c0 = _mm_add_epi16(y0, y1); // q2 + q3 c1 = _mm_add_epi16(y1, y2); // q1 + q2 c2 = _mm_add_epi16(y2, y3); // q0 + q1 @@ -154,19 +154,19 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( y2 = _mm_add_epi16(c3, c1); c2 = _mm_add_epi16(c2, _mm_shuffle_epi32(c2, 0x4e)); - + y1 = _mm_add_epi16(y2, c0); y1 = _mm_add_epi16(y1, c0); y3 = _mm_add_epi16(y2, c2); - + y1 = _mm_add_epi16(y1, _mm_set1_epi16(4)); y2 = _mm_add_epi16(y2, _mm_set1_epi16(2)); y3 = _mm_add_epi16(y3, _mm_set1_epi16(4)); - + y1 = _mm_srai_epi16(y1, 3); y2 = _mm_srai_epi16(y2, 2); y3 = _mm_srai_epi16(y3, 3); - + y1 = _mm_max_epi16(y1, _mm_sub_epi16(x1, tcx2)); y1 = _mm_min_epi16(y1, _mm_add_epi16(x1, tcx2)); y2 = _mm_max_epi16(y2, _mm_sub_epi16(x2, tcx2)); @@ -181,31 +181,31 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( dl = _mm_sub_epi16(_mm_shuffle_epi32(dl, 0x4e), dl); dl = _mm_add_epi16(dl, _mm_setr_epi16(8, 8, 8, 8, 7, 7, 7, 7)); dl = _mm_srai_epi16(dl, 4); - + tcx10 = _mm_mullo_epi16(tcx, _mm_set1_epi16(10)); - + tcx = _mm_and_si128(tcx, _mm_cmplt_epi16(dl, tcx10)); tcx = _mm_and_si128(tcx, _mm_cmpgt_epi16(dl, _mm_sub_epi16(_mm_setzero_si128(), tcx10))); - + dl = _mm_min_epi16(dl, tcx); dl = _mm_max_epi16(dl, _mm_sub_epi16(_mm_setzero_si128(), tcx)); - + y3 = _mm_add_epi16(y3, dl); - + tcx = _mm_srai_epi16(tcx, 1); tcx = _mm_and_si128(tcx, _mm_cmplt_epi32(d32, _mm_set1_epi32(3*beta>>4))); // side threshold - + d2 = _mm_sub_epi16(_mm_avg_epu16(x3, x1), x2); d2 = _mm_add_epi16(d2, dl); d2 = _mm_srai_epi16(d2, 1); d2 = _mm_min_epi16(d2, tcx); d2 = _mm_max_epi16(d2, _mm_sub_epi16(_mm_setzero_si128(), tcx)); - + y2 = _mm_add_epi16(y2, d2); } - + // Store sample values z0 = _mm_packus_epi16(y0, y1); z1 = _mm_packus_epi16(y2, y3); @@ -240,12 +240,12 @@ EB_EXTERN void Luma4SampleEdgeDLFCore_SSSE3( } EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( - EB_BYTE edgeStartSampleCb, - EB_BYTE edgeStartSampleCr, - EB_U32 reconChromaPicStride, - EB_BOOL isVerticalEdge, - EB_U8 cbTc, - EB_U8 crTc) + EB_BYTE edgeStartSampleCb, + EB_BYTE edgeStartSampleCr, + EB_U32 reconChromaPicStride, + EB_BOOL isVerticalEdge, + EB_U8 cbTc, + EB_U8 crTc) { __m128i x0, x1, x2, x3; __m128i a0, a1, a2, a3, a4, a5, a6, a7; @@ -263,12 +263,12 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( a0 = _mm_unpacklo_epi16(a0, a2); a1 = _mm_unpacklo_epi16(a1, a3); - + a0 = _mm_unpacklo_epi8(a0, a1); - + a0 = _mm_shufflelo_epi16(a0, 0xd8); // 11011000 a0 = _mm_shufflehi_epi16(a0, 0xd8); // 11011000 - + x0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); x1 = _mm_srli_si128(x0, 8); x2 = _mm_unpackhi_epi8(a0, _mm_setzero_si128()); @@ -282,13 +282,13 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( x0 = _mm_srai_epi16(x0, 1); x0 = _mm_min_epi16(x0, lim); x0 = _mm_max_epi16(x0, _mm_sub_epi16(_mm_setzero_si128(), lim)); - - + + x1 = _mm_add_epi16(x1, x0); x2 = _mm_sub_epi16(x2, x0); x1 = _mm_unpacklo_epi16(x1, x2); x1 = _mm_packus_epi16(x1, x1); - + *(EB_U16 *)(edgeStartSampleCb-1+0*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 0)); *(EB_U16 *)(edgeStartSampleCb-1+1*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 1)); *(EB_U16 *)(edgeStartSampleCr-1+0*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 2)); @@ -300,7 +300,7 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( a1 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCb-1*reconChromaPicStride)); a2 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCb+0*reconChromaPicStride)); a3 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCb+1*reconChromaPicStride)); - + a4 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCr-2*reconChromaPicStride)); a0 = _mm_unpacklo_epi16(a0, a4); a5 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCr-1*reconChromaPicStride)); @@ -309,12 +309,12 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( a2 = _mm_unpacklo_epi16(a2, a6); a7 = _mm_cvtsi32_si128(*(EB_U32 *)(edgeStartSampleCr+1*reconChromaPicStride)); a3 = _mm_unpacklo_epi16(a3, a7); - + x0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); x1 = _mm_unpacklo_epi8(a1, _mm_setzero_si128()); x2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); x3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); - + x0 = _mm_sub_epi16(x0, x3); x3 = _mm_sub_epi16(x2, x1); x0 = _mm_srai_epi16(x0, 2); @@ -323,11 +323,11 @@ EB_EXTERN void Chroma2SampleEdgeDLFCore_SSSE3( x0 = _mm_srai_epi16(x0, 1); x0 = _mm_min_epi16(x0, lim); x0 = _mm_max_epi16(x0, _mm_sub_epi16(_mm_setzero_si128(), lim)); - - + + x1 = _mm_add_epi16(x1, x0); x2 = _mm_sub_epi16(x2, x0); - + x1 = _mm_packus_epi16(x1, x2); *(EB_U16 *)(edgeStartSampleCb-1*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 0)); *(EB_U16 *)(edgeStartSampleCb+0*reconChromaPicStride) = (EB_U16)(_mm_extract_epi16(x1, 4)); diff --git a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h index 313af2edb..c55ddeed7 100644 --- a/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbDeblockingFilter_SSSE3.h @@ -12,26 +12,26 @@ extern "C" { #include "EbDefinitions.h" extern void Luma4SampleEdgeDLFCore_SSSE3( - EB_BYTE edgeStartSample, - EB_U32 reconLumaPicStride, - EB_BOOL isVerticalEdge, - EB_S32 tc, + EB_BYTE edgeStartSample, + EB_U32 reconLumaPicStride, + EB_BOOL isVerticalEdge, + EB_S32 tc, EB_S32 beta); void Chroma2SampleEdgeDLFCore_SSSE3( - EB_BYTE edgeStartSampleCb, - EB_BYTE edgeStartSampleCr, - EB_U32 reconChromaPicStride, - EB_BOOL isVerticalEdge, - EB_U8 cbTc, + EB_BYTE edgeStartSampleCb, + EB_BYTE edgeStartSampleCr, + EB_U32 reconChromaPicStride, + EB_BOOL isVerticalEdge, + EB_U8 cbTc, EB_U8 crTc); void Luma4SampleEdgeDLFCore16bit_SSSE3_INTRIN( - EB_U16 *edgeStartFilteredSamplePtr, - EB_U32 reconLumaPicStride, - EB_BOOL isVerticalEdge, - EB_S32 tc, - EB_S32 beta); + EB_U16 *edgeStartFilteredSamplePtr, + EB_U32 reconLumaPicStride, + EB_BOOL isVerticalEdge, + EB_S32 tc, + EB_S32 beta); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c index e23e88a20..fb91f9c16 100644 --- a/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbMcp_Intrinsic_SSSE3.c @@ -90,13 +90,13 @@ static void PrefetchBlock(EB_U8 *src, EB_U32 srcStride, EB_U32 blkWidth, EB_U32 } void PictureCopyKernel_SSSE3( - EB_BYTE src, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight, - EB_U32 bytesPerSample) + EB_BYTE src, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight, + EB_U32 bytesPerSample) { EB_U32 rowCount, colCount; @@ -202,15 +202,15 @@ void PictureCopyKernel_SSSE3( } void ChromaInterpolationCopy_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { (void)firstPassIFDst; (void)fracPosx; @@ -219,13 +219,13 @@ void ChromaInterpolationCopy_SSSE3( } void LumaInterpolationCopy_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; PictureCopyKernel_SSSE3(refPic, srcStride, dst, dstStride, puWidth, puHeight, 1); @@ -663,12 +663,12 @@ void EbHevcLumaInterpolationFilterTwoDInRawOutRawM_SSSE3(EB_S16 *firstPassIFDst, } void EbHevcPictureCopyKernelOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 offset) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 offset) { EB_U32 rowCount, colCount; @@ -764,14 +764,14 @@ void EbHevcPictureCopyKernelOutRaw_SSSE3( } void ChromaInterpolationCopyOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { (void)firstPassIFDst; (void)fracPosx; @@ -929,23 +929,23 @@ void ChromaInterpolationFilterTwoDInRaw_SSSE3(EB_S16 *firstPassIFDst, EB_BYTE ds void ChromaInterpolationFilterOneDHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_S32 rowCount, colCount; - __m128i c0, c2; // coeffs - __m128i a0, a1, a2, a3; - __m128i b0, b1; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c2; // coeffs + __m128i a0, a1, a2, a3; + __m128i b0, b1; + __m128i sum; - EB_BYTE ptr,qtr; + EB_BYTE ptr,qtr; (void)firstPassIFDst; (void)fracPosy; @@ -1077,14 +1077,14 @@ void ChromaInterpolationFilterOneDHorizontal_SSSE3( void ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { EB_S32 rowCount, colCount; __m128i c0, c2; // coeffs @@ -1203,23 +1203,23 @@ void ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3( void ChromaInterpolationFilterOneDVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_S32 rowCount, colCount; - __m128i c0, c2; // coeffs - __m128i a0, a1, a2, a3; - __m128i b0, b1, b2, b3; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c2; // coeffs + __m128i a0, a1, a2, a3; + __m128i b0, b1, b2, b3; + __m128i sum; - EB_BYTE ptr,qtr; + EB_BYTE ptr,qtr; (void)firstPassIFDst; (void)fracPosx; @@ -1358,22 +1358,22 @@ void ChromaInterpolationFilterOneDVertical_SSSE3( void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { - EB_S32 rowCount, colCount; - __m128i c0, c2; // coeffs - __m128i a0, a1, a2, a3; - __m128i b0, b1, b2, b3; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c2; // coeffs + __m128i a0, a1, a2, a3; + __m128i b0, b1, b2, b3; + __m128i sum; - EB_BYTE ptr; + EB_BYTE ptr; (void)firstPassIFDst; (void)fracPosx; @@ -1471,7 +1471,7 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( do { - a3 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; + a3 = _mm_loadl_epi64((__m128i *)ptr); ptr += srcStride; sum = _mm_maddubs_epi16(_mm_unpacklo_epi8(a0, a1), c0); sum = _mm_add_epi16(sum, _mm_maddubs_epi16(_mm_unpacklo_epi8(a2, a3), c2)); a0 = a1; @@ -1492,15 +1492,15 @@ void ChromaInterpolationFilterOneDOutRawVertical_SSSE3( void ChromaInterpolationFilterTwoD_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-srcStride, srcStride, firstPassIFDst, puWidth, puHeight+3, NULL, fracPosx, 0); ChromaInterpolationFilterTwoDInRaw_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight, fracPosy); @@ -1636,14 +1636,14 @@ void ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(EB_S16 *firstPassIFDst, EB_S void ChromaInterpolationFilterTwoDOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst, - EB_U32 fracPosx, - EB_U32 fracPosy) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst, + EB_U32 fracPosx, + EB_U32 fracPosy) { ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-srcStride, srcStride, firstPassIFDst, puWidth, puHeight+3, NULL, fracPosx, 0); ChromaInterpolationFilterTwoDInRawOutRaw_SSSE3(firstPassIFDst, dst, puWidth, puHeight, fracPosy); @@ -1652,19 +1652,19 @@ void ChromaInterpolationFilterTwoDOutRaw_SSSE3( void LumaInterpolationFilterOneDHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1; - __m128i b0; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1; + __m128i b0; + __m128i sum; refPic -= 3; @@ -1750,19 +1750,19 @@ void LumaInterpolationFilterOneDHorizontal_SSSE3( } void LumaInterpolationFilterOneDOutRawHorizontal_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1; - __m128i b0; - __m128i sum; - EB_BYTE ptr; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1; + __m128i b0; + __m128i sum; + EB_BYTE ptr; refPic -= 3; @@ -1840,20 +1840,20 @@ void LumaInterpolationFilterOneDOutRawHorizontal_SSSE3( } void LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1; - __m128i b0; - __m128i sum; - EB_BYTE ptr; - EB_S16 *qtr; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1; + __m128i b0; + __m128i sum; + EB_BYTE ptr; + EB_S16 *qtr; refPic -= 3; PrefetchBlock(refPic, srcStride, (puWidth == 4) ? 16 : puWidth+8, (puWidth == 4) ? ((puHeight+1)&~1) : puHeight); @@ -1906,7 +1906,7 @@ void LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3( do { ptr = refPic; - qtr = dst; + qtr = dst; rowCount = puHeight; do { @@ -1932,19 +1932,19 @@ void LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3( } void LumaInterpolationFilterOneDVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - __m128i sum; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + __m128i sum; refPic -= 3*srcStride; @@ -2081,19 +2081,19 @@ void LumaInterpolationFilterOneDVertical_SSSE3( } void LumaInterpolationFilterOneDOutRawVertical_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U32 fracPosx) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U32 fracPosx) { - EB_S32 rowCount, colCount; - __m128i c0, c1, c2, c3; // coeffs - __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; - __m128i b0, b1, b2, b3, b4, b5, b6, b7; - __m128i sum; - EB_BYTE ptr; + EB_S32 rowCount, colCount; + __m128i c0, c1, c2, c3; // coeffs + __m128i a0, a1, a2, a3, a4, a5, a6, a7, a8; + __m128i b0, b1, b2, b3, b4, b5, b6, b7; + __m128i sum; + EB_BYTE ptr; refPic -= 3*srcStride; @@ -2221,13 +2221,13 @@ void LumaInterpolationFilterOneDOutRawVertical_SSSE3( void LumaInterpolationFilterPosa_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2235,13 +2235,13 @@ void LumaInterpolationFilterPosa_SSSE3( } void LumaInterpolationFilterPosb_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2249,13 +2249,13 @@ void LumaInterpolationFilterPosb_SSSE3( } void LumaInterpolationFilterPosc_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2263,13 +2263,13 @@ void LumaInterpolationFilterPosc_SSSE3( } void LumaInterpolationFilterPosd_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2277,13 +2277,13 @@ void LumaInterpolationFilterPosd_SSSE3( } void LumaInterpolationFilterPosh_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2291,13 +2291,13 @@ void LumaInterpolationFilterPosh_SSSE3( } void LumaInterpolationFilterPosn_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2319,13 +2319,13 @@ void LumaInterpolationFilterPose_SSSE3( void LumaInterpolationFilterPosf_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { EB_U32 puHeight1 = puHeight + 6; EB_BYTE refPic1 = refPic - 3 * srcStride; @@ -2362,52 +2362,52 @@ void LumaInterpolationFilterPosi_SSSE3( void LumaInterpolationFilterPosj_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-3*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+7, 2); EbHevcLumaInterpolationFilterTwoDInRawM_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight); } void LumaInterpolationFilterPosk_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-3*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+7, 3); EbHevcLumaInterpolationFilterTwoDInRawM_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight); } void LumaInterpolationFilterPosp_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-2*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+6, 1); EbHevcLumaInterpolationFilterTwoDInRaw7_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight, 3); } void LumaInterpolationFilterPosq_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { EB_U32 puHeight1 = puHeight + 6; EB_BYTE refPic1 = refPic - 2 * srcStride; @@ -2416,13 +2416,13 @@ void LumaInterpolationFilterPosq_SSSE3( } void LumaInterpolationFilterPosr_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic-2*srcStride, srcStride, firstPassIFDst, puWidth, puHeight+6, 3); EbHevcLumaInterpolationFilterTwoDInRaw7_SSSE3(firstPassIFDst, dst, dstStride, puWidth, puHeight, 3); @@ -2430,12 +2430,12 @@ void LumaInterpolationFilterPosr_SSSE3( void LumaInterpolationCopyOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; EbHevcPictureCopyKernelOutRaw_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 128*64); @@ -2444,24 +2444,24 @@ void LumaInterpolationCopyOutRaw_SSSE3( void LumaInterpolationFilterPosaOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; LumaInterpolationFilterOneDOutRawHorizontal_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 1); } void LumaInterpolationFilterPosbOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; //LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 2); @@ -2469,12 +2469,12 @@ void LumaInterpolationFilterPosbOutRaw_SSSE3( } void LumaInterpolationFilterPoscOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; //LumaInterpolationFilterOneDOutRawHorizontalOut_SSSE3(refPic, srcStride, dst, puWidth, puHeight, 3); @@ -2482,12 +2482,12 @@ void LumaInterpolationFilterPoscOutRaw_SSSE3( } void LumaInterpolationFilterPosdOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2495,12 +2495,12 @@ void LumaInterpolationFilterPosdOutRaw_SSSE3( } void LumaInterpolationFilterPoshOutRaw_SSSE3( - EB_BYTE refPic, - EB_U32 srcStride, - EB_S16* dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst) + EB_BYTE refPic, + EB_U32 srcStride, + EB_S16* dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst) { (void)firstPassIFDst; @@ -2625,178 +2625,178 @@ void BiPredClipping_SSSE3( void BiPredClippingOnTheFly_SSSE3( - EB_BYTE list0Src, - EB_U32 list0SrcStride, - EB_BYTE list1Src, - EB_U32 list1SrcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S32 offset, - EB_BOOL isLuma) + EB_BYTE list0Src, + EB_U32 list0SrcStride, + EB_BYTE list1Src, + EB_U32 list1SrcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S32 offset, + EB_BOOL isLuma) { - EB_U32 rowCount, colCount; - __m128i o; - o = (isLuma) ? _mm_set1_epi16(128 * 64) : _mm_set1_epi16(0); - - PrefetchBlock(list0Src, list0SrcStride, puWidth, puHeight); - PrefetchBlock(list1Src, list1SrcStride, puWidth, puHeight); - - if (puWidth & 2) - { - - EB_BYTE q = dst; - EB_BYTE ptrSrc0 = list0Src; - EB_BYTE ptrSrc1 = list1Src; - rowCount = puHeight; - __m128i a0, a2; - a0 = _mm_setzero_si128(); - a2 = _mm_setzero_si128(); - do - { - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 0); ptrSrc0 += list0SrcStride; - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 1); ptrSrc0 += list0SrcStride; - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 2); ptrSrc0 += list0SrcStride; - a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 3); ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); - a0 = _mm_slli_epi16(a0, 6); - a0 = _mm_sub_epi16(a0, o); - - - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 0); ptrSrc1 += list1SrcStride; - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 1); ptrSrc1 += list1SrcStride; - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 2); ptrSrc1 += list1SrcStride; - a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 3); ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); - a2 = _mm_slli_epi16(a2, 6); - a2 = _mm_sub_epi16(a2, o); - - a0 = _mm_adds_epi16(a0, a2); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); - a0 = _mm_srai_epi16(a0, 7); - a0 = _mm_packus_epi16(a0, a0); - - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 0)); q += dstStride; - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 1)); q += dstStride; - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 2)); q += dstStride; - *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 3)); q += dstStride; - rowCount -= 4; - } while (rowCount != 0); - - puWidth -= 2; - if (puWidth == 0) - { - return; - } - - list0Src += 2; - list1Src += 2; - dst += 2; - } - - if (puWidth & 4) - { - - EB_BYTE q = dst; - EB_BYTE ptrSrc0 = list0Src; - EB_BYTE ptrSrc1 = list1Src; - rowCount = puHeight; - do - { - __m128i a0, a1, a2; - a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi32(a0, a1); - a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); - a0 = _mm_slli_epi16(a0, 6); - a0 = _mm_sub_epi16(a0, o); - - a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; - a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi32(a2, a1); - a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); - a2 = _mm_slli_epi16(a2, 6); - a2 = _mm_sub_epi16(a2, o); - - a0 = _mm_adds_epi16(a0, a2); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); - a0 = _mm_srai_epi16(a0, 7); - a0 = _mm_packus_epi16(a0, a0); - *(EB_U32 *)q = _mm_extract_epi32(a0, 0); q += dstStride; - *(EB_U32 *)q = _mm_extract_epi32(a0, 1); q += dstStride; - rowCount -= 2; - } while (rowCount != 0); - - puWidth -= 4; - if (puWidth == 0) - { - return; - } - - list0Src += 4; - list1Src += 4; - dst += 4; - } - - - colCount = puWidth; - do - { - EB_BYTE q = dst; - EB_BYTE ptrSrc0 = list0Src; - EB_BYTE ptrSrc1 = list1Src; - rowCount = puHeight; - do - { - __m128i a0, a1, a2, a3; - a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); - a0 = _mm_slli_epi16(a0, 6); - a0 = _mm_sub_epi16(a0, o); - - a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); - a2 = _mm_slli_epi16(a2, 6); - a2 = _mm_sub_epi16(a2, o); - - a0 = _mm_adds_epi16(a0, a2); - a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); - a0 = _mm_srai_epi16(a0, 7); - - - a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); - ptrSrc0 += list0SrcStride; - a1 = _mm_unpacklo_epi8(a1, _mm_setzero_si128()); - a1 = _mm_slli_epi16(a1, 6); - a1 = _mm_sub_epi16(a1, o); - a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); - ptrSrc1 += list1SrcStride; - a3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); - a3 = _mm_slli_epi16(a3, 6); - a3 = _mm_sub_epi16(a3, o); - a1 = _mm_adds_epi16(a1, a3); - a1 = _mm_adds_epi16(a1, _mm_set1_epi16((short)offset)); - a1 = _mm_srai_epi16(a1, 7); - - a0 = _mm_packus_epi16(a0, a1); - _mm_storel_epi64((__m128i *)q, a0); - q += dstStride; - _mm_storeh_epi64((__m128i *)q, a0); - q += dstStride; - - rowCount -= 2; - } while (rowCount != 0); - - colCount -= 8; - list0Src += 8; - list1Src += 8; - dst += 8; - } while (colCount != 0); + EB_U32 rowCount, colCount; + __m128i o; + o = (isLuma) ? _mm_set1_epi16(128 * 64) : _mm_set1_epi16(0); + + PrefetchBlock(list0Src, list0SrcStride, puWidth, puHeight); + PrefetchBlock(list1Src, list1SrcStride, puWidth, puHeight); + + if (puWidth & 2) + { + + EB_BYTE q = dst; + EB_BYTE ptrSrc0 = list0Src; + EB_BYTE ptrSrc1 = list1Src; + rowCount = puHeight; + __m128i a0, a2; + a0 = _mm_setzero_si128(); + a2 = _mm_setzero_si128(); + do + { + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 0); ptrSrc0 += list0SrcStride; + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 1); ptrSrc0 += list0SrcStride; + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 2); ptrSrc0 += list0SrcStride; + a0 = _mm_insert_epi16(a0, *(EB_U16 *)ptrSrc0, 3); ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); + a0 = _mm_slli_epi16(a0, 6); + a0 = _mm_sub_epi16(a0, o); + + + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 0); ptrSrc1 += list1SrcStride; + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 1); ptrSrc1 += list1SrcStride; + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 2); ptrSrc1 += list1SrcStride; + a2 = _mm_insert_epi16(a2, *(EB_U16 *)ptrSrc1, 3); ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); + a2 = _mm_slli_epi16(a2, 6); + a2 = _mm_sub_epi16(a2, o); + + a0 = _mm_adds_epi16(a0, a2); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); + a0 = _mm_srai_epi16(a0, 7); + a0 = _mm_packus_epi16(a0, a0); + + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 0)); q += dstStride; + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 1)); q += dstStride; + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 2)); q += dstStride; + *(EB_U16 *)q = (EB_U16)(_mm_extract_epi16(a0, 3)); q += dstStride; + rowCount -= 4; + } while (rowCount != 0); + + puWidth -= 2; + if (puWidth == 0) + { + return; + } + + list0Src += 2; + list1Src += 2; + dst += 2; + } + + if (puWidth & 4) + { + + EB_BYTE q = dst; + EB_BYTE ptrSrc0 = list0Src; + EB_BYTE ptrSrc1 = list1Src; + rowCount = puHeight; + do + { + __m128i a0, a1, a2; + a0 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc0); ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi32(a0, a1); + a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); + a0 = _mm_slli_epi16(a0, 6); + a0 = _mm_sub_epi16(a0, o); + + a2 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; + a1 = _mm_cvtsi32_si128(*(EB_U32 *)ptrSrc1); ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi32(a2, a1); + a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); + a2 = _mm_slli_epi16(a2, 6); + a2 = _mm_sub_epi16(a2, o); + + a0 = _mm_adds_epi16(a0, a2); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); + a0 = _mm_srai_epi16(a0, 7); + a0 = _mm_packus_epi16(a0, a0); + *(EB_U32 *)q = _mm_extract_epi32(a0, 0); q += dstStride; + *(EB_U32 *)q = _mm_extract_epi32(a0, 1); q += dstStride; + rowCount -= 2; + } while (rowCount != 0); + + puWidth -= 4; + if (puWidth == 0) + { + return; + } + + list0Src += 4; + list1Src += 4; + dst += 4; + } + + + colCount = puWidth; + do + { + EB_BYTE q = dst; + EB_BYTE ptrSrc0 = list0Src; + EB_BYTE ptrSrc1 = list1Src; + rowCount = puHeight; + do + { + __m128i a0, a1, a2, a3; + a0 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a0 = _mm_unpacklo_epi8(a0, _mm_setzero_si128()); + a0 = _mm_slli_epi16(a0, 6); + a0 = _mm_sub_epi16(a0, o); + + a2 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a2 = _mm_unpacklo_epi8(a2, _mm_setzero_si128()); + a2 = _mm_slli_epi16(a2, 6); + a2 = _mm_sub_epi16(a2, o); + + a0 = _mm_adds_epi16(a0, a2); + a0 = _mm_adds_epi16(a0, _mm_set1_epi16((short)offset)); + a0 = _mm_srai_epi16(a0, 7); + + + a1 = _mm_loadl_epi64((__m128i *)ptrSrc0); + ptrSrc0 += list0SrcStride; + a1 = _mm_unpacklo_epi8(a1, _mm_setzero_si128()); + a1 = _mm_slli_epi16(a1, 6); + a1 = _mm_sub_epi16(a1, o); + a3 = _mm_loadl_epi64((__m128i *)ptrSrc1); + ptrSrc1 += list1SrcStride; + a3 = _mm_unpacklo_epi8(a3, _mm_setzero_si128()); + a3 = _mm_slli_epi16(a3, 6); + a3 = _mm_sub_epi16(a3, o); + a1 = _mm_adds_epi16(a1, a3); + a1 = _mm_adds_epi16(a1, _mm_set1_epi16((short)offset)); + a1 = _mm_srai_epi16(a1, 7); + + a0 = _mm_packus_epi16(a0, a1); + _mm_storel_epi64((__m128i *)q, a0); + q += dstStride; + _mm_storeh_epi64((__m128i *)q, a0); + q += dstStride; + + rowCount -= 2; + } while (rowCount != 0); + + colCount -= 8; + list0Src += 8; + list1Src += 8; + dst += 8; + } while (colCount != 0); } diff --git a/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h b/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h index ba5fce2e4..3e257815c 100644 --- a/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbMcp_SSSE3.h @@ -57,16 +57,16 @@ void LumaInterpolationFilterPosrOutRaw_SSSE3(EB_BYTE refPic, EB_U32 srcStride, E void BiPredClipping_SSSE3(EB_U32 puWidth, EB_U32 puHeight, EB_S16 *list0Src, EB_S16 *list1Src, EB_BYTE dst, EB_U32 dstStride, EB_S32 offset); void BiPredClippingOnTheFly_SSSE3( - EB_BYTE list0Src, - EB_U32 list0SrcStride, - EB_BYTE list1Src, - EB_U32 list1SrcStride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S32 offset, - EB_BOOL isLuma); + EB_BYTE list0Src, + EB_U32 list0SrcStride, + EB_BYTE list1Src, + EB_U32 list1SrcStride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S32 offset, + EB_BOOL isLuma); #ifdef __cplusplus } diff --git a/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c index 01b5f947c..764bb86bc 100644 --- a/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbSaoApplication_Intrinsic_SSSE3.c @@ -32,39 +32,39 @@ EB_ERRORTYPE SAOApplyBO_BT_SSSE3( __m128i band; __m128i offsets; EB_U8 *ptr; - + band = _mm_cvtsi32_si128(saoBandPosition); band = _mm_unpacklo_epi8(band, band); band = _mm_unpacklo_epi16(band, band); band = _mm_shuffle_epi32(band, 0x00); - + offsets = _mm_cvtsi32_si128(*(EB_U32 *)saoOffsetPtr); - + if (lcuWidth & 8) { rowCount = lcuHeight; ptr = reconSamplePtr; - + do { __m128i x0, x1; x0 = _mm_loadl_epi64( (__m128i *)ptr); ptr += reconStride; x0 = _mm_loadh_epi64(x0, (__m128i *)ptr); ptr -= reconStride; - + x1 = _mm_srli_epi16(x0, 3); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_sub_epi8(x1, band); x1 = _mm_and_si128(x1, _mm_set1_epi8(31)); x0 = _mm_adds_epi8(x0, _mm_and_si128(_mm_shuffle_epi8(offsets, x1), _mm_cmplt_epi8(x1, _mm_set1_epi8(4)))); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); - + _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; _mm_storeh_epi64((__m128i *)ptr, x0); ptr += reconStride; - + rowCount -= 2; } while (rowCount > 0); - + lcuWidth -= 8; if (lcuWidth == 0) { @@ -72,7 +72,7 @@ EB_ERRORTYPE SAOApplyBO_BT_SSSE3( } reconSamplePtr += 8; } - + colCount = lcuWidth; do { @@ -81,27 +81,27 @@ EB_ERRORTYPE SAOApplyBO_BT_SSSE3( do { __m128i x0, x1; - + x0 = _mm_loadu_si128((__m128i *)ptr); - + x1 = _mm_srli_epi16(x0, 3); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_sub_epi8(x1, band); x1 = _mm_and_si128(x1, _mm_set1_epi8(31)); x0 = _mm_adds_epi8(x0, _mm_and_si128(_mm_shuffle_epi8(offsets, x1), _mm_cmplt_epi8(x1, _mm_set1_epi8(4)))); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); - + _mm_storeu_si128((__m128i *)ptr, x0); - + ptr += reconStride; } while (--rowCount); - + reconSamplePtr += 16; colCount -= 16; } while (colCount > 0); - + return EB_ErrorNone; } @@ -111,7 +111,7 @@ static __m128i SAOEdgeProcess(__m128i x0, __m128i x1, __m128i x2, __m128i offset c1 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x1), _mm_cmpgt_epi8(x0, x1)); c2 = _mm_sub_epi8(_mm_cmplt_epi8(x0, x2), _mm_cmpgt_epi8(x0, x2)); c0 = _mm_add_epi8(c1, c2); - + x0 = _mm_adds_epi8(x0, _mm_shuffle_epi8(offsets, _mm_add_epi8(c0, _mm_set1_epi8(2)))); return x0; @@ -127,20 +127,20 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( { __m128i offsets; EB_S32 rowCount, colCount, rowCountInner; - + offsets = _mm_loadl_epi64((__m128i *)saoOffsetPtr); // 0 1 x 2 3 x ... - + rowCount = lcuHeight; do { __m128i left; EB_BYTE basePtr = reconSamplePtr; - + left = _mm_loadu_si128((__m128i *)temporalBufferLeft); temporalBufferLeft += 16; left = _mm_xor_si128(left, _mm_set1_epi8(-128)); - + colCount = lcuWidth; - + if (colCount & 8) { EB_BYTE ptr = basePtr; @@ -156,7 +156,7 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( do { __m128i x0, x1, x2; - + x0 = _mm_loadl_epi64((__m128i *)ptr); x1 = _mm_loadl_epi64((__m128i *)(ptr+1)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); @@ -165,9 +165,9 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( x2 = _mm_or_si128(x2, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(_mm_slli_si128(x0, 8), _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; @@ -176,7 +176,7 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( colCount -= 8; basePtr += 8; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -186,23 +186,23 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + while (colCount > 0) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + do { __m128i x0, x1, x2; - + x0 = _mm_loadu_si128((__m128i *)ptr); x1 = _mm_loadu_si128((__m128i *)(ptr+1)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); @@ -211,7 +211,7 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( x2 = _mm_or_si128(x2, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(x0, _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); @@ -219,10 +219,10 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( ptr += reconStride; } while (--rowCountInner); - + colCount -= 16; basePtr += 16; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -232,12 +232,12 @@ EB_ERRORTYPE SAOApplyEO_0_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + rowCount -= 16; reconSamplePtr += 16 * reconStride; } while (rowCount > 0); - + return EB_ErrorNone; } @@ -260,7 +260,7 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( { ptr = reconSamplePtr; rowCount = lcuHeight; - + x2 = _mm_loadl_epi64((__m128i *)temporalBufferUpper); temporalBufferUpper += 8; x2 = _mm_loadh_epi64(x2, (__m128i *)ptr); ptr += reconStride; x2 = _mm_xor_si128(x2, _mm_set1_epi8(-128)); @@ -269,23 +269,23 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( x1 = _mm_loadl_epi64((__m128i *)ptr); x1 = _mm_loadh_epi64(x1, (__m128i *)(ptr + reconStride)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); - + x0 = _mm_or_si128(_mm_slli_si128(x1, 8), _mm_srli_si128(x2, 8)); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); - + _mm_storel_epi64((__m128i *)(ptr - reconStride), x0); _mm_storeh_epi64((__m128i *)ptr, x0); ptr += reconStride; ptr += reconStride; - + x2 = x1; rowCount -= 2; } while (rowCount > 0); - + lcuWidth -= 8; if (lcuWidth == 0) { @@ -293,12 +293,12 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( } reconSamplePtr += 8; } - + colCount = lcuWidth; do { ptr = reconSamplePtr; - + x2 = _mm_loadu_si128((__m128i *)temporalBufferUpper); temporalBufferUpper += 16; x0 = _mm_loadu_si128((__m128i *)ptr); x2 = _mm_xor_si128(x2, _mm_set1_epi8(-128)); @@ -316,12 +316,12 @@ EB_ERRORTYPE SAOApplyEO_90_BT_SSSE3( _mm_storeu_si128((__m128i *)ptr, r0); ptr += reconStride; - + x2 = x0; x0 = x1; } while (--rowCount); - + colCount -= 16; reconSamplePtr += 16; } @@ -336,19 +336,19 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( EB_U8 *temporalBufferLeft, EB_U8 *temporalBufferUpper, EB_S8 *saoOffsetPtr, - EB_U32 lcuHeight, + EB_U32 lcuHeight, EB_U32 lcuWidth ) { __m128i offsets; EB_S32 rowCount, colCount, rowCountInner; EB_U32 /*EB_S32*/ colIdx; - + EB_U8 bufferAbove[MAX_LCU_SIZE]; - + colIdx = 0; temporalBufferUpper--; - + if (lcuWidth & 8) { __m128i x0 = _mm_loadl_epi64((__m128i *)temporalBufferUpper); @@ -363,66 +363,66 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( _mm_storeu_si128((__m128i *)(bufferAbove + colIdx), x0); colIdx += 16; } - + offsets = _mm_loadl_epi64((__m128i *)saoOffsetPtr); // 0 1 x 2 3 x ... - + rowCount = lcuHeight; do { __m128i left, up; EB_BYTE basePtr = reconSamplePtr; EB_BYTE upPtr = bufferAbove; - + left = _mm_loadu_si128((__m128i *)temporalBufferLeft); temporalBufferLeft += 16; left = _mm_xor_si128(left, _mm_set1_epi8(-128)); - + colCount = lcuWidth; - + if (colCount & 8) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadl_epi64((__m128i *)upPtr); do { __m128i x0, x1, x2; - + x0 = _mm_loadl_epi64((__m128i *)ptr); x1 = _mm_loadl_epi64((__m128i *)(ptr+1+reconStride)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); - + x2 = up; - + up = _mm_slli_si128(x0, 1); up = _mm_or_si128(up, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(_mm_slli_si128(x0,8), _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storel_epi64((__m128i *)upPtr, up); colCount -= 8; basePtr += 8; upPtr += 8; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -432,52 +432,52 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + while (colCount > 0) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadu_si128((__m128i *)upPtr); - + do { __m128i x0, x1, x2; - + x0 = _mm_loadu_si128((__m128i *)ptr); x1 = _mm_loadu_si128((__m128i *)(ptr+1+reconStride)); x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); - + x2 = up; - + up = _mm_slli_si128(x0, 1); up = _mm_or_si128(up, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(x0, _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storeu_si128((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storeu_si128((__m128i *)upPtr, up); - + colCount -= 16; basePtr += 16; upPtr += 16; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -487,12 +487,12 @@ EB_ERRORTYPE SAOApplyEO_135_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + rowCount -= 16; reconSamplePtr += 16 * reconStride; } while (rowCount > 0); - + return EB_ErrorNone; } @@ -511,13 +511,13 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( __m128i down; EB_U8 bufferAbove[MAX_LCU_SIZE]; - + colIdx = 0; temporalBufferUpper++; temporalBufferLeft++; - + if (lcuWidth & 8) { __m128i x0 = _mm_loadl_epi64((__m128i *)temporalBufferUpper); @@ -532,33 +532,33 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( _mm_storeu_si128((__m128i *)(bufferAbove + colIdx), x0); colIdx += 16; } - + offsets = _mm_loadl_epi64((__m128i *)saoOffsetPtr); // 0 1 x 2 3 x ... - + rowCount = lcuHeight; do { __m128i left, up; EB_BYTE basePtr = reconSamplePtr; EB_BYTE upPtr = bufferAbove; - + left = _mm_loadu_si128((__m128i *)temporalBufferLeft); temporalBufferLeft += 16; left = _mm_xor_si128(left, _mm_set1_epi8(-128)); - + colCount = lcuWidth; - + if (colCount & 8) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadl_epi64((__m128i *)upPtr); down = _mm_loadl_epi64((__m128i *)ptr); down = _mm_xor_si128(down, _mm_set1_epi8(-128)); @@ -566,37 +566,37 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( do { __m128i x0, x1, x2; - + x0 = down; x1 = _mm_loadl_epi64((__m128i *)(ptr+reconStride)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); down = x1; - + x2 = up; - + x1 = _mm_slli_si128(x1, 1); x1 = _mm_or_si128(x1, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(_mm_slli_si128(down,8), _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); - + up = _mm_loadl_epi64((__m128i *)(ptr + 1)); up = _mm_xor_si128(up, _mm_set1_epi8(-128)); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storel_epi64((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storel_epi64((__m128i *)upPtr, up); - + colCount -= 8; basePtr += 8; upPtr += 8; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -606,57 +606,57 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + while (colCount > 0) { EB_BYTE ptr = basePtr; EB_U32 shift; - + rowCountInner = 16; if (rowCountInner > rowCount) { rowCountInner = rowCount; } shift = 16 - rowCountInner; - + up = _mm_loadu_si128((__m128i *)upPtr); down = _mm_loadu_si128((__m128i *)ptr); down = _mm_xor_si128(down, _mm_set1_epi8(-128)); - + do { __m128i x0, x1, x2; - + x0 = down; x1 = _mm_loadu_si128((__m128i *)(ptr+reconStride)); x1 = _mm_xor_si128(x1, _mm_set1_epi8(-128)); down = x1; - + x2 = up; - + x1 = _mm_slli_si128(x1, 1); x1 = _mm_or_si128(x1, _mm_and_si128(left, _mm_setr_epi8(-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))); - + left = _mm_srli_si128(left, 1); left = _mm_or_si128(left, _mm_and_si128(down, _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1))); up = _mm_loadu_si128((__m128i *)(ptr + 1)); up = _mm_xor_si128(up, _mm_set1_epi8(-128)); - + x0 = SAOEdgeProcess(x0, x1, x2, offsets); - + x0 = _mm_xor_si128(x0, _mm_set1_epi8(-128)); _mm_storeu_si128((__m128i *)ptr, x0); ptr += reconStride; } while (--rowCountInner); - + _mm_storeu_si128((__m128i *)upPtr, up); - + colCount -= 16; basePtr += 16; upPtr += 16; - + if (shift & 8) { left = _mm_srli_si128(left, 8); @@ -666,12 +666,12 @@ EB_ERRORTYPE SAOApplyEO_45_BT_SSSE3( left = _mm_srli_si128(left, 4); } } - + rowCount -= 16; reconSamplePtr += 16 * reconStride; } while (rowCount > 0); - + return EB_ErrorNone; } diff --git a/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c b/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c index e14e59d6e..6d44619dc 100644 --- a/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c +++ b/Source/Lib/ASM_SSSE3/EbTransforms_Intrinsic_SSSE3.c @@ -1556,12 +1556,12 @@ void QuantizeInvQuantize4x4_SSE3( _mm_storel_epi64((__m128i *)(quantCoeff + coeffStride*row + 0), x); _mm_storel_epi64((__m128i *)(quantCoeff + coeffStride*row + coeffStride), _mm_srli_si128(x, 8)); - __m128i zer = _mm_setzero_si128(); - __m128i cmp = _mm_cmpeq_epi16(x, zer); - int msk = _mm_movemask_epi8(cmp); + __m128i zer = _mm_setzero_si128(); + __m128i cmp = _mm_cmpeq_epi16(x, zer); + int msk = _mm_movemask_epi8(cmp); - if (msk != 0xFFFF) - { + if (msk != 0xFFFF) + { a0 = _mm_mullo_epi16(x, iq); a1 = _mm_mulhi_epi16(x, iq); @@ -1577,11 +1577,11 @@ void QuantizeInvQuantize4x4_SSE3( x = _mm_packs_epi32(b0, b1); _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + 0), x); _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + coeffStride), _mm_srli_si128(x, 8)); - } - else{ - _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + 0), zer); - _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + coeffStride), zer); - } + } + else{ + _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + 0), zer); + _mm_storel_epi64((__m128i *)(reconCoeff + coeffStride*row + coeffStride), zer); + } row += 2; } while (row < 4); diff --git a/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h b/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h index 22642418f..68454660d 100644 --- a/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h +++ b/Source/Lib/ASM_SSSE3/EbTransforms_SSSE3.h @@ -10,7 +10,7 @@ #ifdef __cplusplus extern "C" { #endif - + void QuantizeInvQuantize4x4_SSE3( EB_S16 *coeff, const EB_U32 coeffStride, diff --git a/Source/Lib/C_DEFAULT/EbComputeMean_C.c b/Source/Lib/C_DEFAULT/EbComputeMean_C.c index eb8d1e9bc..ac1451144 100644 --- a/Source/Lib/C_DEFAULT/EbComputeMean_C.c +++ b/Source/Lib/C_DEFAULT/EbComputeMean_C.c @@ -79,7 +79,7 @@ EB_U64 ComputeSubMeanOfSquaredValues( EB_U64 blockMean = 0; EB_U16 skip = 0; - + for (verticalIndex = 0; skip < inputAreaHeight; skip =verticalIndex + verticalIndex) { for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex++) { diff --git a/Source/Lib/C_DEFAULT/EbComputeSAD_C.c b/Source/Lib/C_DEFAULT/EbComputeSAD_C.c index a7b548dfe..c261e7ad0 100644 --- a/Source/Lib/C_DEFAULT/EbComputeSAD_C.c +++ b/Source/Lib/C_DEFAULT/EbComputeSAD_C.c @@ -163,56 +163,56 @@ EB_U32 FastLoop_NxMSadKernel( } void SadLoopKernel( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width, // input parameter, block width (N) - EB_U64 *bestSad, - EB_S16 *xSearchCenter, - EB_S16 *ySearchCenter, - EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) - EB_S16 searchAreaWidth, - EB_S16 searchAreaHeight) + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width, // input parameter, block width (N) + EB_U64 *bestSad, + EB_S16 *xSearchCenter, + EB_S16 *ySearchCenter, + EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) + EB_S16 searchAreaWidth, + EB_S16 searchAreaHeight) { - EB_S16 xSearchIndex; - EB_S16 ySearchIndex; - - *bestSad = 0xffffff; - - for (ySearchIndex = 0; ySearchIndex < searchAreaHeight; ySearchIndex++) - { - for (xSearchIndex = 0; xSearchIndex < searchAreaWidth; xSearchIndex++) - { - EB_U32 x, y; - EB_U32 sad = 0; - - for (y = 0; y < height; y++) - { - for (x = 0; x < width; x++) - { - sad += EB_ABS_DIFF(src[y*srcStride + x], ref[xSearchIndex + y*refStride + x]); - } - - } - - // Update results - if (sad < *bestSad) - { - *bestSad = sad; - *xSearchCenter = xSearchIndex; - *ySearchCenter = ySearchIndex; - } - } - - ref += srcStrideRaw; - } - - return; + EB_S16 xSearchIndex; + EB_S16 ySearchIndex; + + *bestSad = 0xffffff; + + for (ySearchIndex = 0; ySearchIndex < searchAreaHeight; ySearchIndex++) + { + for (xSearchIndex = 0; xSearchIndex < searchAreaWidth; xSearchIndex++) + { + EB_U32 x, y; + EB_U32 sad = 0; + + for (y = 0; y < height; y++) + { + for (x = 0; x < width; x++) + { + sad += EB_ABS_DIFF(src[y*srcStride + x], ref[xSearchIndex + y*refStride + x]); + } + + } + + // Update results + if (sad < *bestSad) + { + *bestSad = sad; + *xSearchCenter = xSearchIndex; + *ySearchCenter = ySearchIndex; + } + } + + ref += srcStrideRaw; + } + + return; } -//compute a 8x4 SAD +//compute a 8x4 SAD static EB_U32 Subsad8x8( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride @@ -296,7 +296,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( for (xSearchIndex = 0; xSearchIndex < 8; xSearchIndex++) { - //8x8_0 + //8x8_0 sad8x8_0 = Subsad8x8(src, srcStride, ref + xSearchIndex, refStride); if (2 * sad8x8_0 < pBestSad8x8[0]) { pBestSad8x8[0] = 2 * sad8x8_0; @@ -305,7 +305,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( pBestMV8x8[0] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); } - //8x8_1 + //8x8_1 sad8x8_1 = Subsad8x8(src + 8, srcStride, ref + xSearchIndex + 8, refStride); if (2 * sad8x8_1 < pBestSad8x8[1]) { pBestSad8x8[1] = 2 * sad8x8_1; @@ -314,7 +314,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( pBestMV8x8[1] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); } - //8x8_2 + //8x8_2 sad8x8_2 = Subsad8x8(src + 8 * srcStride, srcStride, ref + xSearchIndex + 8 * refStride, refStride); if (2 * sad8x8_2 < pBestSad8x8[2]) { pBestSad8x8[2] = 2 * sad8x8_2; @@ -323,7 +323,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( pBestMV8x8[2] = ((EB_U16)yMv << 16) | ((EB_U16)xMv); } - //8x8_3 + //8x8_3 sad8x8_3 = Subsad8x8(src + 8 + 8 * srcStride, srcStride, ref + 8 + 8 * refStride + xSearchIndex, refStride); if (2 * sad8x8_3 < pBestSad8x8[3]) { pBestSad8x8[3] = 2 * sad8x8_3; @@ -346,7 +346,7 @@ void GetEightHorizontalSearchPointResults_8x8_16x16_PU( } } - + /******************************************* Calcualte SAD for 32x32,64x64 from 16x16 and check if there is improvement, if yes keep diff --git a/Source/Lib/C_DEFAULT/EbComputeSAD_C.h b/Source/Lib/C_DEFAULT/EbComputeSAD_C.h index 56f92f807..f310fa3b8 100644 --- a/Source/Lib/C_DEFAULT/EbComputeSAD_C.h +++ b/Source/Lib/C_DEFAULT/EbComputeSAD_C.h @@ -10,14 +10,14 @@ #ifdef __cplusplus extern "C" { #endif - + EB_U32 FastLoop_NxMSadKernel( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride + EB_U32 refStride, // input parameter, reference stride EB_U32 height, // input parameter, block height (M) - EB_U32 width); // input parameter, block width (N) + EB_U32 width); // input parameter, block width (N) EB_U32 CombinedAveragingSAD( EB_U8 *src, @@ -32,22 +32,22 @@ EB_U32 CombinedAveragingSAD( EB_U32 Compute8x4SAD_Kernel( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr + EB_U8 *ref, // input parameter, reference samples Ptr EB_U32 refStride); // input parameter, reference stride void SadLoopKernel( - EB_U8 *src, // input parameter, source samples Ptr - EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr - EB_U32 refStride, // input parameter, reference stride - EB_U32 height, // input parameter, block height (M) - EB_U32 width, // input parameter, block width (N) - EB_U64 *bestSad, - EB_S16 *xSearchCenter, - EB_S16 *ySearchCenter, - EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) - EB_S16 searchAreaWidth, - EB_S16 searchAreaHeight); + EB_U8 *src, // input parameter, source samples Ptr + EB_U32 srcStride, // input parameter, source stride + EB_U8 *ref, // input parameter, reference samples Ptr + EB_U32 refStride, // input parameter, reference stride + EB_U32 height, // input parameter, block height (M) + EB_U32 width, // input parameter, block width (N) + EB_U64 *bestSad, + EB_S16 *xSearchCenter, + EB_S16 *ySearchCenter, + EB_U32 srcStrideRaw, // input parameter, source stride (no line skipping) + EB_S16 searchAreaWidth, + EB_S16 searchAreaHeight); void SadLoopKernelSparse( @@ -86,5 +86,5 @@ void GetEightHorizontalSearchPointResults_32x32_64x64( #ifdef __cplusplus } -#endif +#endif #endif // EbComputeSAD_C_h \ No newline at end of file diff --git a/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h b/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h index 62d2ce869..f3ba16c3d 100644 --- a/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h +++ b/Source/Lib/C_DEFAULT/EbDeblockingFilter_C.h @@ -38,8 +38,8 @@ void Chroma2SampleEdgeDLFCore( EB_U8 crTc); void Chroma2SampleEdgeDLFCore16bit( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, diff --git a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c index 7d761d355..62e61b694 100644 --- a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c +++ b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.c @@ -184,7 +184,7 @@ void IntraModeHorizontalLuma( EB_U32 topLeftOffset = size << 1; EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... @@ -232,7 +232,7 @@ void IntraModeHorizontalLuma16bit( EB_U32 topLeftOffset = size << 1; EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... @@ -351,7 +351,7 @@ void IntraModeDCLuma( EB_U8 predictionDcValue = 128; // needs to be changed to a macro based on bit depth EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... @@ -422,7 +422,7 @@ void IntraModeDCLuma16bit( EB_U16 predictionDcValue = 128; // needs to be changed to a macro based on bit depth EB_U32 rowStride = skip ? 2 : 1; - // --------- Reference Samples Structure --------- + // --------- Reference Samples Structure --------- // refSamples[0] = Left[0] // refSamples[1] = Left[1] // ... diff --git a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h index 4092960c9..6648a9d2c 100644 --- a/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h +++ b/Source/Lib/C_DEFAULT/EbIntraPrediction_C.h @@ -16,7 +16,7 @@ void IntraModeVerticalLuma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeVerticalLuma16bit( @@ -31,7 +31,7 @@ void IntraModeVerticalChroma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeVerticalChroma16bit( @@ -46,7 +46,7 @@ void IntraModeHorizontalLuma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeHorizontalLuma16bit( @@ -61,7 +61,7 @@ void IntraModeHorizontalChroma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip //skip one row + const EB_BOOL skip //skip one row ); void IntraModeHorizontalChroma16bit( @@ -76,7 +76,7 @@ void IntraModeDCLuma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeDCLuma16bit( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -90,7 +90,7 @@ void IntraModeDCChroma( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeDCChroma16bit( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -104,7 +104,7 @@ void IntraModePlanar( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModePlanar16bit( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -118,7 +118,7 @@ void IntraModeAngular_34( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeAngular16bit_34( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -132,7 +132,7 @@ void IntraModeAngular_18( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeAngular16bit_18( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -146,7 +146,7 @@ void IntraModeAngular_2( EB_U8 *refSamples, //input parameter, pointer to the reference samples EB_U8 *predictionPtr, //output parameter, pointer to the prediction const EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip); //skip one row + const EB_BOOL skip); //skip one row void IntraModeAngular16bit_2( const EB_U32 size, //input parameter, denotes the size of the current PU @@ -167,9 +167,9 @@ void IntraModeAngular16bit_Vertical_Kernel( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr - const EB_BOOL skip, - EB_S32 intraPredAngle); + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + const EB_BOOL skip, + EB_S32 intraPredAngle); void IntraModeAngular_Horizontal_Kernel( EB_U32 size, @@ -190,5 +190,5 @@ void IntraModeAngular16bit_Horizontal_Kernel( #ifdef __cplusplus } -#endif +#endif #endif // EbCompute8x8SAD_asm_h \ No newline at end of file diff --git a/Source/Lib/C_DEFAULT/EbMcp_C.c b/Source/Lib/C_DEFAULT/EbMcp_C.c index f63d35baa..dfc96cd5d 100644 --- a/Source/Lib/C_DEFAULT/EbMcp_C.c +++ b/Source/Lib/C_DEFAULT/EbMcp_C.c @@ -2113,7 +2113,7 @@ void WpBiPredClipping16bit( } } -// Weighted Prediction - EncoderBitDepth : 8 +// Weighted Prediction - EncoderBitDepth : 8 void WpLumaInterpolationCopy( EB_BYTE refPic, EB_U32 srcStride, diff --git a/Source/Lib/C_DEFAULT/EbMcp_C.h b/Source/Lib/C_DEFAULT/EbMcp_C.h index 75cfdee4b..46ce23741 100644 --- a/Source/Lib/C_DEFAULT/EbMcp_C.h +++ b/Source/Lib/C_DEFAULT/EbMcp_C.h @@ -151,8 +151,8 @@ void WpBiPredClipping16bit(EB_U32 puWidth, EB_U32 puHeight, EB_S16 *list0Src, EB void uniPredCopy16bit( EB_U16* refPic, - EB_U32 srcStride, - EB_U16* dst, + EB_U32 srcStride, + EB_U16* dst, EB_U32 dstStride, EB_U32 puWidth, EB_U32 puHeight, @@ -162,5 +162,5 @@ void uniPredCopy16bit( #ifdef __cplusplus } -#endif +#endif #endif // EbMcp_C_h \ No newline at end of file diff --git a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c index 97906df41..0deb81007 100644 --- a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c +++ b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.c @@ -113,10 +113,10 @@ void SadCalculation_32x32_64x64( } void InitializeBuffer_32bits( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value) { + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value) { EB_U32 cuIndex; diff --git a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h index a6394ec01..a1632f748 100644 --- a/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h +++ b/Source/Lib/C_DEFAULT/EbMeSadCalculation_C.h @@ -32,10 +32,10 @@ extern void SadCalculation_32x32_64x64( EB_U32 mv); extern void InitializeBuffer_32bits( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value); + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value); void WeightSearchRegion( EB_U8 *inputBuffer, @@ -50,5 +50,5 @@ void WeightSearchRegion( #ifdef __cplusplus } -#endif +#endif #endif // EbMeSadCalculation_C_h \ No newline at end of file diff --git a/Source/Lib/C_DEFAULT/EbPackUnPack_C.c b/Source/Lib/C_DEFAULT/EbPackUnPack_C.c index 673bbf123..997af089d 100644 --- a/Source/Lib/C_DEFAULT/EbPackUnPack_C.c +++ b/Source/Lib/C_DEFAULT/EbPackUnPack_C.c @@ -42,47 +42,47 @@ void EB_ENC_msbPack2D( 2bit data storage : 4 2bit-pixels in one byte ************************************************/ void CompressedPackmsb( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height) + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height) { - EB_U64 row, kIdx; - EB_U16 outPixel; - EB_U8 nBitPixel; - EB_U8 four2bitPels; + EB_U64 row, kIdx; + EB_U16 outPixel; + EB_U8 nBitPixel; + EB_U8 four2bitPels; - for (row = 0; row> 6) & 3; + nBitPixel = (four2bitPels >> 6) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 0 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 0 + row*outStride] = outPixel | nBitPixel; + outPixel = in8BitBuffer[kIdx * 4 + 0 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 0 + row*outStride] = outPixel | nBitPixel; - nBitPixel = (four2bitPels >> 4) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 1 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 1 + row*outStride] = outPixel | nBitPixel; + nBitPixel = (four2bitPels >> 4) & 3; + outPixel = in8BitBuffer[kIdx * 4 + 1 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 1 + row*outStride] = outPixel | nBitPixel; - nBitPixel = (four2bitPels >> 2) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 2 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 2 + row*outStride] = outPixel | nBitPixel; + nBitPixel = (four2bitPels >> 2) & 3; + outPixel = in8BitBuffer[kIdx * 4 + 2 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 2 + row*outStride] = outPixel | nBitPixel; - nBitPixel = (four2bitPels >> 0) & 3; - outPixel = in8BitBuffer[kIdx * 4 + 3 + row*in8Stride] << 2; - out16BitBuffer[kIdx * 4 + 3 + row*outStride] = outPixel | nBitPixel; + nBitPixel = (four2bitPels >> 0) & 3; + outPixel = in8BitBuffer[kIdx * 4 + 3 + row*in8Stride] << 2; + out16BitBuffer[kIdx * 4 + 3 + row*outStride] = outPixel | nBitPixel; - } - } + } + } } /************************************************ @@ -90,33 +90,33 @@ void CompressedPackmsb( 2bit data storage : 4 2bit-pixels in one byte ************************************************/ void CPack_C( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height) + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height) { - EB_U32 rowIndex, colIndex; - (void)localCache; - - for (rowIndex = 0; rowIndex < height; rowIndex++) - { - for (colIndex = 0; colIndex < width; colIndex += 4) - { - EB_U32 i = colIndex + rowIndex*innStride; - - EB_U8 compressedUnpackedPixel = 0; - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 0] >> 0) & 0xC0);//1100.0000 - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 1] >> 2) & 0x30);//0011.0000 - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 2] >> 4) & 0x0C);//0000.1100 - compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 3] >> 6) & 0x03);//0000.0011 - - EB_U32 j = colIndex / 4 + rowIndex*outStride; - inCompnBitBuffer[j] = compressedUnpackedPixel; - } - } + EB_U32 rowIndex, colIndex; + (void)localCache; + + for (rowIndex = 0; rowIndex < height; rowIndex++) + { + for (colIndex = 0; colIndex < width; colIndex += 4) + { + EB_U32 i = colIndex + rowIndex*innStride; + + EB_U8 compressedUnpackedPixel = 0; + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 0] >> 0) & 0xC0);//1100.0000 + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 1] >> 2) & 0x30);//0011.0000 + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 2] >> 4) & 0x0C);//0000.1100 + compressedUnpackedPixel = compressedUnpackedPixel | ((innBitBuffer[i + 3] >> 6) & 0x03);//0000.0011 + + EB_U32 j = colIndex / 4 + rowIndex*outStride; + inCompnBitBuffer[j] = compressedUnpackedPixel; + } + } } @@ -152,8 +152,8 @@ void EB_ENC_msbUnPack2D( void UnPack8BitData( EB_U16 *in16BitBuffer, EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, EB_U32 width, EB_U32 height) { @@ -178,11 +178,11 @@ void UnpackAvg( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height ) { - + EB_U64 j, k; EB_U8 inPixelL0, inPixelL1; @@ -193,18 +193,18 @@ void UnpackAvg( inPixelL0 = (EB_U8)(ref16L0[k + j*refL0Stride]>>2); inPixelL1 = (EB_U8)(ref16L1[k + j*refL1Stride]>>2); dstPtr[k + j*dstStride] = (inPixelL0 + inPixelL1 + 1)>>1; - + } } - + } void UnPack8BitDataSafeSub( EB_U16 *in16BitBuffer, EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, EB_U32 width, EB_U32 height ) @@ -230,11 +230,11 @@ void UnpackAvgSafeSub( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height ) { - + EB_U64 j, k; EB_U8 inPixelL0, inPixelL1; @@ -245,7 +245,7 @@ void UnpackAvgSafeSub( inPixelL0 = (EB_U8)(ref16L0[k + j*refL0Stride]>>2); inPixelL1 = (EB_U8)(ref16L1[k + j*refL1Stride]>>2); dstPtr[k + j*dstStride] = (inPixelL0 + inPixelL1 + 1)>>1; - + } - } + } } diff --git a/Source/Lib/C_DEFAULT/EbPackUnPack_C.h b/Source/Lib/C_DEFAULT/EbPackUnPack_C.h index 1f02b21df..4e041b788 100644 --- a/Source/Lib/C_DEFAULT/EbPackUnPack_C.h +++ b/Source/Lib/C_DEFAULT/EbPackUnPack_C.h @@ -25,22 +25,22 @@ void EB_ENC_msbPack2D( EB_U32 height); void CompressedPackmsb( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U16 *out16BitBuffer, - EB_U32 innStride, - EB_U32 outStride, - EB_U32 width, - EB_U32 height); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U16 *out16BitBuffer, + EB_U32 innStride, + EB_U32 outStride, + EB_U32 width, + EB_U32 height); void CPack_C( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); @@ -56,8 +56,8 @@ void EB_ENC_msbUnPack2D( void UnPack8BitData( EB_U16 *in16BitBuffer, EB_U32 inStride, - EB_U8 *out8BitBuffer, - EB_U32 out8Stride, + EB_U8 *out8BitBuffer, + EB_U32 out8Stride, EB_U32 width, EB_U32 height); void UnpackAvg( diff --git a/Source/Lib/C_DEFAULT/EbPictureOperators_C.h b/Source/Lib/C_DEFAULT/EbPictureOperators_C.h index 02eba76c8..5417682d5 100644 --- a/Source/Lib/C_DEFAULT/EbPictureOperators_C.h +++ b/Source/Lib/C_DEFAULT/EbPictureOperators_C.h @@ -10,7 +10,7 @@ #ifdef __cplusplus extern "C" { #endif - + void PictureAverageKernel( EB_BYTE src0, EB_U32 src0Stride, @@ -155,5 +155,5 @@ EB_U64 Compute8x8Satd_U8( #ifdef __cplusplus } -#endif +#endif #endif // EbPictureOperators_C_h \ No newline at end of file diff --git a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c index 6bf9b4ddb..7f4c1c4a8 100644 --- a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c +++ b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.c @@ -21,107 +21,107 @@ static int clipToSigned8Bit(int x) * collects Sao Statistics ********************************************/ EB_ERRORTYPE GatherSaoStatisticsLcu_62x62_16bit( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_S32 diff; - EB_U32 boIndex, eoType, eoIndex; - EB_S16 signLeft, signRight, signTop, signBottom, signTopLeft, signBottomRight, signTopRight, signBottomLeft; + EB_S32 diff; + EB_U32 boIndex, eoType, eoIndex; + EB_S16 signLeft, signRight, signTop, signBottom, signTopLeft, signBottomRight, signTopRight, signBottomLeft; - EB_U16 *temporalInputSamplePtr; - EB_U16 *temporalReconSamplePtr; + EB_U16 *temporalInputSamplePtr; + EB_U16 *temporalReconSamplePtr; - EB_U32 i = 0; - EB_U32 j = 0; + EB_U32 i = 0; + EB_U32 j = 0; - EB_U32 boShift = 5; + EB_U32 boShift = 5; - // Intialize SAO Arrays + // Intialize SAO Arrays - // BO - for (boIndex = 0; boIndex < SAO_BO_INTERVALS; ++boIndex) { + // BO + for (boIndex = 0; boIndex < SAO_BO_INTERVALS; ++boIndex) { - boDiff[boIndex] = 0; - boCount[boIndex] = 0; - } + boDiff[boIndex] = 0; + boCount[boIndex] = 0; + } - // EO - for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { - for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES + 1; ++eoIndex) { + // EO + for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { + for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES + 1; ++eoIndex) { - eoDiff[eoType][eoIndex] = 0; - eoCount[eoType][eoIndex] = 0; + eoDiff[eoType][eoIndex] = 0; + eoCount[eoType][eoIndex] = 0; - } - } + } + } - temporalInputSamplePtr = inputSamplePtr + 1 + inputStride; - temporalReconSamplePtr = reconSamplePtr + 1 + reconStride; + temporalInputSamplePtr = inputSamplePtr + 1 + inputStride; + temporalReconSamplePtr = reconSamplePtr + 1 + reconStride; - for (j = 0; j < lcuHeight - 2; j++) { - for (i = 0; i < lcuWidth - 2; i++) { + for (j = 0; j < lcuHeight - 2; j++) { + for (i = 0; i < lcuWidth - 2; i++) { - diff = temporalInputSamplePtr[i] - temporalReconSamplePtr[i]; + diff = temporalInputSamplePtr[i] - temporalReconSamplePtr[i]; - //BO - boIndex = temporalReconSamplePtr[i] >> boShift; - boDiff[boIndex] += diff; - boCount[boIndex] ++; + //BO + boIndex = temporalReconSamplePtr[i] >> boShift; + boDiff[boIndex] += diff; + boCount[boIndex] ++; - //EO-0 - signLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - 1)]); - signRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + 1]); - eoIndex = signRight + signLeft + 2; - eoDiff[0][eoIndex] += diff; - eoCount[0][eoIndex] ++; + //EO-0 + signLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - 1)]); + signRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + 1]); + eoIndex = signRight + signLeft + 2; + eoDiff[0][eoIndex] += diff; + eoCount[0][eoIndex] ++; - //EO-90 - signTop = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride)]); - signBottom = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride]); - eoIndex = signTop + signBottom + 2; - eoDiff[1][eoIndex] += diff; - eoCount[1][eoIndex] ++; + //EO-90 + signTop = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride)]); + signBottom = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride]); + eoIndex = signTop + signBottom + 2; + eoDiff[1][eoIndex] += diff; + eoCount[1][eoIndex] ++; - //EO-45 - signTopRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride + 1)]); - signBottomLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride - 1]); - eoIndex = signTopRight + signBottomLeft + 2; - eoDiff[3][eoIndex] += diff; - eoCount[3][eoIndex] ++; + //EO-45 + signTopRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride + 1)]); + signBottomLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride - 1]); + eoIndex = signTopRight + signBottomLeft + 2; + eoDiff[3][eoIndex] += diff; + eoCount[3][eoIndex] ++; - //EO-135 - signTopLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride - 1)]); - signBottomRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride + 1]); - eoIndex = signTopLeft + signBottomRight + 2; - eoDiff[2][eoIndex] += diff; - eoCount[2][eoIndex] ++; - } + //EO-135 + signTopLeft = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[(EB_S32)(i - reconStride - 1)]); + signBottomRight = SIGN(temporalReconSamplePtr[i], temporalReconSamplePtr[i + reconStride + 1]); + eoIndex = signTopLeft + signBottomRight + 2; + eoDiff[2][eoIndex] += diff; + eoCount[2][eoIndex] ++; + } - temporalInputSamplePtr += inputStride; - temporalReconSamplePtr += reconStride; + temporalInputSamplePtr += inputStride; + temporalReconSamplePtr += reconStride; - } - for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { - eoDiff[eoType][2] = eoDiff[eoType][3]; - eoDiff[eoType][3] = eoDiff[eoType][4]; - eoCount[eoType][2] = eoCount[eoType][3]; - eoCount[eoType][3] = eoCount[eoType][4]; - } + } + for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { + eoDiff[eoType][2] = eoDiff[eoType][3]; + eoDiff[eoType][3] = eoDiff[eoType][4]; + eoCount[eoType][2] = eoCount[eoType][3]; + eoCount[eoType][3] = eoCount[eoType][4]; + } - return return_error; + return return_error; } - + EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr EB_U32 inputStride, // input parameter, source stride @@ -130,7 +130,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( EB_U32 lcuWidth, // input parameter, LCU width EB_U32 lcuHeight, // input parameter, LCU height EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]) // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] { @@ -223,7 +223,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( return return_error; } - + EB_ERRORTYPE GatherSaoStatisticsLcu_OnlyEo_90_45_135_Lossy( EB_U8 *inputSamplePtr, // input parameter, source Picture Ptr EB_U32 inputStride, // input parameter, source stride @@ -332,7 +332,7 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit( EB_U32 i = 0; EB_U32 j = 0; - // Intialize SAO Arrays + // Intialize SAO Arrays // EO for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES + 1; ++eoIndex) { diff --git a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h index 657b2d758..3a2590f40 100644 --- a/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h +++ b/Source/Lib/C_DEFAULT/EbSampleAdaptiveOffset_C.h @@ -12,7 +12,7 @@ extern "C" { #endif - + EB_ERRORTYPE GatherSaoStatisticsLcuLossy_62x62( EB_U8 *inputSamplePtr, EB_U32 inputStride, @@ -40,16 +40,16 @@ EB_ERRORTYPE GatherSaoStatisticsLcu_BT_SSE2( EB_ERRORTYPE GatherSaoStatisticsLcu_62x62_16bit( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] diff --git a/Source/Lib/C_DEFAULT/EbTransforms_C.c b/Source/Lib/C_DEFAULT/EbTransforms_C.c index 4e3d4f945..b9657ed8a 100644 --- a/Source/Lib/C_DEFAULT/EbTransforms_C.c +++ b/Source/Lib/C_DEFAULT/EbTransforms_C.c @@ -133,24 +133,24 @@ void QuantizeInvQuantize( } #define EB_INTRA_CHROMA_DM 4 -#define MAX_TU_SIZE 32 +#define MAX_TU_SIZE 32 //enum COMPONENT_TYPE //{ -// COMPONENT_LUMA = 0, // luma -// COMPONENT_CHROMA = 1, // chroma (Cb+Cr) -// COMPONENT_CHROMA_CB = 2, // chroma Cb -// COMPONENT_CHROMA_CR = 3, // chroma Cr -// COMPONENT_ALL = 4, // Y+Cb+Cr -// COMPONENT_NONE = 15 +// COMPONENT_LUMA = 0, // luma +// COMPONENT_CHROMA = 1, // chroma (Cb+Cr) +// COMPONENT_CHROMA_CB = 2, // chroma Cb +// COMPONENT_CHROMA_CR = 3, // chroma Cr +// COMPONENT_ALL = 4, // Y+Cb+Cr +// COMPONENT_NONE = 15 //}; // // //enum COEFF_SCAN_TYPE2 //{ -// SCAN_DIAG2 = 0, // diagonal scan -// SCAN_HOR2, // first scan is horizontal -// SCAN_VER2 // first scan is vertical +// SCAN_DIAG2 = 0, // diagonal scan +// SCAN_HOR2, // first scan is horizontal +// SCAN_VER2 // first scan is vertical //}; /************************************** @@ -158,46 +158,46 @@ void QuantizeInvQuantize( **************************************/ void UpdateQiQCoef_R( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag) + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag) { - EB_U32 coeffLocation = 0; + EB_U32 coeffLocation = 0; - //EB_U32 rowIndex = 0; - //EB_U32 colIndex = 0; + //EB_U32 rowIndex = 0; + //EB_U32 colIndex = 0; if ((*nonzerocoeff < 10) && enableContouringQCUpdateFlag && sliceType == EB_I_PICTURE && temporalLayer == 0 && componentType == 0){ - coeffLocation = (areaSize - 1) + (areaSize - 1) * coeffStride; - - if (quantCoeff[coeffLocation] == 0){ - (*nonzerocoeff)++; - quantCoeff[coeffLocation] = 1; - reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - } - } - - if ((*nonzerocoeff == 0) && (enableCbflag == 1)) - { - EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); - *nonzerocoeff = 1; - quantCoeff[coeffLocation] = 1; - reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - } + coeffLocation = (areaSize - 1) + (areaSize - 1) * coeffStride; + + if (quantCoeff[coeffLocation] == 0){ + (*nonzerocoeff)++; + quantCoeff[coeffLocation] = 1; + reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + } + } + + if ((*nonzerocoeff == 0) && (enableCbflag == 1)) + { + EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); + *nonzerocoeff = 1; + quantCoeff[coeffLocation] = 1; + reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + } } /********************************************************************* @@ -207,25 +207,25 @@ void UpdateQiQCoef_R( *********************************************************************/ void UpdateQiQCoef( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag) + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag) { - EB_U32 coeffLocation = 0; - //EB_U32 rowIndex = 0; - //EB_U32 colIndex = 0; + EB_U32 coeffLocation = 0; + //EB_U32 rowIndex = 0; + //EB_U32 colIndex = 0; @@ -240,14 +240,14 @@ void UpdateQiQCoef( } } - - if ((*nonzerocoeff == 0) && (enableCbflag == 1)) - { - EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); - *nonzerocoeff = 1; - quantCoeff[coeffLocation] = 1; - reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - } + + if ((*nonzerocoeff == 0) && (enableCbflag == 1)) + { + EB_U32 coeffLocation = ((areaSize - 2)*coeffStride) + (areaSize - 1); + *nonzerocoeff = 1; + quantCoeff[coeffLocation] = 1; + reconCoeff[coeffLocation] = (EB_S16)((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + } } /********************************************************************* @@ -490,226 +490,226 @@ inline static void PartialButterfly32( } inline static void PartialButterfly32Estimate( - EB_S16 *residual, - EB_S16 *transformCoefficients, - const EB_U32 srcStride, - const EB_U32 dstStride, - const EB_U32 shift) + EB_S16 *residual, + EB_S16 *transformCoefficients, + const EB_U32 srcStride, + const EB_U32 dstStride, + const EB_U32 shift) { - EB_S16 even0, even1, even2, even3, even4, even5, even6, even7, even8, even9, even10, even11, even12, even13, even14, even15; - EB_S16 odd0, odd1, odd2, odd3, odd4, odd5, odd6, odd7, odd8, odd9, odd10, odd11, odd12, odd13, odd14, odd15; - EB_S16 evenEven0, evenEven1, evenEven2, evenEven3, evenEven4, evenEven5, evenEven6, evenEven7; - EB_S16 evenOdd0, evenOdd1, evenOdd2, evenOdd3, evenOdd4, evenOdd5, evenOdd6, evenOdd7; - EB_S32 evenEvenEven0, evenEvenEven1, evenEvenEven2, evenEvenEven3; - EB_S32 evenEvenOdd0, evenEvenOdd1, evenEvenOdd2, evenEvenOdd3; - EB_S32 evenEvenEvenEven0, evenEvenEvenEven1; - EB_S32 evenEvenEvenOdd0, evenEvenEvenOdd1; - EB_U32 rowIndex, rowStrideIndex; - const EB_S16 offset = 1 << (shift - 1); - - for (rowIndex = 0; rowIndex < 32; rowIndex++) { - rowStrideIndex = rowIndex*srcStride; - - //Calculating even and odd variables - even0 = residual[rowStrideIndex + 0] + residual[rowStrideIndex + 31]; - even1 = residual[rowStrideIndex + 1] + residual[rowStrideIndex + 30]; - even2 = residual[rowStrideIndex + 2] + residual[rowStrideIndex + 29]; - even3 = residual[rowStrideIndex + 3] + residual[rowStrideIndex + 28]; - even4 = residual[rowStrideIndex + 4] + residual[rowStrideIndex + 27]; - even5 = residual[rowStrideIndex + 5] + residual[rowStrideIndex + 26]; - even6 = residual[rowStrideIndex + 6] + residual[rowStrideIndex + 25]; - even7 = residual[rowStrideIndex + 7] + residual[rowStrideIndex + 24]; - even8 = residual[rowStrideIndex + 8] + residual[rowStrideIndex + 23]; - even9 = residual[rowStrideIndex + 9] + residual[rowStrideIndex + 22]; - even10 = residual[rowStrideIndex + 10] + residual[rowStrideIndex + 21]; - even11 = residual[rowStrideIndex + 11] + residual[rowStrideIndex + 20]; - even12 = residual[rowStrideIndex + 12] + residual[rowStrideIndex + 19]; - even13 = residual[rowStrideIndex + 13] + residual[rowStrideIndex + 18]; - even14 = residual[rowStrideIndex + 14] + residual[rowStrideIndex + 17]; - even15 = residual[rowStrideIndex + 15] + residual[rowStrideIndex + 16]; - - odd0 = residual[rowStrideIndex + 0] - residual[rowStrideIndex + 31]; - odd1 = residual[rowStrideIndex + 1] - residual[rowStrideIndex + 30]; - odd2 = residual[rowStrideIndex + 2] - residual[rowStrideIndex + 29]; - odd3 = residual[rowStrideIndex + 3] - residual[rowStrideIndex + 28]; - odd4 = residual[rowStrideIndex + 4] - residual[rowStrideIndex + 27]; - odd5 = residual[rowStrideIndex + 5] - residual[rowStrideIndex + 26]; - odd6 = residual[rowStrideIndex + 6] - residual[rowStrideIndex + 25]; - odd7 = residual[rowStrideIndex + 7] - residual[rowStrideIndex + 24]; - odd8 = residual[rowStrideIndex + 8] - residual[rowStrideIndex + 23]; - odd9 = residual[rowStrideIndex + 9] - residual[rowStrideIndex + 22]; - odd10 = residual[rowStrideIndex + 10] - residual[rowStrideIndex + 21]; - odd11 = residual[rowStrideIndex + 11] - residual[rowStrideIndex + 20]; - odd12 = residual[rowStrideIndex + 12] - residual[rowStrideIndex + 19]; - odd13 = residual[rowStrideIndex + 13] - residual[rowStrideIndex + 18]; - odd14 = residual[rowStrideIndex + 14] - residual[rowStrideIndex + 17]; - odd15 = residual[rowStrideIndex + 15] - residual[rowStrideIndex + 16]; - - //Calculating evenEven and evenOdd variables - evenEven0 = even0 + even15; - evenEven1 = even1 + even14; - evenEven2 = even2 + even13; - evenEven3 = even3 + even12; - evenEven4 = even4 + even11; - evenEven5 = even5 + even10; - evenEven6 = even6 + even9; - evenEven7 = even7 + even8; - - evenOdd0 = even0 - even15; - evenOdd1 = even1 - even14; - evenOdd2 = even2 - even13; - evenOdd3 = even3 - even12; - evenOdd4 = even4 - even11; - evenOdd5 = even5 - even10; - evenOdd6 = even6 - even9; - evenOdd7 = even7 - even8; - - //Calculating evenEvenEven and evenEvenOdd variables - evenEvenEven0 = evenEven0 + evenEven7; - evenEvenEven1 = evenEven1 + evenEven6; - evenEvenEven2 = evenEven2 + evenEven5; - evenEvenEven3 = evenEven3 + evenEven4; - - evenEvenOdd0 = evenEven0 - evenEven7; - evenEvenOdd1 = evenEven1 - evenEven6; - evenEvenOdd2 = evenEven2 - evenEven5; - evenEvenOdd3 = evenEven3 - evenEven4; - - //Calculating evenEvenEvenEven and evenEvenEvenOdd variables - evenEvenEvenEven0 = evenEvenEven0 + evenEvenEven3; - evenEvenEvenEven1 = evenEvenEven1 + evenEvenEven2; - - evenEvenEvenOdd0 = evenEvenEven0 - evenEvenEven3; - evenEvenEvenOdd1 = evenEvenEven1 - evenEvenEven2; - - transformCoefficients[0 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[0 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[0 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); - transformCoefficients[8 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[8 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[8 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); - transformCoefficients[16 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[16 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[16 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); - transformCoefficients[24 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[24 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[24 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); - - transformCoefficients[4 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[4 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[4 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[4 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[4 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - transformCoefficients[12 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[12 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[12 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[12 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[12 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - transformCoefficients[20 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[20 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[20 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[20 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[20 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - transformCoefficients[28 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[28 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[28 * 32 + 1] * evenEvenOdd1 + - DctCoef32x32[28 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[28 * 32 + 3] * evenEvenOdd3 + offset) >> shift); - - transformCoefficients[2 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[2 * 32 + 0] * evenOdd0 + DctCoef32x32[2 * 32 + 1] * evenOdd1 + - DctCoef32x32[2 * 32 + 2] * evenOdd2 + DctCoef32x32[2 * 32 + 3] * evenOdd3 + - DctCoef32x32[2 * 32 + 4] * evenOdd4 + DctCoef32x32[2 * 32 + 5] * evenOdd5 + - DctCoef32x32[2 * 32 + 6] * evenOdd6 + DctCoef32x32[2 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[6 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[6 * 32 + 0] * evenOdd0 + DctCoef32x32[6 * 32 + 1] * evenOdd1 + - DctCoef32x32[6 * 32 + 2] * evenOdd2 + DctCoef32x32[6 * 32 + 3] * evenOdd3 + - DctCoef32x32[6 * 32 + 4] * evenOdd4 + DctCoef32x32[6 * 32 + 5] * evenOdd5 + - DctCoef32x32[6 * 32 + 6] * evenOdd6 + DctCoef32x32[6 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[10 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[10 * 32 + 0] * evenOdd0 + DctCoef32x32[10 * 32 + 1] * evenOdd1 + - DctCoef32x32[10 * 32 + 2] * evenOdd2 + DctCoef32x32[10 * 32 + 3] * evenOdd3 + - DctCoef32x32[10 * 32 + 4] * evenOdd4 + DctCoef32x32[10 * 32 + 5] * evenOdd5 + - DctCoef32x32[10 * 32 + 6] * evenOdd6 + DctCoef32x32[10 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[14 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[14 * 32 + 0] * evenOdd0 + DctCoef32x32[14 * 32 + 1] * evenOdd1 + - DctCoef32x32[14 * 32 + 2] * evenOdd2 + DctCoef32x32[14 * 32 + 3] * evenOdd3 + - DctCoef32x32[14 * 32 + 4] * evenOdd4 + DctCoef32x32[14 * 32 + 5] * evenOdd5 + - DctCoef32x32[14 * 32 + 6] * evenOdd6 + DctCoef32x32[14 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[18 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[18 * 32 + 0] * evenOdd0 + DctCoef32x32[18 * 32 + 1] * evenOdd1 + - DctCoef32x32[18 * 32 + 2] * evenOdd2 + DctCoef32x32[18 * 32 + 3] * evenOdd3 + - DctCoef32x32[18 * 32 + 4] * evenOdd4 + DctCoef32x32[18 * 32 + 5] * evenOdd5 + - DctCoef32x32[18 * 32 + 6] * evenOdd6 + DctCoef32x32[18 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[22 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[22 * 32 + 0] * evenOdd0 + DctCoef32x32[22 * 32 + 1] * evenOdd1 + - DctCoef32x32[22 * 32 + 2] * evenOdd2 + DctCoef32x32[22 * 32 + 3] * evenOdd3 + - DctCoef32x32[22 * 32 + 4] * evenOdd4 + DctCoef32x32[22 * 32 + 5] * evenOdd5 + - DctCoef32x32[22 * 32 + 6] * evenOdd6 + DctCoef32x32[22 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[26 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[26 * 32 + 0] * evenOdd0 + DctCoef32x32[26 * 32 + 1] * evenOdd1 + - DctCoef32x32[26 * 32 + 2] * evenOdd2 + DctCoef32x32[26 * 32 + 3] * evenOdd3 + - DctCoef32x32[26 * 32 + 4] * evenOdd4 + DctCoef32x32[26 * 32 + 5] * evenOdd5 + - DctCoef32x32[26 * 32 + 6] * evenOdd6 + DctCoef32x32[26 * 32 + 7] * evenOdd7 + offset) >> shift); - transformCoefficients[30 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[30 * 32 + 0] * evenOdd0 + DctCoef32x32[30 * 32 + 1] * evenOdd1 + - DctCoef32x32[30 * 32 + 2] * evenOdd2 + DctCoef32x32[30 * 32 + 3] * evenOdd3 + - DctCoef32x32[30 * 32 + 4] * evenOdd4 + DctCoef32x32[30 * 32 + 5] * evenOdd5 + - DctCoef32x32[30 * 32 + 6] * evenOdd6 + DctCoef32x32[30 * 32 + 7] * evenOdd7 + offset) >> shift); - - transformCoefficients[1 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[1 * 32 + 0] * odd0 + DctCoef32x32[1 * 32 + 1] * odd1 + DctCoef32x32[1 * 32 + 2] * odd2 + DctCoef32x32[1 * 32 + 3] * odd3 + - DctCoef32x32[1 * 32 + 4] * odd4 + DctCoef32x32[1 * 32 + 5] * odd5 + DctCoef32x32[1 * 32 + 6] * odd6 + DctCoef32x32[1 * 32 + 7] * odd7 + - DctCoef32x32[1 * 32 + 8] * odd8 + DctCoef32x32[1 * 32 + 9] * odd9 + DctCoef32x32[1 * 32 + 10] * odd10 + DctCoef32x32[1 * 32 + 11] * odd11 + - DctCoef32x32[1 * 32 + 12] * odd12 + DctCoef32x32[1 * 32 + 13] * odd13 + DctCoef32x32[1 * 32 + 14] * odd14 + DctCoef32x32[1 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[3 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[3 * 32 + 0] * odd0 + DctCoef32x32[3 * 32 + 1] * odd1 + DctCoef32x32[3 * 32 + 2] * odd2 + DctCoef32x32[3 * 32 + 3] * odd3 + - DctCoef32x32[3 * 32 + 4] * odd4 + DctCoef32x32[3 * 32 + 5] * odd5 + DctCoef32x32[3 * 32 + 6] * odd6 + DctCoef32x32[3 * 32 + 7] * odd7 + - DctCoef32x32[3 * 32 + 8] * odd8 + DctCoef32x32[3 * 32 + 9] * odd9 + DctCoef32x32[3 * 32 + 10] * odd10 + DctCoef32x32[3 * 32 + 11] * odd11 + - DctCoef32x32[3 * 32 + 12] * odd12 + DctCoef32x32[3 * 32 + 13] * odd13 + DctCoef32x32[3 * 32 + 14] * odd14 + DctCoef32x32[3 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[5 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[5 * 32 + 0] * odd0 + DctCoef32x32[5 * 32 + 1] * odd1 + DctCoef32x32[5 * 32 + 2] * odd2 + DctCoef32x32[5 * 32 + 3] * odd3 + - DctCoef32x32[5 * 32 + 4] * odd4 + DctCoef32x32[5 * 32 + 5] * odd5 + DctCoef32x32[5 * 32 + 6] * odd6 + DctCoef32x32[5 * 32 + 7] * odd7 + - DctCoef32x32[5 * 32 + 8] * odd8 + DctCoef32x32[5 * 32 + 9] * odd9 + DctCoef32x32[5 * 32 + 10] * odd10 + DctCoef32x32[5 * 32 + 11] * odd11 + - DctCoef32x32[5 * 32 + 12] * odd12 + DctCoef32x32[5 * 32 + 13] * odd13 + DctCoef32x32[5 * 32 + 14] * odd14 + DctCoef32x32[5 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[7 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[7 * 32 + 0] * odd0 + DctCoef32x32[7 * 32 + 1] * odd1 + DctCoef32x32[7 * 32 + 2] * odd2 + DctCoef32x32[7 * 32 + 3] * odd3 + - DctCoef32x32[7 * 32 + 4] * odd4 + DctCoef32x32[7 * 32 + 5] * odd5 + DctCoef32x32[7 * 32 + 6] * odd6 + DctCoef32x32[7 * 32 + 7] * odd7 + - DctCoef32x32[7 * 32 + 8] * odd8 + DctCoef32x32[7 * 32 + 9] * odd9 + DctCoef32x32[7 * 32 + 10] * odd10 + DctCoef32x32[7 * 32 + 11] * odd11 + - DctCoef32x32[7 * 32 + 12] * odd12 + DctCoef32x32[7 * 32 + 13] * odd13 + DctCoef32x32[7 * 32 + 14] * odd14 + DctCoef32x32[7 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[9 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[9 * 32 + 0] * odd0 + DctCoef32x32[9 * 32 + 1] * odd1 + DctCoef32x32[9 * 32 + 2] * odd2 + DctCoef32x32[9 * 32 + 3] * odd3 + - DctCoef32x32[9 * 32 + 4] * odd4 + DctCoef32x32[9 * 32 + 5] * odd5 + DctCoef32x32[9 * 32 + 6] * odd6 + DctCoef32x32[9 * 32 + 7] * odd7 + - DctCoef32x32[9 * 32 + 8] * odd8 + DctCoef32x32[9 * 32 + 9] * odd9 + DctCoef32x32[9 * 32 + 10] * odd10 + DctCoef32x32[9 * 32 + 11] * odd11 + - DctCoef32x32[9 * 32 + 12] * odd12 + DctCoef32x32[9 * 32 + 13] * odd13 + DctCoef32x32[9 * 32 + 14] * odd14 + DctCoef32x32[9 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[11 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[11 * 32 + 0] * odd0 + DctCoef32x32[11 * 32 + 1] * odd1 + DctCoef32x32[11 * 32 + 2] * odd2 + DctCoef32x32[11 * 32 + 3] * odd3 + - DctCoef32x32[11 * 32 + 4] * odd4 + DctCoef32x32[11 * 32 + 5] * odd5 + DctCoef32x32[11 * 32 + 6] * odd6 + DctCoef32x32[11 * 32 + 7] * odd7 + - DctCoef32x32[11 * 32 + 8] * odd8 + DctCoef32x32[11 * 32 + 9] * odd9 + DctCoef32x32[11 * 32 + 10] * odd10 + DctCoef32x32[11 * 32 + 11] * odd11 + - DctCoef32x32[11 * 32 + 12] * odd12 + DctCoef32x32[11 * 32 + 13] * odd13 + DctCoef32x32[11 * 32 + 14] * odd14 + DctCoef32x32[11 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[13 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[13 * 32 + 0] * odd0 + DctCoef32x32[13 * 32 + 1] * odd1 + DctCoef32x32[13 * 32 + 2] * odd2 + DctCoef32x32[13 * 32 + 3] * odd3 + - DctCoef32x32[13 * 32 + 4] * odd4 + DctCoef32x32[13 * 32 + 5] * odd5 + DctCoef32x32[13 * 32 + 6] * odd6 + DctCoef32x32[13 * 32 + 7] * odd7 + - DctCoef32x32[13 * 32 + 8] * odd8 + DctCoef32x32[13 * 32 + 9] * odd9 + DctCoef32x32[13 * 32 + 10] * odd10 + DctCoef32x32[13 * 32 + 11] * odd11 + - DctCoef32x32[13 * 32 + 12] * odd12 + DctCoef32x32[13 * 32 + 13] * odd13 + DctCoef32x32[13 * 32 + 14] * odd14 + DctCoef32x32[13 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[15 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[15 * 32 + 0] * odd0 + DctCoef32x32[15 * 32 + 1] * odd1 + DctCoef32x32[15 * 32 + 2] * odd2 + DctCoef32x32[15 * 32 + 3] * odd3 + - DctCoef32x32[15 * 32 + 4] * odd4 + DctCoef32x32[15 * 32 + 5] * odd5 + DctCoef32x32[15 * 32 + 6] * odd6 + DctCoef32x32[15 * 32 + 7] * odd7 + - DctCoef32x32[15 * 32 + 8] * odd8 + DctCoef32x32[15 * 32 + 9] * odd9 + DctCoef32x32[15 * 32 + 10] * odd10 + DctCoef32x32[15 * 32 + 11] * odd11 + - DctCoef32x32[15 * 32 + 12] * odd12 + DctCoef32x32[15 * 32 + 13] * odd13 + DctCoef32x32[15 * 32 + 14] * odd14 + DctCoef32x32[15 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[17 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[17 * 32 + 0] * odd0 + DctCoef32x32[17 * 32 + 1] * odd1 + DctCoef32x32[17 * 32 + 2] * odd2 + DctCoef32x32[17 * 32 + 3] * odd3 + - DctCoef32x32[17 * 32 + 4] * odd4 + DctCoef32x32[17 * 32 + 5] * odd5 + DctCoef32x32[17 * 32 + 6] * odd6 + DctCoef32x32[17 * 32 + 7] * odd7 + - DctCoef32x32[17 * 32 + 8] * odd8 + DctCoef32x32[17 * 32 + 9] * odd9 + DctCoef32x32[17 * 32 + 10] * odd10 + DctCoef32x32[17 * 32 + 11] * odd11 + - DctCoef32x32[17 * 32 + 12] * odd12 + DctCoef32x32[17 * 32 + 13] * odd13 + DctCoef32x32[17 * 32 + 14] * odd14 + DctCoef32x32[17 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[19 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[19 * 32 + 0] * odd0 + DctCoef32x32[19 * 32 + 1] * odd1 + DctCoef32x32[19 * 32 + 2] * odd2 + DctCoef32x32[19 * 32 + 3] * odd3 + - DctCoef32x32[19 * 32 + 4] * odd4 + DctCoef32x32[19 * 32 + 5] * odd5 + DctCoef32x32[19 * 32 + 6] * odd6 + DctCoef32x32[19 * 32 + 7] * odd7 + - DctCoef32x32[19 * 32 + 8] * odd8 + DctCoef32x32[19 * 32 + 9] * odd9 + DctCoef32x32[19 * 32 + 10] * odd10 + DctCoef32x32[19 * 32 + 11] * odd11 + - DctCoef32x32[19 * 32 + 12] * odd12 + DctCoef32x32[19 * 32 + 13] * odd13 + DctCoef32x32[19 * 32 + 14] * odd14 + DctCoef32x32[19 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[21 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[21 * 32 + 0] * odd0 + DctCoef32x32[21 * 32 + 1] * odd1 + DctCoef32x32[21 * 32 + 2] * odd2 + DctCoef32x32[21 * 32 + 3] * odd3 + - DctCoef32x32[21 * 32 + 4] * odd4 + DctCoef32x32[21 * 32 + 5] * odd5 + DctCoef32x32[21 * 32 + 6] * odd6 + DctCoef32x32[21 * 32 + 7] * odd7 + - DctCoef32x32[21 * 32 + 8] * odd8 + DctCoef32x32[21 * 32 + 9] * odd9 + DctCoef32x32[21 * 32 + 10] * odd10 + DctCoef32x32[21 * 32 + 11] * odd11 + - DctCoef32x32[21 * 32 + 12] * odd12 + DctCoef32x32[21 * 32 + 13] * odd13 + DctCoef32x32[21 * 32 + 14] * odd14 + DctCoef32x32[21 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[23 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[23 * 32 + 0] * odd0 + DctCoef32x32[23 * 32 + 1] * odd1 + DctCoef32x32[23 * 32 + 2] * odd2 + DctCoef32x32[23 * 32 + 3] * odd3 + - DctCoef32x32[23 * 32 + 4] * odd4 + DctCoef32x32[23 * 32 + 5] * odd5 + DctCoef32x32[23 * 32 + 6] * odd6 + DctCoef32x32[23 * 32 + 7] * odd7 + - DctCoef32x32[23 * 32 + 8] * odd8 + DctCoef32x32[23 * 32 + 9] * odd9 + DctCoef32x32[23 * 32 + 10] * odd10 + DctCoef32x32[23 * 32 + 11] * odd11 + - DctCoef32x32[23 * 32 + 12] * odd12 + DctCoef32x32[23 * 32 + 13] * odd13 + DctCoef32x32[23 * 32 + 14] * odd14 + DctCoef32x32[23 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[25 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[25 * 32 + 0] * odd0 + DctCoef32x32[25 * 32 + 1] * odd1 + DctCoef32x32[25 * 32 + 2] * odd2 + DctCoef32x32[25 * 32 + 3] * odd3 + - DctCoef32x32[25 * 32 + 4] * odd4 + DctCoef32x32[25 * 32 + 5] * odd5 + DctCoef32x32[25 * 32 + 6] * odd6 + DctCoef32x32[25 * 32 + 7] * odd7 + - DctCoef32x32[25 * 32 + 8] * odd8 + DctCoef32x32[25 * 32 + 9] * odd9 + DctCoef32x32[25 * 32 + 10] * odd10 + DctCoef32x32[25 * 32 + 11] * odd11 + - DctCoef32x32[25 * 32 + 12] * odd12 + DctCoef32x32[25 * 32 + 13] * odd13 + DctCoef32x32[25 * 32 + 14] * odd14 + DctCoef32x32[25 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[27 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[27 * 32 + 0] * odd0 + DctCoef32x32[27 * 32 + 1] * odd1 + DctCoef32x32[27 * 32 + 2] * odd2 + DctCoef32x32[27 * 32 + 3] * odd3 + - DctCoef32x32[27 * 32 + 4] * odd4 + DctCoef32x32[27 * 32 + 5] * odd5 + DctCoef32x32[27 * 32 + 6] * odd6 + DctCoef32x32[27 * 32 + 7] * odd7 + - DctCoef32x32[27 * 32 + 8] * odd8 + DctCoef32x32[27 * 32 + 9] * odd9 + DctCoef32x32[27 * 32 + 10] * odd10 + DctCoef32x32[27 * 32 + 11] * odd11 + - DctCoef32x32[27 * 32 + 12] * odd12 + DctCoef32x32[27 * 32 + 13] * odd13 + DctCoef32x32[27 * 32 + 14] * odd14 + DctCoef32x32[27 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[29 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[29 * 32 + 0] * odd0 + DctCoef32x32[29 * 32 + 1] * odd1 + DctCoef32x32[29 * 32 + 2] * odd2 + DctCoef32x32[29 * 32 + 3] * odd3 + - DctCoef32x32[29 * 32 + 4] * odd4 + DctCoef32x32[29 * 32 + 5] * odd5 + DctCoef32x32[29 * 32 + 6] * odd6 + DctCoef32x32[29 * 32 + 7] * odd7 + - DctCoef32x32[29 * 32 + 8] * odd8 + DctCoef32x32[29 * 32 + 9] * odd9 + DctCoef32x32[29 * 32 + 10] * odd10 + DctCoef32x32[29 * 32 + 11] * odd11 + - DctCoef32x32[29 * 32 + 12] * odd12 + DctCoef32x32[29 * 32 + 13] * odd13 + DctCoef32x32[29 * 32 + 14] * odd14 + DctCoef32x32[29 * 32 + 15] * odd15 + - offset) >> shift); - transformCoefficients[31 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[31 * 32 + 0] * odd0 + DctCoef32x32[31 * 32 + 1] * odd1 + DctCoef32x32[31 * 32 + 2] * odd2 + DctCoef32x32[31 * 32 + 3] * odd3 + - DctCoef32x32[31 * 32 + 4] * odd4 + DctCoef32x32[31 * 32 + 5] * odd5 + DctCoef32x32[31 * 32 + 6] * odd6 + DctCoef32x32[31 * 32 + 7] * odd7 + - DctCoef32x32[31 * 32 + 8] * odd8 + DctCoef32x32[31 * 32 + 9] * odd9 + DctCoef32x32[31 * 32 + 10] * odd10 + DctCoef32x32[31 * 32 + 11] * odd11 + - DctCoef32x32[31 * 32 + 12] * odd12 + DctCoef32x32[31 * 32 + 13] * odd13 + DctCoef32x32[31 * 32 + 14] * odd14 + DctCoef32x32[31 * 32 + 15] * odd15 + - offset) >> shift); - } + EB_S16 even0, even1, even2, even3, even4, even5, even6, even7, even8, even9, even10, even11, even12, even13, even14, even15; + EB_S16 odd0, odd1, odd2, odd3, odd4, odd5, odd6, odd7, odd8, odd9, odd10, odd11, odd12, odd13, odd14, odd15; + EB_S16 evenEven0, evenEven1, evenEven2, evenEven3, evenEven4, evenEven5, evenEven6, evenEven7; + EB_S16 evenOdd0, evenOdd1, evenOdd2, evenOdd3, evenOdd4, evenOdd5, evenOdd6, evenOdd7; + EB_S32 evenEvenEven0, evenEvenEven1, evenEvenEven2, evenEvenEven3; + EB_S32 evenEvenOdd0, evenEvenOdd1, evenEvenOdd2, evenEvenOdd3; + EB_S32 evenEvenEvenEven0, evenEvenEvenEven1; + EB_S32 evenEvenEvenOdd0, evenEvenEvenOdd1; + EB_U32 rowIndex, rowStrideIndex; + const EB_S16 offset = 1 << (shift - 1); + + for (rowIndex = 0; rowIndex < 32; rowIndex++) { + rowStrideIndex = rowIndex*srcStride; + + //Calculating even and odd variables + even0 = residual[rowStrideIndex + 0] + residual[rowStrideIndex + 31]; + even1 = residual[rowStrideIndex + 1] + residual[rowStrideIndex + 30]; + even2 = residual[rowStrideIndex + 2] + residual[rowStrideIndex + 29]; + even3 = residual[rowStrideIndex + 3] + residual[rowStrideIndex + 28]; + even4 = residual[rowStrideIndex + 4] + residual[rowStrideIndex + 27]; + even5 = residual[rowStrideIndex + 5] + residual[rowStrideIndex + 26]; + even6 = residual[rowStrideIndex + 6] + residual[rowStrideIndex + 25]; + even7 = residual[rowStrideIndex + 7] + residual[rowStrideIndex + 24]; + even8 = residual[rowStrideIndex + 8] + residual[rowStrideIndex + 23]; + even9 = residual[rowStrideIndex + 9] + residual[rowStrideIndex + 22]; + even10 = residual[rowStrideIndex + 10] + residual[rowStrideIndex + 21]; + even11 = residual[rowStrideIndex + 11] + residual[rowStrideIndex + 20]; + even12 = residual[rowStrideIndex + 12] + residual[rowStrideIndex + 19]; + even13 = residual[rowStrideIndex + 13] + residual[rowStrideIndex + 18]; + even14 = residual[rowStrideIndex + 14] + residual[rowStrideIndex + 17]; + even15 = residual[rowStrideIndex + 15] + residual[rowStrideIndex + 16]; + + odd0 = residual[rowStrideIndex + 0] - residual[rowStrideIndex + 31]; + odd1 = residual[rowStrideIndex + 1] - residual[rowStrideIndex + 30]; + odd2 = residual[rowStrideIndex + 2] - residual[rowStrideIndex + 29]; + odd3 = residual[rowStrideIndex + 3] - residual[rowStrideIndex + 28]; + odd4 = residual[rowStrideIndex + 4] - residual[rowStrideIndex + 27]; + odd5 = residual[rowStrideIndex + 5] - residual[rowStrideIndex + 26]; + odd6 = residual[rowStrideIndex + 6] - residual[rowStrideIndex + 25]; + odd7 = residual[rowStrideIndex + 7] - residual[rowStrideIndex + 24]; + odd8 = residual[rowStrideIndex + 8] - residual[rowStrideIndex + 23]; + odd9 = residual[rowStrideIndex + 9] - residual[rowStrideIndex + 22]; + odd10 = residual[rowStrideIndex + 10] - residual[rowStrideIndex + 21]; + odd11 = residual[rowStrideIndex + 11] - residual[rowStrideIndex + 20]; + odd12 = residual[rowStrideIndex + 12] - residual[rowStrideIndex + 19]; + odd13 = residual[rowStrideIndex + 13] - residual[rowStrideIndex + 18]; + odd14 = residual[rowStrideIndex + 14] - residual[rowStrideIndex + 17]; + odd15 = residual[rowStrideIndex + 15] - residual[rowStrideIndex + 16]; + + //Calculating evenEven and evenOdd variables + evenEven0 = even0 + even15; + evenEven1 = even1 + even14; + evenEven2 = even2 + even13; + evenEven3 = even3 + even12; + evenEven4 = even4 + even11; + evenEven5 = even5 + even10; + evenEven6 = even6 + even9; + evenEven7 = even7 + even8; + + evenOdd0 = even0 - even15; + evenOdd1 = even1 - even14; + evenOdd2 = even2 - even13; + evenOdd3 = even3 - even12; + evenOdd4 = even4 - even11; + evenOdd5 = even5 - even10; + evenOdd6 = even6 - even9; + evenOdd7 = even7 - even8; + + //Calculating evenEvenEven and evenEvenOdd variables + evenEvenEven0 = evenEven0 + evenEven7; + evenEvenEven1 = evenEven1 + evenEven6; + evenEvenEven2 = evenEven2 + evenEven5; + evenEvenEven3 = evenEven3 + evenEven4; + + evenEvenOdd0 = evenEven0 - evenEven7; + evenEvenOdd1 = evenEven1 - evenEven6; + evenEvenOdd2 = evenEven2 - evenEven5; + evenEvenOdd3 = evenEven3 - evenEven4; + + //Calculating evenEvenEvenEven and evenEvenEvenOdd variables + evenEvenEvenEven0 = evenEvenEven0 + evenEvenEven3; + evenEvenEvenEven1 = evenEvenEven1 + evenEvenEven2; + + evenEvenEvenOdd0 = evenEvenEven0 - evenEvenEven3; + evenEvenEvenOdd1 = evenEvenEven1 - evenEvenEven2; + + transformCoefficients[0 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[0 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[0 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); + transformCoefficients[8 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[8 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[8 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); + transformCoefficients[16 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[16 * 32 + 0] * evenEvenEvenEven0 + DctCoef32x32[16 * 32 + 1] * evenEvenEvenEven1 + offset) >> shift); + transformCoefficients[24 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[24 * 32 + 0] * evenEvenEvenOdd0 + DctCoef32x32[24 * 32 + 1] * evenEvenEvenOdd1 + offset) >> shift); + + transformCoefficients[4 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[4 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[4 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[4 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[4 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + transformCoefficients[12 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[12 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[12 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[12 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[12 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + transformCoefficients[20 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[20 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[20 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[20 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[20 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + transformCoefficients[28 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[28 * 32 + 0] * evenEvenOdd0 + DctCoef32x32[28 * 32 + 1] * evenEvenOdd1 + + DctCoef32x32[28 * 32 + 2] * evenEvenOdd2 + DctCoef32x32[28 * 32 + 3] * evenEvenOdd3 + offset) >> shift); + + transformCoefficients[2 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[2 * 32 + 0] * evenOdd0 + DctCoef32x32[2 * 32 + 1] * evenOdd1 + + DctCoef32x32[2 * 32 + 2] * evenOdd2 + DctCoef32x32[2 * 32 + 3] * evenOdd3 + + DctCoef32x32[2 * 32 + 4] * evenOdd4 + DctCoef32x32[2 * 32 + 5] * evenOdd5 + + DctCoef32x32[2 * 32 + 6] * evenOdd6 + DctCoef32x32[2 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[6 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[6 * 32 + 0] * evenOdd0 + DctCoef32x32[6 * 32 + 1] * evenOdd1 + + DctCoef32x32[6 * 32 + 2] * evenOdd2 + DctCoef32x32[6 * 32 + 3] * evenOdd3 + + DctCoef32x32[6 * 32 + 4] * evenOdd4 + DctCoef32x32[6 * 32 + 5] * evenOdd5 + + DctCoef32x32[6 * 32 + 6] * evenOdd6 + DctCoef32x32[6 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[10 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[10 * 32 + 0] * evenOdd0 + DctCoef32x32[10 * 32 + 1] * evenOdd1 + + DctCoef32x32[10 * 32 + 2] * evenOdd2 + DctCoef32x32[10 * 32 + 3] * evenOdd3 + + DctCoef32x32[10 * 32 + 4] * evenOdd4 + DctCoef32x32[10 * 32 + 5] * evenOdd5 + + DctCoef32x32[10 * 32 + 6] * evenOdd6 + DctCoef32x32[10 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[14 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[14 * 32 + 0] * evenOdd0 + DctCoef32x32[14 * 32 + 1] * evenOdd1 + + DctCoef32x32[14 * 32 + 2] * evenOdd2 + DctCoef32x32[14 * 32 + 3] * evenOdd3 + + DctCoef32x32[14 * 32 + 4] * evenOdd4 + DctCoef32x32[14 * 32 + 5] * evenOdd5 + + DctCoef32x32[14 * 32 + 6] * evenOdd6 + DctCoef32x32[14 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[18 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[18 * 32 + 0] * evenOdd0 + DctCoef32x32[18 * 32 + 1] * evenOdd1 + + DctCoef32x32[18 * 32 + 2] * evenOdd2 + DctCoef32x32[18 * 32 + 3] * evenOdd3 + + DctCoef32x32[18 * 32 + 4] * evenOdd4 + DctCoef32x32[18 * 32 + 5] * evenOdd5 + + DctCoef32x32[18 * 32 + 6] * evenOdd6 + DctCoef32x32[18 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[22 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[22 * 32 + 0] * evenOdd0 + DctCoef32x32[22 * 32 + 1] * evenOdd1 + + DctCoef32x32[22 * 32 + 2] * evenOdd2 + DctCoef32x32[22 * 32 + 3] * evenOdd3 + + DctCoef32x32[22 * 32 + 4] * evenOdd4 + DctCoef32x32[22 * 32 + 5] * evenOdd5 + + DctCoef32x32[22 * 32 + 6] * evenOdd6 + DctCoef32x32[22 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[26 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[26 * 32 + 0] * evenOdd0 + DctCoef32x32[26 * 32 + 1] * evenOdd1 + + DctCoef32x32[26 * 32 + 2] * evenOdd2 + DctCoef32x32[26 * 32 + 3] * evenOdd3 + + DctCoef32x32[26 * 32 + 4] * evenOdd4 + DctCoef32x32[26 * 32 + 5] * evenOdd5 + + DctCoef32x32[26 * 32 + 6] * evenOdd6 + DctCoef32x32[26 * 32 + 7] * evenOdd7 + offset) >> shift); + transformCoefficients[30 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[30 * 32 + 0] * evenOdd0 + DctCoef32x32[30 * 32 + 1] * evenOdd1 + + DctCoef32x32[30 * 32 + 2] * evenOdd2 + DctCoef32x32[30 * 32 + 3] * evenOdd3 + + DctCoef32x32[30 * 32 + 4] * evenOdd4 + DctCoef32x32[30 * 32 + 5] * evenOdd5 + + DctCoef32x32[30 * 32 + 6] * evenOdd6 + DctCoef32x32[30 * 32 + 7] * evenOdd7 + offset) >> shift); + + transformCoefficients[1 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[1 * 32 + 0] * odd0 + DctCoef32x32[1 * 32 + 1] * odd1 + DctCoef32x32[1 * 32 + 2] * odd2 + DctCoef32x32[1 * 32 + 3] * odd3 + + DctCoef32x32[1 * 32 + 4] * odd4 + DctCoef32x32[1 * 32 + 5] * odd5 + DctCoef32x32[1 * 32 + 6] * odd6 + DctCoef32x32[1 * 32 + 7] * odd7 + + DctCoef32x32[1 * 32 + 8] * odd8 + DctCoef32x32[1 * 32 + 9] * odd9 + DctCoef32x32[1 * 32 + 10] * odd10 + DctCoef32x32[1 * 32 + 11] * odd11 + + DctCoef32x32[1 * 32 + 12] * odd12 + DctCoef32x32[1 * 32 + 13] * odd13 + DctCoef32x32[1 * 32 + 14] * odd14 + DctCoef32x32[1 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[3 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[3 * 32 + 0] * odd0 + DctCoef32x32[3 * 32 + 1] * odd1 + DctCoef32x32[3 * 32 + 2] * odd2 + DctCoef32x32[3 * 32 + 3] * odd3 + + DctCoef32x32[3 * 32 + 4] * odd4 + DctCoef32x32[3 * 32 + 5] * odd5 + DctCoef32x32[3 * 32 + 6] * odd6 + DctCoef32x32[3 * 32 + 7] * odd7 + + DctCoef32x32[3 * 32 + 8] * odd8 + DctCoef32x32[3 * 32 + 9] * odd9 + DctCoef32x32[3 * 32 + 10] * odd10 + DctCoef32x32[3 * 32 + 11] * odd11 + + DctCoef32x32[3 * 32 + 12] * odd12 + DctCoef32x32[3 * 32 + 13] * odd13 + DctCoef32x32[3 * 32 + 14] * odd14 + DctCoef32x32[3 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[5 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[5 * 32 + 0] * odd0 + DctCoef32x32[5 * 32 + 1] * odd1 + DctCoef32x32[5 * 32 + 2] * odd2 + DctCoef32x32[5 * 32 + 3] * odd3 + + DctCoef32x32[5 * 32 + 4] * odd4 + DctCoef32x32[5 * 32 + 5] * odd5 + DctCoef32x32[5 * 32 + 6] * odd6 + DctCoef32x32[5 * 32 + 7] * odd7 + + DctCoef32x32[5 * 32 + 8] * odd8 + DctCoef32x32[5 * 32 + 9] * odd9 + DctCoef32x32[5 * 32 + 10] * odd10 + DctCoef32x32[5 * 32 + 11] * odd11 + + DctCoef32x32[5 * 32 + 12] * odd12 + DctCoef32x32[5 * 32 + 13] * odd13 + DctCoef32x32[5 * 32 + 14] * odd14 + DctCoef32x32[5 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[7 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[7 * 32 + 0] * odd0 + DctCoef32x32[7 * 32 + 1] * odd1 + DctCoef32x32[7 * 32 + 2] * odd2 + DctCoef32x32[7 * 32 + 3] * odd3 + + DctCoef32x32[7 * 32 + 4] * odd4 + DctCoef32x32[7 * 32 + 5] * odd5 + DctCoef32x32[7 * 32 + 6] * odd6 + DctCoef32x32[7 * 32 + 7] * odd7 + + DctCoef32x32[7 * 32 + 8] * odd8 + DctCoef32x32[7 * 32 + 9] * odd9 + DctCoef32x32[7 * 32 + 10] * odd10 + DctCoef32x32[7 * 32 + 11] * odd11 + + DctCoef32x32[7 * 32 + 12] * odd12 + DctCoef32x32[7 * 32 + 13] * odd13 + DctCoef32x32[7 * 32 + 14] * odd14 + DctCoef32x32[7 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[9 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[9 * 32 + 0] * odd0 + DctCoef32x32[9 * 32 + 1] * odd1 + DctCoef32x32[9 * 32 + 2] * odd2 + DctCoef32x32[9 * 32 + 3] * odd3 + + DctCoef32x32[9 * 32 + 4] * odd4 + DctCoef32x32[9 * 32 + 5] * odd5 + DctCoef32x32[9 * 32 + 6] * odd6 + DctCoef32x32[9 * 32 + 7] * odd7 + + DctCoef32x32[9 * 32 + 8] * odd8 + DctCoef32x32[9 * 32 + 9] * odd9 + DctCoef32x32[9 * 32 + 10] * odd10 + DctCoef32x32[9 * 32 + 11] * odd11 + + DctCoef32x32[9 * 32 + 12] * odd12 + DctCoef32x32[9 * 32 + 13] * odd13 + DctCoef32x32[9 * 32 + 14] * odd14 + DctCoef32x32[9 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[11 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[11 * 32 + 0] * odd0 + DctCoef32x32[11 * 32 + 1] * odd1 + DctCoef32x32[11 * 32 + 2] * odd2 + DctCoef32x32[11 * 32 + 3] * odd3 + + DctCoef32x32[11 * 32 + 4] * odd4 + DctCoef32x32[11 * 32 + 5] * odd5 + DctCoef32x32[11 * 32 + 6] * odd6 + DctCoef32x32[11 * 32 + 7] * odd7 + + DctCoef32x32[11 * 32 + 8] * odd8 + DctCoef32x32[11 * 32 + 9] * odd9 + DctCoef32x32[11 * 32 + 10] * odd10 + DctCoef32x32[11 * 32 + 11] * odd11 + + DctCoef32x32[11 * 32 + 12] * odd12 + DctCoef32x32[11 * 32 + 13] * odd13 + DctCoef32x32[11 * 32 + 14] * odd14 + DctCoef32x32[11 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[13 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[13 * 32 + 0] * odd0 + DctCoef32x32[13 * 32 + 1] * odd1 + DctCoef32x32[13 * 32 + 2] * odd2 + DctCoef32x32[13 * 32 + 3] * odd3 + + DctCoef32x32[13 * 32 + 4] * odd4 + DctCoef32x32[13 * 32 + 5] * odd5 + DctCoef32x32[13 * 32 + 6] * odd6 + DctCoef32x32[13 * 32 + 7] * odd7 + + DctCoef32x32[13 * 32 + 8] * odd8 + DctCoef32x32[13 * 32 + 9] * odd9 + DctCoef32x32[13 * 32 + 10] * odd10 + DctCoef32x32[13 * 32 + 11] * odd11 + + DctCoef32x32[13 * 32 + 12] * odd12 + DctCoef32x32[13 * 32 + 13] * odd13 + DctCoef32x32[13 * 32 + 14] * odd14 + DctCoef32x32[13 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[15 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[15 * 32 + 0] * odd0 + DctCoef32x32[15 * 32 + 1] * odd1 + DctCoef32x32[15 * 32 + 2] * odd2 + DctCoef32x32[15 * 32 + 3] * odd3 + + DctCoef32x32[15 * 32 + 4] * odd4 + DctCoef32x32[15 * 32 + 5] * odd5 + DctCoef32x32[15 * 32 + 6] * odd6 + DctCoef32x32[15 * 32 + 7] * odd7 + + DctCoef32x32[15 * 32 + 8] * odd8 + DctCoef32x32[15 * 32 + 9] * odd9 + DctCoef32x32[15 * 32 + 10] * odd10 + DctCoef32x32[15 * 32 + 11] * odd11 + + DctCoef32x32[15 * 32 + 12] * odd12 + DctCoef32x32[15 * 32 + 13] * odd13 + DctCoef32x32[15 * 32 + 14] * odd14 + DctCoef32x32[15 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[17 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[17 * 32 + 0] * odd0 + DctCoef32x32[17 * 32 + 1] * odd1 + DctCoef32x32[17 * 32 + 2] * odd2 + DctCoef32x32[17 * 32 + 3] * odd3 + + DctCoef32x32[17 * 32 + 4] * odd4 + DctCoef32x32[17 * 32 + 5] * odd5 + DctCoef32x32[17 * 32 + 6] * odd6 + DctCoef32x32[17 * 32 + 7] * odd7 + + DctCoef32x32[17 * 32 + 8] * odd8 + DctCoef32x32[17 * 32 + 9] * odd9 + DctCoef32x32[17 * 32 + 10] * odd10 + DctCoef32x32[17 * 32 + 11] * odd11 + + DctCoef32x32[17 * 32 + 12] * odd12 + DctCoef32x32[17 * 32 + 13] * odd13 + DctCoef32x32[17 * 32 + 14] * odd14 + DctCoef32x32[17 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[19 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[19 * 32 + 0] * odd0 + DctCoef32x32[19 * 32 + 1] * odd1 + DctCoef32x32[19 * 32 + 2] * odd2 + DctCoef32x32[19 * 32 + 3] * odd3 + + DctCoef32x32[19 * 32 + 4] * odd4 + DctCoef32x32[19 * 32 + 5] * odd5 + DctCoef32x32[19 * 32 + 6] * odd6 + DctCoef32x32[19 * 32 + 7] * odd7 + + DctCoef32x32[19 * 32 + 8] * odd8 + DctCoef32x32[19 * 32 + 9] * odd9 + DctCoef32x32[19 * 32 + 10] * odd10 + DctCoef32x32[19 * 32 + 11] * odd11 + + DctCoef32x32[19 * 32 + 12] * odd12 + DctCoef32x32[19 * 32 + 13] * odd13 + DctCoef32x32[19 * 32 + 14] * odd14 + DctCoef32x32[19 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[21 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[21 * 32 + 0] * odd0 + DctCoef32x32[21 * 32 + 1] * odd1 + DctCoef32x32[21 * 32 + 2] * odd2 + DctCoef32x32[21 * 32 + 3] * odd3 + + DctCoef32x32[21 * 32 + 4] * odd4 + DctCoef32x32[21 * 32 + 5] * odd5 + DctCoef32x32[21 * 32 + 6] * odd6 + DctCoef32x32[21 * 32 + 7] * odd7 + + DctCoef32x32[21 * 32 + 8] * odd8 + DctCoef32x32[21 * 32 + 9] * odd9 + DctCoef32x32[21 * 32 + 10] * odd10 + DctCoef32x32[21 * 32 + 11] * odd11 + + DctCoef32x32[21 * 32 + 12] * odd12 + DctCoef32x32[21 * 32 + 13] * odd13 + DctCoef32x32[21 * 32 + 14] * odd14 + DctCoef32x32[21 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[23 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[23 * 32 + 0] * odd0 + DctCoef32x32[23 * 32 + 1] * odd1 + DctCoef32x32[23 * 32 + 2] * odd2 + DctCoef32x32[23 * 32 + 3] * odd3 + + DctCoef32x32[23 * 32 + 4] * odd4 + DctCoef32x32[23 * 32 + 5] * odd5 + DctCoef32x32[23 * 32 + 6] * odd6 + DctCoef32x32[23 * 32 + 7] * odd7 + + DctCoef32x32[23 * 32 + 8] * odd8 + DctCoef32x32[23 * 32 + 9] * odd9 + DctCoef32x32[23 * 32 + 10] * odd10 + DctCoef32x32[23 * 32 + 11] * odd11 + + DctCoef32x32[23 * 32 + 12] * odd12 + DctCoef32x32[23 * 32 + 13] * odd13 + DctCoef32x32[23 * 32 + 14] * odd14 + DctCoef32x32[23 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[25 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[25 * 32 + 0] * odd0 + DctCoef32x32[25 * 32 + 1] * odd1 + DctCoef32x32[25 * 32 + 2] * odd2 + DctCoef32x32[25 * 32 + 3] * odd3 + + DctCoef32x32[25 * 32 + 4] * odd4 + DctCoef32x32[25 * 32 + 5] * odd5 + DctCoef32x32[25 * 32 + 6] * odd6 + DctCoef32x32[25 * 32 + 7] * odd7 + + DctCoef32x32[25 * 32 + 8] * odd8 + DctCoef32x32[25 * 32 + 9] * odd9 + DctCoef32x32[25 * 32 + 10] * odd10 + DctCoef32x32[25 * 32 + 11] * odd11 + + DctCoef32x32[25 * 32 + 12] * odd12 + DctCoef32x32[25 * 32 + 13] * odd13 + DctCoef32x32[25 * 32 + 14] * odd14 + DctCoef32x32[25 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[27 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[27 * 32 + 0] * odd0 + DctCoef32x32[27 * 32 + 1] * odd1 + DctCoef32x32[27 * 32 + 2] * odd2 + DctCoef32x32[27 * 32 + 3] * odd3 + + DctCoef32x32[27 * 32 + 4] * odd4 + DctCoef32x32[27 * 32 + 5] * odd5 + DctCoef32x32[27 * 32 + 6] * odd6 + DctCoef32x32[27 * 32 + 7] * odd7 + + DctCoef32x32[27 * 32 + 8] * odd8 + DctCoef32x32[27 * 32 + 9] * odd9 + DctCoef32x32[27 * 32 + 10] * odd10 + DctCoef32x32[27 * 32 + 11] * odd11 + + DctCoef32x32[27 * 32 + 12] * odd12 + DctCoef32x32[27 * 32 + 13] * odd13 + DctCoef32x32[27 * 32 + 14] * odd14 + DctCoef32x32[27 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[29 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[29 * 32 + 0] * odd0 + DctCoef32x32[29 * 32 + 1] * odd1 + DctCoef32x32[29 * 32 + 2] * odd2 + DctCoef32x32[29 * 32 + 3] * odd3 + + DctCoef32x32[29 * 32 + 4] * odd4 + DctCoef32x32[29 * 32 + 5] * odd5 + DctCoef32x32[29 * 32 + 6] * odd6 + DctCoef32x32[29 * 32 + 7] * odd7 + + DctCoef32x32[29 * 32 + 8] * odd8 + DctCoef32x32[29 * 32 + 9] * odd9 + DctCoef32x32[29 * 32 + 10] * odd10 + DctCoef32x32[29 * 32 + 11] * odd11 + + DctCoef32x32[29 * 32 + 12] * odd12 + DctCoef32x32[29 * 32 + 13] * odd13 + DctCoef32x32[29 * 32 + 14] * odd14 + DctCoef32x32[29 * 32 + 15] * odd15 + + offset) >> shift); + transformCoefficients[31 * dstStride + rowIndex] = (EB_S16)((DctCoef32x32[31 * 32 + 0] * odd0 + DctCoef32x32[31 * 32 + 1] * odd1 + DctCoef32x32[31 * 32 + 2] * odd2 + DctCoef32x32[31 * 32 + 3] * odd3 + + DctCoef32x32[31 * 32 + 4] * odd4 + DctCoef32x32[31 * 32 + 5] * odd5 + DctCoef32x32[31 * 32 + 6] * odd6 + DctCoef32x32[31 * 32 + 7] * odd7 + + DctCoef32x32[31 * 32 + 8] * odd8 + DctCoef32x32[31 * 32 + 9] * odd9 + DctCoef32x32[31 * 32 + 10] * odd10 + DctCoef32x32[31 * 32 + 11] * odd11 + + DctCoef32x32[31 * 32 + 12] * odd12 + DctCoef32x32[31 * 32 + 13] * odd13 + DctCoef32x32[31 * 32 + 14] * odd14 + DctCoef32x32[31 * 32 + 15] * odd15 + + offset) >> shift); + } } /********************************************************************* @@ -1632,35 +1632,35 @@ void Transform32x32( } void Transform32x32Estimate( - EB_S16 *residual, - const EB_U32 srcStride, - EB_S16 *transformCoefficients, - const EB_U32 dstStride, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement) + EB_S16 *residual, + const EB_U32 srcStride, + EB_S16 *transformCoefficients, + const EB_U32 dstStride, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement) { - const EB_U32 shift1st = 6 + bitIncrement; // 2;//log2(trasnform size)-1+TRANS_BIT_INCREMENT - const EB_U32 shift2nd = 9; // log2(trasnform size) + 6 + const EB_U32 shift1st = 6 + bitIncrement; // 2;//log2(trasnform size)-1+TRANS_BIT_INCREMENT + const EB_U32 shift2nd = 9; // log2(trasnform size) + 6 - const EB_U32 transformInnerArrayStride = 32; + const EB_U32 transformInnerArrayStride = 32; - PartialButterfly32Estimate( - residual, - transformInnerArrayPtr, - srcStride, - transformInnerArrayStride, - shift1st); + PartialButterfly32Estimate( + residual, + transformInnerArrayPtr, + srcStride, + transformInnerArrayStride, + shift1st); - PartialButterfly32Estimate( - transformInnerArrayPtr, - transformCoefficients, - transformInnerArrayStride, - dstStride, - shift2nd); + PartialButterfly32Estimate( + transformInnerArrayPtr, + transformCoefficients, + transformInnerArrayStride, + dstStride, + shift2nd); - return; + return; } /********************************************************************* diff --git a/Source/Lib/C_DEFAULT/EbTransforms_C.h b/Source/Lib/C_DEFAULT/EbTransforms_C.h index 57e7efd38..93455ec18 100644 --- a/Source/Lib/C_DEFAULT/EbTransforms_C.h +++ b/Source/Lib/C_DEFAULT/EbTransforms_C.h @@ -14,7 +14,7 @@ extern "C" { #define SHIFT_INV_1ST 7 #define SHIFT_INV_2ND 12 - + extern void QuantizeInvQuantize( EB_S16 *coeff, const EB_U32 coeffStride, @@ -27,38 +27,38 @@ extern void QuantizeInvQuantize( const EB_S32 iq_offset, const EB_S32 shiftNum, const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); void UpdateQiQCoef_R( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag); + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag); extern void UpdateQiQCoef( - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - const EB_U32 coeffStride, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, - EB_U32 componentType, - EB_PICTURE sliceType, - EB_U32 temporalLayer, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag); + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + const EB_U32 coeffStride, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, + EB_U32 componentType, + EB_PICTURE sliceType, + EB_U32 temporalLayer, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag); void Transform32x32( EB_S16 *residual, diff --git a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c index 05b7a8075..d0649d137 100644 --- a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c +++ b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.c @@ -16,7 +16,7 @@ #include "EbErrorHandling.h" #include "EbModeDecisionProcess.h" -static const EB_U32 mvMergeCandIndexArrayForFillingUp[2][12] = +static const EB_U32 mvMergeCandIndexArrayForFillingUp[2][12] = { {0 , 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3}, {1 , 0, 2, 0, 2, 1, 3, 0, 3, 1, 3, 2} @@ -87,11 +87,11 @@ static inline EB_BOOL GetNonScalingSpatialAMVP( EbReferenceObject_t *referenceObject; EB_U64 refPicPOC; EB_REFLIST refPicList; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; CHECK_REPORT_ERROR( (neighbourPuPtr != EB_NULL), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR2); if (neighbourPuPtr != EB_NULL) { @@ -152,7 +152,7 @@ static inline EB_BOOL GetNonScalingSpatialAMVP( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR3); } } @@ -164,9 +164,9 @@ static inline EB_BOOL GetNonScalingSpatialAMVP( return availability; } -/** GetNonScalingSpatialAMVP_V2() +/** GetNonScalingSpatialAMVP_V2() is used to generate the spatial AMVP candidate by using the non-scaling method. - + It returns the availability of the spatial AMVP candidate. */ static inline EB_BOOL GetNonScalingSpatialAMVP_V2( @@ -184,50 +184,50 @@ static inline EB_BOOL GetNonScalingSpatialAMVP_V2( EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - + switch(mvUnit->predDirection){ case UNI_PRED_LIST_0: - + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicPOC = referenceObject->refPOC; availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); if(availability){ - *MVPCandx = mvUnit->mv[REF_LIST_0].x; - *MVPCandy = mvUnit->mv[REF_LIST_0].y; + *MVPCandx = mvUnit->mv[REF_LIST_0].x; + *MVPCandy = mvUnit->mv[REF_LIST_0].y; } - + break; case UNI_PRED_LIST_1: referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; refPicPOC = referenceObject->refPOC; - availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); + availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); if(availability){ - *MVPCandx = mvUnit->mv[REF_LIST_1].x; - *MVPCandy = mvUnit->mv[REF_LIST_1].y; + *MVPCandx = mvUnit->mv[REF_LIST_1].x; + *MVPCandy = mvUnit->mv[REF_LIST_1].y; } break; case BI_PRED: - // Check the AMVP in targetRefPicList - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[targetRefPicList]->objectPtr; + // Check the AMVP in targetRefPicList + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[targetRefPicList]->objectPtr; refPicPOC = referenceObject->refPOC; availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); - if(availability){ - *MVPCandx = mvUnit->mv[targetRefPicList].x; - *MVPCandy = mvUnit->mv[targetRefPicList].y; + if(availability){ + *MVPCandx = mvUnit->mv[targetRefPicList].x; + *MVPCandy = mvUnit->mv[targetRefPicList].y; }else{ // Check the AMVP in 1 - targetRefPicList - refPicList = (EB_REFLIST) (1 - targetRefPicList); - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[refPicList]->objectPtr; + refPicList = (EB_REFLIST) (1 - targetRefPicList); + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[refPicList]->objectPtr; refPicPOC = referenceObject->refPOC; - availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); + availability = (EB_BOOL)(targetRefPicPOC == refPicPOC); *MVPCandx = mvUnit->mv[refPicList].x; *MVPCandy = mvUnit->mv[refPicList].y; - + } break; @@ -241,7 +241,7 @@ static inline EB_BOOL GetNonScalingSpatialAMVP_V2( return availability; } - /** GetScalingSpatialAMVP() + /** GetScalingSpatialAMVP() is used to generate the spatial AMVP candidate by using the scaling method. */ static inline EB_BOOL GetScalingSpatialAMVP_V2( @@ -258,22 +258,22 @@ static inline EB_BOOL GetScalingSpatialAMVP_V2( EB_U64 refPicPOC; EB_REFLIST refPicList ; - + curPicPOC = pictureControlSetPtr->pictureNumber; - - + + if(mvUnit->predDirection == BI_PRED) refPicList = targetRefPicList; else refPicList = (EB_REFLIST)mvUnit->predDirection; - + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[refPicList]->objectPtr; refPicPOC = referenceObject->refPOC; - - *MVPCandx = mvUnit->mv[refPicList].x; - *MVPCandy = mvUnit->mv[refPicList].y; + + *MVPCandx = mvUnit->mv[refPicList].x; + *MVPCandy = mvUnit->mv[refPicList].y; ScaleMV( curPicPOC, @@ -303,10 +303,10 @@ static inline EB_BOOL GetScalingSpatialAMVP( EB_U64 refPicPOC; EB_REFLIST refPicList = REF_LIST_0; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; /*CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR7);*/ curPicPOC = pictureControlSetPtr->pictureNumber; @@ -330,7 +330,7 @@ static inline EB_BOOL GetScalingSpatialAMVP( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR1); } @@ -372,7 +372,7 @@ static EB_BOOL GetSpatialMVPPosAx( EB_U8 puAvailability = (EB_U8) puA0Availability + (((EB_U8) puA1Availability) << 1); EB_BOOL MVPAxAvailability = EB_FALSE; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; switch(puAvailability) { @@ -454,30 +454,30 @@ static EB_BOOL GetSpatialMVPPosAx( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR4); break; } return MVPAxAvailability; } - -/** GetSpatialMVPPosAx_V3() - same as GetSpatialMVPPosAx - is used to generate the spatial MVP candidate in position A0 or A1 (if needed). - It returns the availability of the candidate. + +/** GetSpatialMVPPosAx_V3() + same as GetSpatialMVPPosAx + is used to generate the spatial MVP candidate in position A0 or A1 (if needed). + It returns the availability of the candidate. */ static EB_BOOL GetSpatialMVPPosAx_V3( - MvUnit_t *mvUnitA0, // Input parameter, PU pointer of position A0. - MvUnit_t *mvUnitA1, // Input parameter, PU pointer of position A1. - EB_U8 puAvailability, + MvUnit_t *mvUnitA0, // Input parameter, PU pointer of position A0. + MvUnit_t *mvUnitA1, // Input parameter, PU pointer of position A1. + EB_U8 puAvailability, EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the AMVP is searching for. EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the AMVP is searcing for. EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. PictureControlSet_t *pictureControlSetPtr) { - + EB_BOOL MVPAxAvailability = EB_FALSE; EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; @@ -561,11 +561,11 @@ static EB_BOOL GetSpatialMVPPosAx_V3( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR4); + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR4); break; } - + return MVPAxAvailability; } @@ -595,7 +595,7 @@ static EB_BOOL GetNonScalingSpatialMVPPosBx( EB_BOOL puB2Availability = (EB_BOOL) (puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); EB_U8 puAvailability = (EB_U8) puB0Availability + (((EB_U8) puB1Availability) << 1) + (((EB_U8) puB2Availability) << 2); - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; switch(puAvailability) { @@ -732,9 +732,9 @@ static EB_BOOL GetNonScalingSpatialMVPPosBx( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR5); - break; + break; } return MVPBxAvailability; @@ -767,7 +767,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx( EB_BOOL puB2Availability = (EB_BOOL)(puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); EB_U8 puAvailability = (EB_U8)puB0Availability + (((EB_U8)puB1Availability)<<1) + (((EB_U8)puB2Availability<<2)); - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; switch(puAvailability) { @@ -910,7 +910,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR4); break; } @@ -924,181 +924,181 @@ is used to generate the spatial MVP candidate in position B0, B1 (if needed) or and no MV scaling is used. */ static EB_BOOL GetNonScalingSpatialMVPPosBx_V3( - //PredictionUnit_t *puB0Ptr, PredictionUnit_t *puB1Ptr, PredictionUnit_t *puB2Ptr, - MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. - MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. - MvUnit_t *mvUnitB2, // Input parameter, PU pointer of position B2. - EB_U8 puAvailability, - //EB_BOOL puB0Available, - //EB_BOOL puB1Available, - //EB_BOOL puB2Available, - //EB_MODETYPE puB0CodingMode, - //EB_MODETYPE puB1CodingMode, - //EB_MODETYPE puB2CodingMode, - EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the AMVP is searching for. - EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the AMVP is searcing for. - EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. - EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. - PictureControlSet_t *pictureControlSetPtr) + //PredictionUnit_t *puB0Ptr, PredictionUnit_t *puB1Ptr, PredictionUnit_t *puB2Ptr, + MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. + MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. + MvUnit_t *mvUnitB2, // Input parameter, PU pointer of position B2. + EB_U8 puAvailability, + //EB_BOOL puB0Available, + //EB_BOOL puB1Available, + //EB_BOOL puB2Available, + //EB_MODETYPE puB0CodingMode, + //EB_MODETYPE puB1CodingMode, + //EB_MODETYPE puB2CodingMode, + EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the AMVP is searching for. + EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the AMVP is searcing for. + EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. + EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. + PictureControlSet_t *pictureControlSetPtr) { - //CHKN move these avail outside - EB_BOOL MVPBxAvailability = EB_FALSE; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - //EB_BOOL puB0Availability = (EB_BOOL) (puB0Available == EB_TRUE && puB0CodingMode != INTRA_MODE); - //EB_BOOL puB1Availability = (EB_BOOL) (puB1Available == EB_TRUE && puB1CodingMode != INTRA_MODE); - //EB_BOOL puB2Availability = (EB_BOOL) (puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); - //EB_U8 puAvailability = (EB_U8) puB0Availability + (((EB_U8) puB1Availability) << 1) + (((EB_U8) puB2Availability) << 2); - - switch (puAvailability){ - - case 1: // only B0 is available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - break; - - case 2: // only B1 is available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - break; - - case 3: // only B0 & B1 are available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - } - - break; - - case 4: // only B2 is available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - break; - - case 5: // only B0 & B2 are available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - } - - break; - - case 6: // only B1 & B2 are available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - } - - break; - - case 7: // B0, B1 & B2 are all available - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB0, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB1, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - if (!MVPBxAvailability){ - MVPBxAvailability = GetNonScalingSpatialAMVP_V2( - mvUnitB2, - targetRefPicList, - targetRefPicPOC, - MVPCandx, - MVPCandy, - pictureControlSetPtr); - - } - } - - break; - - case 0: // none of B0, B1 or B2 is available - break; - - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR5); - break; - } - - return MVPBxAvailability; + //CHKN move these avail outside + EB_BOOL MVPBxAvailability = EB_FALSE; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + //EB_BOOL puB0Availability = (EB_BOOL) (puB0Available == EB_TRUE && puB0CodingMode != INTRA_MODE); + //EB_BOOL puB1Availability = (EB_BOOL) (puB1Available == EB_TRUE && puB1CodingMode != INTRA_MODE); + //EB_BOOL puB2Availability = (EB_BOOL) (puB2Available == EB_TRUE && puB2CodingMode != INTRA_MODE); + //EB_U8 puAvailability = (EB_U8) puB0Availability + (((EB_U8) puB1Availability) << 1) + (((EB_U8) puB2Availability) << 2); + + switch (puAvailability){ + + case 1: // only B0 is available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + break; + + case 2: // only B1 is available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + break; + + case 3: // only B0 & B1 are available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + } + + break; + + case 4: // only B2 is available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + break; + + case 5: // only B0 & B2 are available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + } + + break; + + case 6: // only B1 & B2 are available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + } + + break; + + case 7: // B0, B1 & B2 are all available + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB0, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB1, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + if (!MVPBxAvailability){ + MVPBxAvailability = GetNonScalingSpatialAMVP_V2( + mvUnitB2, + targetRefPicList, + targetRefPicPOC, + MVPCandx, + MVPCandy, + pictureControlSetPtr); + + } + } + + break; + + case 0: // none of B0, B1 or B2 is available + break; + + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR5); + break; + } + + return MVPBxAvailability; } /** GetScalingSpatialMVPPosBx_V3() is used to generate the spatial MVP candidate in position B0, B1 (if needed) or B2 (if needed) and the MV scaling is used. */ -static EB_BOOL GetScalingSpatialMVPPosBx_V3( - MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. - MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. +static EB_BOOL GetScalingSpatialMVPPosBx_V3( + MvUnit_t *mvUnitB0, // Input parameter, PU pointer of position B0. + MvUnit_t *mvUnitB1, // Input parameter, PU pointer of position B1. MvUnit_t *mvUnitB2, // Input parameter, PU pointer of position B2. EB_U8 puAvailability, //EB_BOOL puB0Available, @@ -1123,7 +1123,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( switch(puAvailability){ case 1: // only B0 is available - + MVPBxAvailability = GetScalingSpatialAMVP_V2( mvUnitB0, targetRefPicList, @@ -1181,7 +1181,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( break; case 5: // only B0 & B2 are available - + MVPBxAvailability = GetScalingSpatialAMVP_V2( mvUnitB0, targetRefPicList, @@ -1261,8 +1261,8 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR5); + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR5); break; } @@ -1272,7 +1272,7 @@ static EB_BOOL GetScalingSpatialMVPPosBx_V3( /** GetTemporalMVP() is used to generate the temporal MVP candidate. */ -EB_BOOL GetTemporalMVP( +EB_BOOL GetTemporalMVP( EB_U32 puPicWiseLocX, EB_U32 puPicWiseLocY, EB_U32 puWidth, @@ -1305,7 +1305,7 @@ EB_BOOL GetTemporalMVP( EB_BOOL temporalMVPAvailability = EB_FALSE; EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - + //CHKN compute this outside (remove isLowdelay/targetRefPicList/preDefinedColocatedPuRefList //CHKN bottom right avail outside, common between L0+L1, tmvpPosition is common between L0+L1 @@ -1313,7 +1313,7 @@ EB_BOOL GetTemporalMVP( - + //CHKN this if/else is common between L0+L1 if( (puPicWiseLocX + puWidth) >= pictureWidth || // Right Picture Edge Boundary Check @@ -1332,9 +1332,9 @@ EB_BOOL GetTemporalMVP( bottomRightBlockPositionY = ((puPicWiseLocY & (tbSize-1)) + puHeight) >> LOG_MV_COMPRESS_UNIT_SIZE; // won't rollover due to prior boundary checks CHECK_REPORT_ERROR( - ((tmvpMapLcuIndexOffset < 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_AMVP_ERROR8); + ((tmvpMapLcuIndexOffset < 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_AMVP_ERROR8); tmvpMapPuIndex = bottomRightBlockPositionY * (tbSize >> LOG_MV_COMPRESS_UNIT_SIZE) + bottomRightBlockPositionX; @@ -1387,28 +1387,28 @@ EB_BOOL GetTemporalMVP( return temporalMVPAvailability; } - + /** GetTemporalMVP_V2() is used to generate the temporal MVP candidate. */ -EB_BOOL GetTemporalMVP_V2( +EB_BOOL GetTemporalMVP_V2( TmvpPos tmvpPosition, EB_U32 tmvpMapLcuIndexOffset, EB_U32 tmvpMapPuIndex, - EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the TMVP is searching for. + EB_REFLIST targetRefPicList, // Input parameter, the reference picture list where the TMVP is searching for. EB_U64 targetRefPicPOC, // Input parameter, the POC of the reference picture where the TMVP is searcing for. TmvpUnit_t *tmvpMapPtr, // Input parameter, the pointer to the TMVP map. EB_U64 colocatedPuPOC, // Input parameter, the POC of the co-located PU. - EB_REFLIST preDefinedColocatedPuRefList, // Input parameter, the reference picture list of the co-located PU, which is defined in the slice header. + EB_REFLIST preDefinedColocatedPuRefList, // Input parameter, the reference picture list of the co-located PU, which is defined in the slice header. EB_S16 *MVPCandx, // Output parameter, the horizontal componenet of the output AMVP candidate. EB_S16 *MVPCandy, // Output parameter, the vertical componenet of the output AMVP candidate. PictureControlSet_t *pictureControlSetPtr) { - + EB_BOOL temporalMVPAvailability = EB_FALSE; EB_REFLIST colocatedPuRefList = pictureControlSetPtr->isLowDelay ? targetRefPicList : (EB_REFLIST) (1-preDefinedColocatedPuRefList); - + if(tmvpPosition == TmvpColocatedBottomRight) { colocatedPuRefList = tmvpMapPtr[tmvpMapLcuIndexOffset].predictionDirection[tmvpMapPuIndex] == BI_PRED ? colocatedPuRefList : @@ -1426,7 +1426,7 @@ EB_BOOL GetTemporalMVP_V2( MVPCandx, MVPCandy); } - else { // (tmvpType == TmvpColocatedCenter) + else { // (tmvpType == TmvpColocatedCenter) temporalMVPAvailability = tmvpMapPtr->availabilityFlag[tmvpMapPuIndex]; if(temporalMVPAvailability) { @@ -1502,7 +1502,7 @@ EB_BOOL GetTemporalMVPBPicture( CHECK_REPORT_ERROR( (tmvpMapLcuIndexOffset < 2), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_AMVP_ERROR8); tmvpMapPuIndex = bottomRightBlockPositionY * (tbSize >> LOG_MV_COMPRESS_UNIT_SIZE) + bottomRightBlockPositionX; @@ -1760,9 +1760,9 @@ EB_ERRORTYPE FillAMVPCandidates( EB_BOOL tmvpEnableFlag, EB_U32 tbAddr, EB_REFLIST targetRefPicList, - EB_S16 *xMvAmvpArray, - EB_S16 *yMvAmvpArray, - EB_U8 *amvpCandidateCount) + EB_S16 *xMvAmvpArray, + EB_S16 *yMvAmvpArray, + EB_U8 *amvpCandidateCount) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -1841,8 +1841,8 @@ EB_ERRORTYPE FillAMVPCandidates( EB_REFLIST colocatedPuRefList; const EB_U64 targetRefPicPOC =((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[targetRefPicList]->objectPtr)->refPOC; - EB_S16 xMVPCandArray[4]; - EB_S16 yMVPCandArray[4]; + EB_S16 xMVPCandArray[4]; + EB_S16 yMVPCandArray[4]; EB_S16 xMVPCand; EB_S16 yMVPCand; EB_U32 numAvailableMVPCand = 0; @@ -1863,7 +1863,7 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture & Intra Check a0_availability = (modeNeighborArray->leftArray[a0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : a0_availability; - a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; + a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; if(a0_availability) { @@ -1881,9 +1881,9 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture, & Intra Check a1_availability = (modeNeighborArray->leftArray[a1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; - a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; + a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; - // To check: Intra-CU check (imposed by the standard to facilitate concurrent PU searches) + // To check: Intra-CU check (imposed by the standard to facilitate concurrent PU searches) // a1_availability = (partIndex == 1 && isVerticalPartition == EB_TRUE) ? EB_FALSE : a1_availability; if (a1_availability) { @@ -1901,7 +1901,7 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture, & Intra Check b2_availability = (modeNeighborArray->topLeftArray[b2_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; - b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; + b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; if (b2_availability) { puB2CodingMode = modeNeighborArray->topLeftArray[b2_ModeNaIndex]; @@ -1943,7 +1943,7 @@ EB_ERRORTYPE FillAMVPCandidates( // Slice, picture & Intra Check b0_availability = (modeNeighborArray->topArray[b0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : b0_availability; - b0_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b0_availability; + b0_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b0_availability; b0_availability = (pictureRightBoundary == EB_TRUE) ? EB_FALSE : b0_availability; if (b0_availability) { @@ -2099,48 +2099,48 @@ EB_ERRORTYPE FillAMVPCandidates( /************************************************************************** * GenerateL0L1AmvpMergeLists() * Generates the AMVP(L0+L1) + MV merge candidates for a PU. - * - * B2 | B1 | B0 + * + * B2 | B1 | B0 * ----------------------- - * | | - * | | - * | | - * | | - * | | - * | | - * | | - * A1 | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * A1 | | * --|-------------------| * A0 - * + * ***************************************************************************/ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( - ModeDecisionContext_t *contextPtr, - InterPredictionContext_t *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL tmvpEnableFlag, - EB_U32 tbAddr, - EB_S16 xMvAmvpArray[2][2], - EB_S16 yMvAmvpArray[2][2], - EB_U32 amvpCandidateCount[2], + ModeDecisionContext_t *contextPtr, + InterPredictionContext_t *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL tmvpEnableFlag, + EB_U32 tbAddr, + EB_S16 xMvAmvpArray[2][2], + EB_S16 yMvAmvpArray[2][2], + EB_U32 amvpCandidateCount[2], EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ) { EB_ERRORTYPE return_error = EB_ErrorNone; - NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; - NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; - MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; + NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; + NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; + MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; - const EB_U32 cuIndex = contextPtr->cuStats->cuNumInDepth; - const EB_U32 originX = contextPtr->cuOriginX; - const EB_U32 originY = contextPtr->cuOriginY; - const EB_U32 width = contextPtr->cuStats->size; - const EB_U32 height = contextPtr->cuStats->size; - const EB_U32 cuDepth = contextPtr->cuStats->depth; + const EB_U32 cuIndex = contextPtr->cuStats->cuNumInDepth; + const EB_U32 originX = contextPtr->cuOriginX; + const EB_U32 originY = contextPtr->cuOriginY; + const EB_U32 width = contextPtr->cuStats->size; + const EB_U32 height = contextPtr->cuStats->size; + const EB_U32 cuDepth = contextPtr->cuStats->depth; EB_U32 *mergeCandidateCount = &interPredictionPtr->mvMergeCandidateCount; EB_REFLIST targetRefPicList = REF_LIST_0; - + // Neighbor Array Fixed-indicies const EB_U32 a0_ModeNaIndex = GetNeighborArrayUnitLeftIndex( modeNeighborArray, @@ -2200,14 +2200,14 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( EbReferenceObject_t *referenceObjectReadPtr; TmvpUnit_t *tmvpMapPtr; EB_REFLIST colocatedPuRefList; - + EB_U64 targetRefPicPOC; EB_U32 mvMergeCandidateIndex = 0; EB_S16 MVPCandx; EB_S16 MVPCandy; - EB_S16 MVPCand[4]; + EB_S16 MVPCand[4]; // MV merge candidate array filling up EB_U32 fillingIndex; @@ -2234,7 +2234,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( EB_U32 numAvailableMVPCandL0 = 0; EB_U32 numAvailableMVPCandL1 = 0; - + EB_U32 totalMergeCandidates = *mergeCandidateCount; EB_BOOL tmvpInfoReady = EB_FALSE; @@ -2251,69 +2251,69 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // Availability Checks for A0, A1, B0, B1, B2 //---------------------------------------------- // *********** A0 *********** - + // CU scan-order availability check a0_availability = isBottomLeftAvailable(cuDepth, cuIndex); // Picture Boundary Check a0_availability = (a0_ModeNaIndex < modeNeighborArray->leftArraySize) ? a0_availability : EB_FALSE; - // Slice & Intra Check + // Slice & Intra Check a0_availability = (((EB_MODETYPE*) modeNeighborArray->leftArray)[a0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : a0_availability; // picture Check - a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; + a0_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a0_availability; - if(a0_availability){ + if(a0_availability){ mvUnitA0 = &( (MvUnit_t*)mvNeighborArray->leftArray )[a0_MvNaIndex]; } else{ - mvUnitA0 = (MvUnit_t*)EB_NULL; + mvUnitA0 = (MvUnit_t*)EB_NULL; } // *********** A1 *********** - + // Slice & Intra Check a1_availability = (((EB_MODETYPE*) modeNeighborArray->leftArray)[a1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; - - if (a1_availability) { + a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; + + if (a1_availability) { mvUnitA1 = &( (MvUnit_t*)mvNeighborArray->leftArray )[a1_MvNaIndex]; } else { - mvUnitA1 = (MvUnit_t*)EB_NULL; + mvUnitA1 = (MvUnit_t*)EB_NULL; } // *********** B2 *********** - + // Slice & Intra Check b2_availability = (((EB_MODETYPE*) modeNeighborArray->topLeftArray)[b2_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; - - if (b2_availability) { + b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; + + if (b2_availability) { mvUnitB2 = &( (MvUnit_t*)mvNeighborArray->topLeftArray )[b2_MvNaIndex]; } else { - mvUnitB2 = (MvUnit_t*)EB_NULL; + mvUnitB2 = (MvUnit_t*)EB_NULL; } - + // *********** B1 *********** - + // Slice & Intra Check b1_availability = (((EB_MODETYPE*) modeNeighborArray->topArray)[b1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check b1_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b1_availability; - if (b1_availability) { + if (b1_availability) { mvUnitB1 = &( (MvUnit_t*)mvNeighborArray->topArray )[b1_MvNaIndex]; } else { - mvUnitB1 = (MvUnit_t*)EB_NULL; + mvUnitB1 = (MvUnit_t*)EB_NULL; } // *********** B0 *********** @@ -2324,21 +2324,21 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // Picture Boundary Check b0_availability = (b0_ModeNaIndex < modeNeighborArray->topArraySize) ? b0_availability : EB_FALSE; - // Slice & Intra Check + // Slice & Intra Check b0_availability = (((EB_MODETYPE*) modeNeighborArray->topArray)[b0_ModeNaIndex] != INTER_MODE) ? EB_FALSE : b0_availability; // picture Check b0_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b0_availability; b0_availability = (pictureRightBoundary == EB_TRUE) ? EB_FALSE : b0_availability; - if (b0_availability) { + if (b0_availability) { mvUnitB0 = &( (MvUnit_t*)mvNeighborArray->topArray )[b0_MvNaIndex]; } else { - mvUnitB0 = (MvUnit_t*)EB_NULL; + mvUnitB0 = (MvUnit_t*)EB_NULL; } - //-----------------AMVP L0------------- + //-----------------AMVP L0------------- //-----------------AMVP L0------------- //-----------------AMVP L0------------- @@ -2495,9 +2495,9 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( amvpCandidateCount[REF_LIST_0] = numAvailableMVPCandL0; - //------------------AMVP L1-------------- - //------------------AMVP L1-------------- - //------------------AMVP L1-------------- + //------------------AMVP L1-------------- + //------------------AMVP L1-------------- + //------------------AMVP L1-------------- if (pictureControlSetPtr->sliceType == EB_B_PICTURE) { targetRefPicList = REF_LIST_1; @@ -2557,7 +2557,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } } - // Remove duplicate + // Remove duplicate if (numAvailableMVPCandL1 == 2 && ((xMvAmvpArrayL1[0] == xMvAmvpArrayL1[1]) && (yMvAmvpArrayL1[0] == yMvAmvpArrayL1[1]))) { numAvailableMVPCandL1 = 1; } @@ -2628,7 +2628,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } } - //fill (0,0) MVP in case there is no Candidates + //fill (0,0) MVP in case there is no Candidates if ((numAvailableMVPCandL1 < 1) || (numAvailableMVPCandL1 == 1 && xMvAmvpArrayL1[0] != 0 && yMvAmvpArrayL1[0] != 0)) { xMvAmvpArrayL1[numAvailableMVPCandL1] = 0; yMvAmvpArrayL1[numAvailableMVPCandL1] = 0; @@ -2641,18 +2641,18 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } } - //------------------Merge-------------- - //------------------Merge-------------- - //------------------Merge-------------- - + //------------------Merge-------------- + //------------------Merge-------------- + //------------------Merge-------------- + //---------------------------------------- // Candidate Selection //---------------------------------------- - switch(pictureControlSetPtr->sliceType) + switch(pictureControlSetPtr->sliceType) { - + case EB_P_PICTURE: // A1 @@ -2668,13 +2668,13 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( if(mvMergeCandidateIndex == totalMergeCandidates ) break; - // B1 + // B1 if (mvUnitB1 != (MvUnit_t*)EB_NULL) { EB_BOOL mvUnion = EB_FALSE; if (mvUnitB1 != (MvUnit_t*)EB_NULL && mvUnitA1 != (MvUnit_t*)EB_NULL) mvUnion = (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion); if( ( b1_availability == EB_TRUE) && - ( (a1_availability == EB_FALSE) || + ( (a1_availability == EB_FALSE) || mvUnion)) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -2685,14 +2685,14 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( if(mvMergeCandidateIndex == totalMergeCandidates ) break; - + // B0 if (mvUnitB0 != (MvUnit_t*)EB_NULL) { EB_BOOL mvUnion = EB_FALSE; if (mvUnitB0 != (MvUnit_t*)EB_NULL && mvUnitB1 != (MvUnit_t*)EB_NULL) mvUnion = (mvUnitB0->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion); if ( (b0_availability == EB_TRUE) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || mvUnion)) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -2710,7 +2710,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( if (mvUnitA0 != (MvUnit_t*)EB_NULL && mvUnitA1 != (MvUnit_t*)EB_NULL) mvUnion = (mvUnitA0->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion); if ((a0_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || mvUnion)) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -2740,7 +2740,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( ++mvMergeCandidateIndex; } } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; @@ -2757,7 +2757,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( referenceObjectReadPtr->refPOC, preDefinedColocatedPuRefList, isLowDelay, - MAX_LCU_SIZE, + MAX_LCU_SIZE, &MVPCandx, &MVPCandy, pictureControlSetPtr); @@ -2798,16 +2798,16 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].mvUnion = mvUnitA1->mv[REF_LIST_1].mvUnion; ++mvMergeCandidateIndex; } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; - - + + // B1 if ( (b1_availability == EB_TRUE) && ( (a1_availability == EB_FALSE) || - (mvUnitB1->predDirection != mvUnitA1->predDirection) || - (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || + (mvUnitB1->predDirection != mvUnitA1->predDirection) || + (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB1->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) ) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = mvUnitB1->predDirection; @@ -2821,7 +2821,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // B0 if ( (b0_availability == EB_TRUE) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || (mvUnitB0->predDirection != mvUnitB1->predDirection) || (mvUnitB0->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion) || (mvUnitB0->mv[REF_LIST_1].mvUnion != mvUnitB1->mv[REF_LIST_1].mvUnion))) @@ -2837,7 +2837,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // A0 if ( (a0_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || (mvUnitA0->predDirection != mvUnitA1->predDirection) || (mvUnitA0->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitA0->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion))) @@ -2853,11 +2853,11 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // B2 if ( mvMergeCandidateIndex < 4 && (b2_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitA1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitB1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitB1->mv[REF_LIST_1].mvUnion))) @@ -2888,7 +2888,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( { // Center co-located tmvpPosition = TmvpColocatedCenter; - + } else { // Bottom-right co-located bottomRightPositionX = (originX & (63)) + width; @@ -2896,13 +2896,13 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( bottomRightBlockPositionX = (bottomRightPositionX & (63)) >> LOG_MV_COMPRESS_UNIT_SIZE; bottomRightBlockPositionY = ((originY & (63)) + height) >> LOG_MV_COMPRESS_UNIT_SIZE; // won't rollover due to prior boundary checks - + tmvpMapPuIndex = bottomRightBlockPositionY * (MAX_LCU_SIZE >> LOG_MV_COMPRESS_UNIT_SIZE) + bottomRightBlockPositionX; // Determine whether the Bottom-Right is Available tmvpPosition = (tmvpMapPtr[tmvpMapLcuIndexOffset].availabilityFlag[tmvpMapPuIndex] == EB_TRUE) ? TmvpColocatedBottomRight : TmvpColocatedCenter; } - + if(tmvpPosition == TmvpColocatedCenter) { tmvpMapLcuIndexOffset = 0; bottomRightBlockPositionX = ((originX & (63)) + (width >> 1)) >> LOG_MV_COMPRESS_UNIT_SIZE; @@ -2911,19 +2911,19 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } - } + } tmvp_availability = GetTemporalMVPBPicture_V2( tmvpPosition, tmvpMapLcuIndexOffset, - tmvpMapPuIndex, + tmvpMapPuIndex, pictureControlSetPtr, tmvpMapPtr, referenceObjectReadPtr->refPOC, pictureControlSetPtr->colocatedPuRefList, - pictureControlSetPtr->isLowDelay, + pictureControlSetPtr->isLowDelay, MVPCand); - + if(tmvp_availability) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = BI_PRED; @@ -2942,7 +2942,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( // Bi-pred Combinations // The MVs from the lists from the the {A0,A1,B0,B1,B2} are combined to create new merge candidates loopEnd = mvMergeCandidateIndex * (mvMergeCandidateIndex - 1); - for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { + for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { list0FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_0][fillingIndex]; list1FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_1][fillingIndex]; @@ -2972,7 +2972,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( break; // Add zero MV - for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) + for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = BI_PRED; mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_0].x = 0; @@ -2981,7 +2981,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].y = 0; ++mvMergeCandidateIndex; } - + break; @@ -2989,7 +2989,7 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( break; } - // Update the number of MV merge candidate + // Update the number of MV merge candidate *mergeCandidateCount = mvMergeCandidateIndex; //TODO: remove this tmp buffering firstPuAMVPCandArray_x[REF_LIST_0][0] = xMvAmvpArray[REF_LIST_0][0]; @@ -3006,23 +3006,23 @@ EB_ERRORTYPE GenerateL0L1AmvpMergeLists( } EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( - ModeDecisionContext_t *contextPtr, - InterPredictionContext_t *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 tbAddr) { + ModeDecisionContext_t *contextPtr, + InterPredictionContext_t *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 tbAddr) { EB_ERRORTYPE return_error = EB_ErrorNone; - NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; - NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; - MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; + NeighborArrayUnit_t *mvNeighborArray = contextPtr->mvNeighborArray; + NeighborArrayUnit_t *modeNeighborArray = contextPtr->modeTypeNeighborArray; + MvMergeCandidate_t *mergeCandidateArray = interPredictionPtr->mvMergeCandidateArray; - const EB_U32 originX = contextPtr->cuOriginX; - const EB_U32 originY = contextPtr->cuOriginY; - const EB_U32 width = contextPtr->cuStats->size; - const EB_U32 height = contextPtr->cuStats->size; + const EB_U32 originX = contextPtr->cuOriginX; + const EB_U32 originY = contextPtr->cuOriginY; + const EB_U32 width = contextPtr->cuStats->size; + const EB_U32 height = contextPtr->cuStats->size; EB_U32 *mergeCandidateCount = &interPredictionPtr->mvMergeCandidateCount; - + // Neighbor Array Fixed-indicies const EB_U32 a1_ModeNaIndex = GetNeighborArrayUnitLeftIndex( modeNeighborArray, @@ -3069,7 +3069,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( MvUnit_t *mvUnitA1; MvUnit_t *mvUnitB2; MvUnit_t *mvUnitB1; - + EB_U32 totalMergeCandidates = *mergeCandidateCount; //---------------------------------------------- @@ -3077,57 +3077,57 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( //---------------------------------------------- // *********** A1 *********** - + // Slice & Intra Check a1_availability = (((EB_MODETYPE*) modeNeighborArray->leftArray)[a1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; - - if (a1_availability) { + a1_availability = (pictureLeftBoundary == EB_TRUE) ? EB_FALSE : a1_availability; + + if (a1_availability) { mvUnitA1 = &( (MvUnit_t*)mvNeighborArray->leftArray )[a1_MvNaIndex]; } else { - mvUnitA1 = (MvUnit_t*)EB_NULL; + mvUnitA1 = (MvUnit_t*)EB_NULL; } // *********** B2 *********** - + // Slice & Intra Check b2_availability = (((EB_MODETYPE*) modeNeighborArray->topLeftArray)[b2_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; - - if (b2_availability) { + b2_availability = (pictureLeftBoundary == EB_TRUE || pictureTopBoundary == EB_TRUE) ? EB_FALSE : b2_availability; + + if (b2_availability) { mvUnitB2 = &( (MvUnit_t*)mvNeighborArray->topLeftArray )[b2_MvNaIndex]; } else { - mvUnitB2 = (MvUnit_t*)EB_NULL; + mvUnitB2 = (MvUnit_t*)EB_NULL; } - + // *********** B1 *********** - + // Slice & Intra Check b1_availability = (((EB_MODETYPE*) modeNeighborArray->topArray)[b1_ModeNaIndex] != INTER_MODE) ? EB_FALSE : EB_TRUE; // picture Check - b1_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b1_availability; + b1_availability = (pictureTopBoundary == EB_TRUE) ? EB_FALSE : b1_availability; - if (b1_availability) { + if (b1_availability) { mvUnitB1 = &( (MvUnit_t*)mvNeighborArray->topArray )[b1_MvNaIndex]; } else { - mvUnitB1 = (MvUnit_t*)EB_NULL; + mvUnitB1 = (MvUnit_t*)EB_NULL; } //---------------------------------------- // Candidate Selection //---------------------------------------- - switch(pictureControlSetPtr->sliceType) + switch(pictureControlSetPtr->sliceType) { - + case EB_P_PICTURE: // A1 @@ -3141,9 +3141,9 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( if(mvMergeCandidateIndex == totalMergeCandidates ) break; - // B1 + // B1 if( ( b1_availability == EB_TRUE) && - ( (a1_availability == EB_FALSE) || + ( (a1_availability == EB_FALSE) || (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion))) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = UNI_PRED_LIST_0; @@ -3164,7 +3164,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_0].mvUnion = mvUnitB2->mv[REF_LIST_0].mvUnion; ++mvMergeCandidateIndex; } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; @@ -3191,16 +3191,16 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].mvUnion = mvUnitA1->mv[REF_LIST_1].mvUnion; ++mvMergeCandidateIndex; } - + if(mvMergeCandidateIndex == totalMergeCandidates ) break; - - + + // B1 if ( (b1_availability == EB_TRUE) && ( (a1_availability == EB_FALSE) || - (mvUnitB1->predDirection != mvUnitA1->predDirection) || - (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || + (mvUnitB1->predDirection != mvUnitA1->predDirection) || + (mvUnitB1->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB1->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) ) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = mvUnitB1->predDirection; @@ -3215,11 +3215,11 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( // B2 if ( mvMergeCandidateIndex < 4 && (b2_availability == EB_TRUE) && - ((a1_availability == EB_FALSE) || + ((a1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitA1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitA1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitA1->mv[REF_LIST_1].mvUnion)) && - ((b1_availability == EB_FALSE) || + ((b1_availability == EB_FALSE) || (mvUnitB2->predDirection != mvUnitB1->predDirection) || (mvUnitB2->mv[REF_LIST_0].mvUnion != mvUnitB1->mv[REF_LIST_0].mvUnion) || (mvUnitB2->mv[REF_LIST_1].mvUnion != mvUnitB1->mv[REF_LIST_1].mvUnion))) @@ -3236,7 +3236,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( // Bi-pred Combinations // The MVs from the lists from the the {A1,B1,B2} are combined to create new merge candidates loopEnd = mvMergeCandidateIndex * (mvMergeCandidateIndex - 1); - for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { + for(fillingIndex = 0; mvMergeCandidateIndex < totalMergeCandidates && fillingIndex < loopEnd; ++fillingIndex) { list0FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_0][fillingIndex]; list1FillingMvMergeCandidateIndex = mvMergeCandIndexArrayForFillingUp[REF_LIST_1][fillingIndex]; @@ -3266,7 +3266,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( break; // Add zero MV - for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) + for (refPicIndex = 0; refPicIndex < MAX_NUM_OF_MV_MERGE_CANDIDATE && mvMergeCandidateIndex < totalMergeCandidates; ++refPicIndex) { mergeCandidateArray[mvMergeCandidateIndex].predictionDirection = BI_PRED; mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_0].x = 0; @@ -3275,7 +3275,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( mergeCandidateArray[mvMergeCandidateIndex].mv[REF_LIST_1].y = 0; ++mvMergeCandidateIndex; } - + break; @@ -3283,7 +3283,7 @@ EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( break; } - // Update the number of MV merge candidate + // Update the number of MV merge candidate *mergeCandidateCount = mvMergeCandidateIndex; return return_error; diff --git a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h index 7ccdb66ac..909465234 100644 --- a/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h +++ b/Source/Lib/Codec/EbAdaptiveMotionVectorPrediction.h @@ -26,10 +26,10 @@ typedef enum TmvpPos { // TMVP items corresponding to one LCU typedef struct TmvpUnit_s { - Mv_t mv[MAX_NUM_OF_REF_PIC_LIST][MAX_TMVP_CAND_PER_LCU]; + Mv_t mv[MAX_NUM_OF_REF_PIC_LIST][MAX_TMVP_CAND_PER_LCU]; EB_U64 refPicPOC[MAX_NUM_OF_REF_PIC_LIST][MAX_TMVP_CAND_PER_LCU]; EB_PREDDIRECTION predictionDirection[MAX_TMVP_CAND_PER_LCU]; - EB_BOOL availabilityFlag[MAX_TMVP_CAND_PER_LCU]; + EB_BOOL availabilityFlag[MAX_TMVP_CAND_PER_LCU]; //*Note- list 1 motion info will be added when B-slices are ready @@ -66,12 +66,12 @@ extern EB_BOOL GetTemporalMVPBPicture( EB_U32 puWidth, EB_U32 puHeight, PictureControlSet_t *pictureControlSetPtr, - TmvpUnit_t *tmvpMapPtr, - EB_U64 colocatedPuPOC, - EB_REFLIST preDefinedColocatedPuRefList, - EB_BOOL isLowDelay, - EB_U32 tbSize, - EB_S16 *MVPCand); + TmvpUnit_t *tmvpMapPtr, + EB_U64 colocatedPuPOC, + EB_REFLIST preDefinedColocatedPuRefList, + EB_BOOL isLowDelay, + EB_U32 tbSize, + EB_S16 *MVPCand); extern EB_ERRORTYPE FillAMVPCandidates( NeighborArrayUnit_t *mvNeighborArray, @@ -87,28 +87,28 @@ extern EB_ERRORTYPE FillAMVPCandidates( EB_BOOL tmvpEnableFlag, EB_U32 tbAddr, EB_REFLIST targetRefPicList, - EB_S16 *xMvAmvpArray, - EB_S16 *yMvAmvpArray, - EB_U8 *amvpCandidateCount); + EB_S16 *xMvAmvpArray, + EB_S16 *yMvAmvpArray, + EB_U8 *amvpCandidateCount); extern EB_ERRORTYPE GenerateL0L1AmvpMergeLists( - struct ModeDecisionContext_s *contextPtr, - struct InterPredictionContext_s *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL tmvpEnableFlag, - EB_U32 tbAddr, - EB_S16 xMvAmvpArray[2][2], - EB_S16 yMvAmvpArray[2][2], - EB_U32 amvpCandidateCount[2], + struct ModeDecisionContext_s *contextPtr, + struct InterPredictionContext_s *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL tmvpEnableFlag, + EB_U32 tbAddr, + EB_S16 xMvAmvpArray[2][2], + EB_S16 yMvAmvpArray[2][2], + EB_U32 amvpCandidateCount[2], EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ); extern EB_ERRORTYPE NonConformantGenerateL0L1AmvpMergeLists( - struct ModeDecisionContext_s *contextPtr, - struct InterPredictionContext_s *interPredictionPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 tbAddr); + struct ModeDecisionContext_s *contextPtr, + struct InterPredictionContext_s *interPredictionPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 tbAddr); #ifdef __cplusplus } diff --git a/Source/Lib/Codec/EbAvailability.c b/Source/Lib/Codec/EbAvailability.c index f84df8d15..6adb7ffed 100644 --- a/Source/Lib/Codec/EbAvailability.c +++ b/Source/Lib/Codec/EbAvailability.c @@ -12,19 +12,19 @@ EB_BOOL isBottomLeftAvailable(EB_U32 depth, { EB_BOOL availability; - EB_U32 numberOfPartitionsInWidth = 1 << depth; - EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); + EB_U32 numberOfPartitionsInWidth = 1 << depth; + EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); EB_U32 verticalPartitionIndex = (partIndex - horizontalPartitionIndex) >> depth; - + if (depth < 4) { - + availability = (EB_BOOL) ((horizontalPartitionIndex & (numberOfPartitionsInWidth - 1)) == 0); // left column border check availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x01) == 0) && (((verticalPartitionIndex) & 0x01) == 0))); // x is even and y is even availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0) && (((verticalPartitionIndex) & 0x03) == 0x01))); // x is a multiple of 4 and y mod 4 is equal to 1 availability = (EB_BOOL) (availability & (((verticalPartitionIndex != (numberOfPartitionsInWidth - 1))))); // bottom row border check } else { - + availability = (EB_BOOL) ((horizontalPartitionIndex & (numberOfPartitionsInWidth - 1)) == 0); // left column border check availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x01) == 0) && (((verticalPartitionIndex) & 0x01) == 0))); // x is even and y is even availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0) && (((verticalPartitionIndex + 1) & 0x03) != 0x00))); // x is a multiple of 4 and (y + 1) % 4 is different from 1 @@ -42,15 +42,15 @@ EB_BOOL isUpperRightAvailable( { EB_BOOL availability; - EB_U32 numberOfPartitionsInWidth = 1 << depth; - EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); + EB_U32 numberOfPartitionsInWidth = 1 << depth; + EB_U32 horizontalPartitionIndex = partIndex & (numberOfPartitionsInWidth - 1); EB_U32 verticalPartitionIndex = (partIndex - horizontalPartitionIndex) >> depth; - + if (depth < 4) { availability = (EB_BOOL) (horizontalPartitionIndex == (numberOfPartitionsInWidth - 1)); // right column border check availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x01) == 0x01) && (((verticalPartitionIndex) & 0x01) == 0x01))); // x is odd and y is odd - availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0x03) && (((verticalPartitionIndex) & 0x03) == 0x02))); // x mod 4 is equal to 3 and y mod 4 is equal to 2 + availability = (EB_BOOL) (availability | ((((horizontalPartitionIndex) & 0x03) == 0x03) && (((verticalPartitionIndex) & 0x03) == 0x02))); // x mod 4 is equal to 3 and y mod 4 is equal to 2 availability = (EB_BOOL) (availability & (verticalPartitionIndex != 0)); // top row border check } else { diff --git a/Source/Lib/Codec/EbAvcStyleMcp.c b/Source/Lib/Codec/EbAvcStyleMcp.c index 95d5f4057..f24049f3e 100644 --- a/Source/Lib/Codec/EbAvcStyleMcp.c +++ b/Source/Lib/Codec/EbAvcStyleMcp.c @@ -7,36 +7,36 @@ #include "EbPictureOperators.h" static const EB_U8 FracMappedPosTabX[16] = { 0, 1, 2, 3, - 0, 1, 2, 3, - 0, 0, 2, 0, - 0, 1, 2, 3 }; - + 0, 1, 2, 3, + 0, 0, 2, 0, + 0, 1, 2, 3 }; + static const EB_U8 FracMappedPosTabY[16] = { 0, 0, 0, 0, - 1, 0, 0, 0, - 2, 2, 2, 2, - 3, 0, 0, 0 }; - + 1, 0, 0, 0, + 2, 2, 2, 2, + 3, 0, 0, 0 }; + static const EB_U8 IntegerPosoffsetTabX[16] = { 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 1, - 0, 0, 0, 0 }; - + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 0, 0, 0 }; + static const EB_U8 IntegerPosoffsetTabY[16] = { 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 1, 1, 1 }; + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 1, 1, 1 }; -void UnpackUniPredRef10Bit( - EbPictureBufferDesc_t *refFramePicList0, +void UnpackUniPredRef10Bit( + EbPictureBufferDesc_t *refFramePicList0, EB_U32 posX, EB_U32 posY, EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf) @@ -45,7 +45,7 @@ void UnpackUniPredRef10Bit( EB_U32 chromaPuHeight = puHeight >> 1; //doing the luma interpolation - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { (void) tempBuf; EB_U32 inPosx = (posX >> 2); @@ -72,23 +72,23 @@ void UnpackUniPredRef10Bit( EB_U32 inPosx = (posX >> 3); EB_U32 inPosy = (posY >> 3); EB_U16 *ptr16 = (EB_U16 *)refFramePicList0->bufferCb + inPosx + inPosy*refFramePicList0->strideCb; - + extract8Bitdata( ptr16, refFramePicList0->strideCb, dst->bufferCb + dstChromaIndex, - dst->strideCb, + dst->strideCb, chromaPuWidth, chromaPuHeight ); ptr16 = (EB_U16 *)refFramePicList0->bufferCr + inPosx + inPosy*refFramePicList0->strideCr; - + extract8Bitdata( ptr16, refFramePicList0->strideCr, dst->bufferCr + dstChromaIndex, - dst->strideCr, + dst->strideCr, chromaPuWidth, chromaPuHeight ); @@ -99,7 +99,7 @@ void UnpackUniPredRef10Bit( } -void UnpackBiPredRef10Bit( +void UnpackBiPredRef10Bit( EbPictureBufferDesc_t *refFramePicList0, EbPictureBufferDesc_t *refFramePicList1, EB_U32 refList0PosX, @@ -109,9 +109,9 @@ void UnpackBiPredRef10Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst) @@ -119,7 +119,7 @@ void UnpackBiPredRef10Bit( EB_U32 chromaPuWidth = puWidth >> 1; EB_U32 chromaPuHeight = puHeight >> 1; - //Luma + //Luma if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { (void) firstPassIFTempDst; @@ -127,29 +127,29 @@ void UnpackBiPredRef10Bit( (void) refList1TempDst; UnpackL0L1AvgSafeSub( (EB_U16 *)refFramePicList0->bufferY + (refList0PosX >> 2) + (refList0PosY >> 2)*refFramePicList0->strideY, - refFramePicList0->strideY, + refFramePicList0->strideY, (EB_U16 *)refFramePicList1->bufferY + (refList1PosX >> 2) + (refList1PosY >> 2)*refFramePicList1->strideY, - refFramePicList1->strideY, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, + refFramePicList1->strideY, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, puHeight ); - } + } - //uni-prediction List0 chroma + //uni-prediction List0 chroma if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { UnpackL0L1Avg( (EB_U16 *)refFramePicList0->bufferCb + (refList0PosX >> 3) + (refList0PosY >> 3)*refFramePicList0->strideCb, - refFramePicList0->strideCb, + refFramePicList0->strideCb, (EB_U16 *)refFramePicList1->bufferCb + (refList1PosX >> 3) + (refList1PosY >> 3)*refFramePicList1->strideCb, - refFramePicList1->strideCb, + refFramePicList1->strideCb, biDst->bufferCb + dstChromaIndex, - biDst->strideCb , + biDst->strideCb , chromaPuWidth, chromaPuHeight ); @@ -157,11 +157,11 @@ void UnpackBiPredRef10Bit( UnpackL0L1Avg( (EB_U16 *)refFramePicList0->bufferCr + (refList0PosX >> 3) + (refList0PosY >> 3)*refFramePicList0->strideCr, - refFramePicList0->strideCr, + refFramePicList0->strideCr, (EB_U16 *)refFramePicList1->bufferCr + (refList1PosX >> 3) + (refList1PosY >> 3)*refFramePicList1->strideCr, - refFramePicList1->strideCr, + refFramePicList1->strideCr, biDst->bufferCr + dstChromaIndex, - biDst->strideCr, + biDst->strideCr, chromaPuWidth, chromaPuHeight ); @@ -176,7 +176,7 @@ void UniPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf) @@ -189,7 +189,7 @@ void UniPredIFreeRef8Bit( EB_U32 chromaPuWidth = puWidth >> 1; EB_U32 chromaPuHeight = puHeight >> 1; - EB_U8 fracPos; + EB_U8 fracPos; lumaStride = dst->strideY; @@ -197,28 +197,28 @@ void UniPredIFreeRef8Bit( //compute the luma fractional position integPosx = (posX >> 2); integPosy = (posY >> 2); - + fracPosx = posX & 0x03; fracPosy = posY & 0x03; - + //New Interpolation Mapping mappedFracPosx = fracPosx; mappedFracPosy = fracPosy; - fracPos = (mappedFracPosx + (mappedFracPosy << 2)); - mappedFracPosx = FracMappedPosTabX[fracPos]; - mappedFracPosy = FracMappedPosTabY[fracPos]; - integPosx += IntegerPosoffsetTabX[fracPos]; - integPosy += IntegerPosoffsetTabY[fracPos]; - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) + fracPos = (mappedFracPosx + (mappedFracPosy << 2)); + mappedFracPosx = FracMappedPosTabX[fracPos]; + mappedFracPosy = FracMappedPosTabY[fracPos]; + integPosx += IntegerPosoffsetTabX[fracPos]; + integPosy += IntegerPosoffsetTabY[fracPos]; + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - //doing the luma interpolation + //doing the luma interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPic->bufferY + integPosx + integPosy*refPic->strideY, refPic->strideY, - dst->bufferY + dstLumaIndex, lumaStride, - puWidth, puHeight, - tempBuf, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); + refPic->bufferY + integPosx + integPosy*refPic->strideY, refPic->strideY, + dst->bufferY + dstLumaIndex, lumaStride, + puWidth, puHeight, + tempBuf, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); } //chroma @@ -238,70 +238,70 @@ void UniPredIFreeRef8Bit( if (fracPosy > 4){ integPosy++; } - - // Note: chromaPuWidth equals 4 is only supported in Intrinsic - // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) - //doing the chroma Cb interpolation + + // Note: chromaPuWidth equals 4 is only supported in Intrinsic + // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) + //doing the chroma Cb interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPic->bufferCb + integPosx + integPosy*refPic->strideCb, - refPic->strideCb, - dst->bufferCb + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - //doing the chroma Cr interpolation + refPic->bufferCb + integPosx + integPosy*refPic->strideCb, + refPic->strideCb, + dst->bufferCb + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + //doing the chroma Cr interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPic->bufferCr + integPosx + integPosy*refPic->strideCr, - refPic->strideCr, - dst->bufferCr + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); + refPic->bufferCr + integPosx + integPosy*refPic->strideCr, + refPic->strideCr, + dst->bufferCr + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); } } void BiPredAverageKernel_C( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight - ) + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight + ) { - EB_U32 i, j; + EB_U32 i, j; + + + for (j = 0; j < areaHeight; j++) + { + for (i = 0; i < areaWidth; i++) + { + dst[i + j * dstStride] = (src0[i + j * src0Stride] + src1[i + j * src1Stride] + 1) / 2; + } + } - - for (j = 0; j < areaHeight; j++) - { - for (i = 0; i < areaWidth; i++) - { - dst[i + j * dstStride] = (src0[i + j * src0Stride] + src1[i + j * src1Stride] + 1) / 2; - } - } - } typedef void(*EB_BIAVG_FUNC)( - EB_BYTE src0, - EB_U32 src0Stride, - EB_BYTE src1, - EB_U32 src1Stride, - EB_BYTE dst, - EB_U32 dstStride, - EB_U32 areaWidth, - EB_U32 areaHeight); + EB_BYTE src0, + EB_U32 src0Stride, + EB_BYTE src1, + EB_U32 src1Stride, + EB_BYTE dst, + EB_U32 dstStride, + EB_U32 areaWidth, + EB_U32 areaHeight); /***************************** @@ -309,9 +309,9 @@ typedef void(*EB_BIAVG_FUNC)( *****************************/ static EB_BIAVG_FUNC FUNC_TABLE BiPredAverageKernel_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - BiPredAverageKernel_C, + BiPredAverageKernel_C, #ifndef NON_AVX512_SUPPORT - BiPredAverageKernel_AVX512_INTRIN + BiPredAverageKernel_AVX512_INTRIN #else BiPredAverageKernel_AVX2_INTRIN #endif @@ -328,9 +328,9 @@ void BiPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst) @@ -339,7 +339,7 @@ void BiPredIFreeRef8Bit( EB_U32 integPosy; EB_U8 fracPosx,mappedFracPosx; EB_U8 fracPosy,mappedFracPosy; - EB_U8 fracPos; + EB_U8 fracPos; EB_U32 lumaStride, refLumaStride; @@ -347,314 +347,314 @@ void BiPredIFreeRef8Bit( EB_U32 chromaPuHeight = puHeight >> 1; lumaStride = biDst->strideY; refLumaStride = refPicList0->strideY; - EB_U8 shift = 0; + EB_U8 shift = 0; - //Luma + //Luma if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0, fracPosL1; - //uni-prediction List0 luma - //compute the luma fractional position - integPosL0x = (refList0PosX >> 2); - integPosL0y = (refList0PosY >> 2); + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0, fracPosL1; + //uni-prediction List0 luma + //compute the luma fractional position + integPosL0x = (refList0PosX >> 2); + integPosL0y = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; - fracPosL0 = (mappedFracPosx + (mappedFracPosy << 2)); + fracPosL0 = (mappedFracPosx + (mappedFracPosy << 2)); - //uni-prediction List1 luma - //compute the luma fractional position - integPosL1x = (refList1PosX >> 2); - integPosL1y = (refList1PosY >> 2); + //uni-prediction List1 luma + //compute the luma fractional position + integPosL1x = (refList1PosX >> 2); + integPosL1y = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; - fracPosL1 = (mappedFracPosx + (mappedFracPosy << 2)); + fracPosL1 = (mappedFracPosx + (mappedFracPosy << 2)); - if ( (fracPosL0 == 0) && (fracPosL1 == 0) ) - { + if ( (fracPosL0 == 0) && (fracPosL1 == 0) ) + { #ifndef NON_AVX512_SUPPORT - BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK) ]( + BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK) ]( #else BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( #endif - refPicList0->bufferY + integPosL0x + integPosL0y * refLumaStride, - refLumaStride, - refPicList1->bufferY + integPosL1x + integPosL1y * refLumaStride, - refLumaStride, - biDst->bufferY + dstLumaIndex, - lumaStride, - puWidth, - puHeight); - } - else - { - //uni-prediction List0 luma - //compute the luma fractional position - integPosx = (refList0PosX >> 2); - integPosy = (refList0PosY >> 2); - - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; - - fracPos = (mappedFracPosx + (mappedFracPosy << 2)); - mappedFracPosx = FracMappedPosTabX[fracPos]; - mappedFracPosy = FracMappedPosTabY[fracPos]; - integPosx += IntegerPosoffsetTabX[fracPos]; - integPosy += IntegerPosoffsetTabY[fracPos]; + refPicList0->bufferY + integPosL0x + integPosL0y * refLumaStride, + refLumaStride, + refPicList1->bufferY + integPosL1x + integPosL1y * refLumaStride, + refLumaStride, + biDst->bufferY + dstLumaIndex, + lumaStride, + puWidth, + puHeight); + } + else + { + //uni-prediction List0 luma + //compute the luma fractional position + integPosx = (refList0PosX >> 2); + integPosy = (refList0PosY >> 2); + + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; + + fracPos = (mappedFracPosx + (mappedFracPosy << 2)); + mappedFracPosx = FracMappedPosTabX[fracPos]; + mappedFracPosy = FracMappedPosTabY[fracPos]; + integPosx += IntegerPosoffsetTabX[fracPos]; + integPosy += IntegerPosoffsetTabY[fracPos]; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList0->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, - refList0TempDst, puWidth, - puWidth, puHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - //uni-prediction List1 luma - //compute the luma fractional position - integPosx = (refList1PosX >> 2); - integPosy = (refList1PosY >> 2); - - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - mappedFracPosx = fracPosx; - mappedFracPosy = fracPosy; - - fracPos = (mappedFracPosx + (mappedFracPosy << 2)); - mappedFracPosx = FracMappedPosTabX[fracPos]; - mappedFracPosy = FracMappedPosTabY[fracPos]; - integPosx += IntegerPosoffsetTabX[fracPos]; - integPosy += IntegerPosoffsetTabY[fracPos]; - - //doing the luma interpolation + refPicList0->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, + refList0TempDst, puWidth, + puWidth, puHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + //uni-prediction List1 luma + //compute the luma fractional position + integPosx = (refList1PosX >> 2); + integPosy = (refList1PosY >> 2); + + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + mappedFracPosx = fracPosx; + mappedFracPosy = fracPosy; + + fracPos = (mappedFracPosx + (mappedFracPosy << 2)); + mappedFracPosx = FracMappedPosTabX[fracPos]; + mappedFracPosy = FracMappedPosTabY[fracPos]; + integPosx += IntegerPosoffsetTabX[fracPos]; + integPosy += IntegerPosoffsetTabY[fracPos]; + + //doing the luma interpolation AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList1->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, - refList1TempDst, puWidth, - puWidth, puHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); + refPicList1->bufferY + integPosx + integPosy*refLumaStride, refLumaStride, + refList1TempDst, puWidth, + puWidth, puHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); - // bi-pred luma - PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)](refList0TempDst, puWidth , refList1TempDst, puWidth , biDst->bufferY + dstLumaIndex, lumaStride , puWidth, puHeight ); - } + // bi-pred luma + PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)](refList0TempDst, puWidth , refList1TempDst, puWidth , biDst->bufferY + dstLumaIndex, lumaStride , puWidth, puHeight ); + } - } + } - //uni-prediction List0 chroma + //uni-prediction List0 chroma if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0, fracPosL1; - - //uni-prediction List0 luma - integPosL0x = (refList0PosX >> 3); - integPosL0y = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosL0x++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosL0y++; - - fracPosL0 = mappedFracPosx + (mappedFracPosy << 3); - - //uni-prediction List1 luma - integPosL1x = (refList1PosX >> 3); - integPosL1y = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosL1x++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosL1y++; - - fracPosL1 = mappedFracPosx + (mappedFracPosy << 3); - - shift = 0; - if ((fracPosL0 == 0) && (fracPosL1 == 0)) - { + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0, fracPosL1; + + //uni-prediction List0 luma + integPosL0x = (refList0PosX >> 3); + integPosL0y = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosL0x++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosL0y++; + + fracPosL0 = mappedFracPosx + (mappedFracPosy << 3); + + //uni-prediction List1 luma + integPosL1x = (refList1PosX >> 3); + integPosL1y = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosL1x++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosL1y++; + + fracPosL1 = mappedFracPosx + (mappedFracPosy << 3); + + shift = 0; + if ((fracPosL0 == 0) && (fracPosL1 == 0)) + { #ifndef NON_AVX512_SUPPORT BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK)]( #else BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( #endif - refPicList0->bufferCb + integPosL0x + integPosL0y * refPicList0->strideCb, - refPicList0->strideCb, - refPicList1->bufferCb + integPosL1x + integPosL1y * refPicList1->strideCb, - refPicList1->strideCb, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb << shift, - chromaPuWidth, - chromaPuHeight); + refPicList0->bufferCb + integPosL0x + integPosL0y * refPicList0->strideCb, + refPicList0->strideCb, + refPicList1->bufferCb + integPosL1x + integPosL1y * refPicList1->strideCb, + refPicList1->strideCb, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb << shift, + chromaPuWidth, + chromaPuHeight); #ifndef NON_AVX512_SUPPORT BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX512_MASK)]( #else BiPredAverageKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( #endif - refPicList0->bufferCr + integPosL0x + integPosL0y * refPicList0->strideCr, - refPicList0->strideCr, - refPicList1->bufferCr + integPosL1x + integPosL1y * refPicList1->strideCr, - refPicList1->strideCr, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr << shift, - chromaPuWidth, - chromaPuHeight); - - } - else - { - - // bi-pred chroma Cb - // Note: chromaPuWidth equals 4 is only supported in Intrinsic - // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) - //doing the chroma Cb interpolation list 0 - //compute the chroma fractional position - integPosx = (refList0PosX >> 3); - integPosy = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList0->bufferCr + integPosL0x + integPosL0y * refPicList0->strideCr, + refPicList0->strideCr, + refPicList1->bufferCr + integPosL1x + integPosL1y * refPicList1->strideCr, + refPicList1->strideCr, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr << shift, + chromaPuWidth, + chromaPuHeight); + + } + else + { + + // bi-pred chroma Cb + // Note: chromaPuWidth equals 4 is only supported in Intrinsic + // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) + //doing the chroma Cb interpolation list 0 + //compute the chroma fractional position + integPosx = (refList0PosX >> 3); + integPosy = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, - refPicList0->strideCb, - refList0TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - - //doing the chroma Cb interpolation list 1 - - integPosx = (refList1PosX >> 3); - integPosy = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, + refPicList0->strideCb, + refList0TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + + //doing the chroma Cb interpolation list 1 + + integPosx = (refList1PosX >> 3); + integPosy = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, - refPicList1->strideCb, - refList1TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - // bi-pred Chroma Cb - PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( - refList0TempDst, - chromaPuWidth << shift, - refList1TempDst, - chromaPuWidth << shift, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb << shift, - chromaPuWidth, - chromaPuHeight >> shift - ); - - - // bi-pred chroma Cr - // Note: chromaPuWidth equals 4 is only supported in Intrinsic - // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) - //doing the chroma Cb interpolation list 0 - //compute the chroma fractional position - integPosx = (refList0PosX >> 3); - integPosy = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, + refPicList1->strideCb, + refList1TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + // bi-pred Chroma Cb + PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( + refList0TempDst, + chromaPuWidth << shift, + refList1TempDst, + chromaPuWidth << shift, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb << shift, + chromaPuWidth, + chromaPuHeight >> shift + ); + + + // bi-pred chroma Cr + // Note: chromaPuWidth equals 4 is only supported in Intrinsic + // for integer positions ( mappedFracPosx + (mappedFracPosy << 3) equals 0 ) + //doing the chroma Cb interpolation list 0 + //compute the chroma fractional position + integPosx = (refList0PosX >> 3); + integPosy = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, - refPicList0->strideCr, - refList0TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - - //doing the chroma Cb interpolation list 1 - - integPosx = (refList1PosX >> 3); - integPosy = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - mappedFracPosx = 0; - if (fracPosx > 4) - integPosx++; - mappedFracPosy = 0; - if (fracPosy > 4) - integPosy++; + refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, + refPicList0->strideCr, + refList0TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + + //doing the chroma Cb interpolation list 1 + + integPosx = (refList1PosX >> 3); + integPosy = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + mappedFracPosx = 0; + if (fracPosx > 4) + integPosx++; + mappedFracPosy = 0; + if (fracPosy > 4) + integPosy++; AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][0]( - refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, - refPicList1->strideCr, - refList1TempDst, - chromaPuWidth, - chromaPuWidth, - chromaPuHeight, - firstPassIFTempDst, - mappedFracPosx ? mappedFracPosx : mappedFracPosy); - - // bi-pred Chroma Cr - PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( - refList0TempDst, - chromaPuWidth << shift, - refList1TempDst, - chromaPuWidth << shift, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr << shift, - chromaPuWidth, - chromaPuHeight >> shift - ); - } + refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, + refPicList1->strideCr, + refList1TempDst, + chromaPuWidth, + chromaPuWidth, + chromaPuHeight, + firstPassIFTempDst, + mappedFracPosx ? mappedFracPosx : mappedFracPosy); + + // bi-pred Chroma Cr + PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)]( + refList0TempDst, + chromaPuWidth << shift, + refList1TempDst, + chromaPuWidth << shift, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr << shift, + chromaPuWidth, + chromaPuHeight >> shift + ); + } } } diff --git a/Source/Lib/Codec/EbAvcStyleMcp.h b/Source/Lib/Codec/EbAvcStyleMcp.h index c8e71e17c..349dc70c3 100644 --- a/Source/Lib/Codec/EbAvcStyleMcp.h +++ b/Source/Lib/Codec/EbAvcStyleMcp.h @@ -27,13 +27,13 @@ extern "C" { void UnpackUniPredRef10Bit( - EbPictureBufferDesc_t *refFramePicList0, + EbPictureBufferDesc_t *refFramePicList0, EB_U32 posX, EB_U32 posY, EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf); @@ -48,9 +48,9 @@ void UnpackBiPredRef10Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst); @@ -62,7 +62,7 @@ void UniPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, + EB_U32 dstLumaIndex, EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 componentMask, EB_BYTE tempBuf); @@ -76,9 +76,9 @@ void BiPredIFreeRef8Bit( EB_U32 puWidth, EB_U32 puHeight, EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_U32 componentMask, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_U32 componentMask, EB_BYTE refList0TempDst, EB_BYTE refList1TempDst, EB_BYTE firstPassIFTempDst); @@ -127,17 +127,17 @@ static const AvcStyleInterpolationFilterNew FUNC_TABLE AvcStyleUniPredLumaIFFunc static const PictureAverage FUNC_TABLE PictureAverageArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT PictureAverageKernel, - // AVX2 - PictureAverageKernel_SSE2_INTRIN, + // AVX2 + PictureAverageKernel_SSE2_INTRIN, }; typedef void(*PictureAverage1Line)( - EB_BYTE src0, - EB_BYTE src1, - EB_BYTE dst, - EB_U32 areaWidth); + EB_BYTE src0, + EB_BYTE src1, + EB_BYTE dst, + EB_U32 areaWidth); static const PictureAverage1Line FUNC_TABLE PictureAverage1LineArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT diff --git a/Source/Lib/Codec/EbCabacContextModel.h b/Source/Lib/Codec/EbCabacContextModel.h index 60156686d..caa2375d3 100644 --- a/Source/Lib/Codec/EbCabacContextModel.h +++ b/Source/Lib/Codec/EbCabacContextModel.h @@ -19,9 +19,9 @@ extern "C" { #define NUMBER_OF_SKIP_FLAG_CONTEXT_MODELS 3 // number of context models for skip flag -#define NUMBER_OF_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for merge flag +#define NUMBER_OF_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for merge flag -#define NUMBER_OF_MERGE_INDEX_CONTEXT_MODELS 1 // number of context models for merge index +#define NUMBER_OF_MERGE_INDEX_CONTEXT_MODELS 1 // number of context models for merge index #define NUMBER_OF_ALF_CTRL_FLAG_CONTEXT_MODELS 1 // number of context models for ALF control flag @@ -63,7 +63,7 @@ extern "C" { #define NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS 15 // number of context models for last significant XY flag -#define TOTAL_NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS 30 // total number of context models for luma and chroma +#define TOTAL_NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS 30 // total number of context models for luma and chroma #define NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS 16 // number of context models for coefficients greater than one for Luma @@ -85,7 +85,7 @@ extern "C" { #define NUMBER_OF_ALF_SVLC_CONTEXT_MODELS 3 // number of context models for ALF SVLC (filter coefficients) -#define NUMBER_OF_SAO_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for SAO merge flags +#define NUMBER_OF_SAO_MERGE_FLAG_CONTEXT_MODELS 1 // number of context models for SAO merge flags #define NUMBER_OF_SAO_TYPE_INDEX_CONTEXT_MODELS 1 // number of context models for AO SVLC (filter coefficients) @@ -176,7 +176,7 @@ typedef struct EpContext_s { EB_ContextModel skipFlagContextModel [NUMBER_OF_SKIP_FLAG_CONTEXT_MODELS]; //Updated in both EncPass + MD EB_ContextModel mergeFlagContextModel [NUMBER_OF_MERGE_FLAG_CONTEXT_MODELS]; //Updated in both EncPass + MD EB_ContextModel mergeIndexContextModel [NUMBER_OF_MERGE_INDEX_CONTEXT_MODELS]; //Updated in both EncPass + MD - + } EpContextModel_t; typedef struct SyntaxContextModelEncContext_s { diff --git a/Source/Lib/Codec/EbCodingLoop.c b/Source/Lib/Codec/EbCodingLoop.c index 55282ad48..85eff65e8 100644 --- a/Source/Lib/Codec/EbCodingLoop.c +++ b/Source/Lib/Codec/EbCodingLoop.c @@ -168,66 +168,66 @@ static void dump_block_from_desc(int size, EbPictureBufferDesc_t *buf_tmp, int s * *******************************************/ typedef void (*EB_ENCODE_LOOP_FUNC_PTR)( - EncDecContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 originX, - EB_U32 originY, - EB_U32 cbQp, - EbPictureBufferDesc_t *predSamples, // no basis/offset - EbPictureBufferDesc_t *coeffSamplesTB, // lcu based - EbPictureBufferDesc_t *residual16bit, // no basis/offset - EbPictureBufferDesc_t *transform16bit, // no basis/offset - EB_S16 *transformScratchBuffer, - EB_U32 *countNonZeroCoeffs, - EB_U32 useDeltaQp, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 intraLumaMode, + EncDecContext_t *contextPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 originX, + EB_U32 originY, + EB_U32 cbQp, + EbPictureBufferDesc_t *predSamples, // no basis/offset + EbPictureBufferDesc_t *coeffSamplesTB, // lcu based + EbPictureBufferDesc_t *residual16bit, // no basis/offset + EbPictureBufferDesc_t *transform16bit, // no basis/offset + EB_S16 *transformScratchBuffer, + EB_U32 *countNonZeroCoeffs, + EB_U32 useDeltaQp, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 intraLumaMode, EB_U32 componentMask, EB_COLOR_FORMAT colorFormat, EB_BOOL secondChroma, EB_U32 tuSize, - CabacCost_t *CabacCost, - EB_U32 dZoffset) ; + CabacCost_t *CabacCost, + EB_U32 dZoffset) ; typedef void (*EB_GENERATE_RECON_FUNC_PTR)( EncDecContext_t *contextPtr, - EB_U32 originX, - EB_U32 originY, + EB_U32 originX, + EB_U32 originY, EB_U32 componentMask, EB_COLOR_FORMAT colorFormat, EB_BOOL secondChroma, EB_U32 tuSize, - EbPictureBufferDesc_t *predSamples, // no basis/offset - EbPictureBufferDesc_t *residual16bit, // no basis/offset - EB_S16 *transformScratchBuffer); + EbPictureBufferDesc_t *predSamples, // no basis/offset + EbPictureBufferDesc_t *residual16bit, // no basis/offset + EB_S16 *transformScratchBuffer); typedef void (*EB_ENCODE_LOOP_INTRA_4x4_FUNC_PTR)( - EncDecContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 originX, - EB_U32 originY, - EB_U32 cbQp, - EbPictureBufferDesc_t *predSamples, // no basis/offset - EbPictureBufferDesc_t *coeffSamplesTB, // lcu based - EbPictureBufferDesc_t *residual16bit, // no basis/offset - EbPictureBufferDesc_t *transform16bit, // no basis/offset - EB_S16 *transformScratchBuffer, - EB_U32 *countNonZeroCoeffs, - EB_U32 componentMask, - EB_U32 useDeltaQp, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 intraLumaMode, - CabacCost_t *CabacCost, - EB_U32 dZoffset) ; + EncDecContext_t *contextPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 originX, + EB_U32 originY, + EB_U32 cbQp, + EbPictureBufferDesc_t *predSamples, // no basis/offset + EbPictureBufferDesc_t *coeffSamplesTB, // lcu based + EbPictureBufferDesc_t *residual16bit, // no basis/offset + EbPictureBufferDesc_t *transform16bit, // no basis/offset + EB_S16 *transformScratchBuffer, + EB_U32 *countNonZeroCoeffs, + EB_U32 componentMask, + EB_U32 useDeltaQp, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 intraLumaMode, + CabacCost_t *CabacCost, + EB_U32 dZoffset) ; typedef void (*EB_GENERATE_RECON_INTRA_4x4_FUNC_PTR)( EncDecContext_t *contextPtr, - EB_U32 originX, - EB_U32 originY, - EbPictureBufferDesc_t *predSamples, // no basis/offset - EbPictureBufferDesc_t *residual16bit, // no basis/offset - EB_S16 *transformScratchBuffer, - EB_U32 componentMask); + EB_U32 originX, + EB_U32 originY, + EbPictureBufferDesc_t *predSamples, // no basis/offset + EbPictureBufferDesc_t *residual16bit, // no basis/offset + EB_S16 *transformScratchBuffer, + EB_U32 componentMask); typedef EB_ERRORTYPE(*EB_GENERATE_INTRA_SAMPLES_FUNC_PTR)( EB_BOOL constrainedIntraFlag, //input parameter, indicates if constrained intra is switched on/off @@ -310,7 +310,7 @@ typedef EB_ERRORTYPE(*EB_ENC_PASS_INTRA4X4_FUNC_PTR)( EB_U32 componentMask); typedef EB_ERRORTYPE (*EB_LCU_INTERNAL_DLF_FUNC_PTR)( - EbPictureBufferDesc_t *reconpicture, + EbPictureBufferDesc_t *reconpicture, EB_U32 lcuPosx, EB_U32 lcuPosy, EB_U32 lcuWidth, @@ -319,7 +319,7 @@ typedef EB_ERRORTYPE (*EB_LCU_INTERNAL_DLF_FUNC_PTR)( EB_U8 *horizontalEdgeBSArray, PictureControlSet_t *reconPictureControlSet); typedef void (*EB_LCU_BOUNDARY_DLF_FUNC_PTR)( - EbPictureBufferDesc_t *reconpicture, + EbPictureBufferDesc_t *reconpicture, EB_U32 lcuPos_x, EB_U32 lcuPos_y, EB_U32 lcuWidth, @@ -346,65 +346,65 @@ void AddChromaEncDec( EncDecContext_t *contextPtrED, EbPictureBufferDesc_t *inputPicturePtr, EB_U32 inputCbOriginIndex, - EB_U32 cuChromaOriginIndex, + EB_U32 cuChromaOriginIndex, EB_U32 candIdxInput); /*************************************************** * Update Coding Unit Neighbor Arrays ***************************************************/ static void EncodePassUpdateLeafDepthNeighborArrays( - NeighborArrayUnit_t *leafDepthNeighborArray, + NeighborArrayUnit_t *leafDepthNeighborArray, EB_U8 depth, - EB_U32 originX, - EB_U32 originY, - EB_U32 size) + EB_U32 originX, + EB_U32 originY, + EB_U32 size) { - // Mode Type Update - NeighborArrayUnitModeWrite( - leafDepthNeighborArray, + // Mode Type Update + NeighborArrayUnitModeWrite( + leafDepthNeighborArray, &depth, - originX, - originY, - size, - size, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + originX, + originY, + size, + size, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); - return; + return; } /*************************************************** * Update Intra Mode Neighbor Arrays ***************************************************/ static void EncodePassUpdateIntraModeNeighborArrays( - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, EB_U8 lumaMode, - EB_U32 originX, - EB_U32 originY, - EB_U32 size) + EB_U32 originX, + EB_U32 originY, + EB_U32 size) { - EB_U8 modeType = INTRA_MODE; - - // Mode Type Update - NeighborArrayUnitModeWrite( - modeTypeNeighborArray, - &modeType, - originX, - originY, - size, - size, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - // Intra Luma Mode Update - NeighborArrayUnitModeWrite( - intraLumaModeNeighborArray, + EB_U8 modeType = INTRA_MODE; + + // Mode Type Update + NeighborArrayUnitModeWrite( + modeTypeNeighborArray, + &modeType, + originX, + originY, + size, + size, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + // Intra Luma Mode Update + NeighborArrayUnitModeWrite( + intraLumaModeNeighborArray, &lumaMode, - originX, - originY, - size, - size, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + originX, + originY, + size, + size, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); - return; + return; } /*************************************************** @@ -574,59 +574,59 @@ static void EncodePassUpdateReconSampleNeighborArrays( * Update Intra Luma Neighbor Modes ************************************************************/ void EbHevcGeneratePuIntraLumaNeighborModes( - CodingUnit_t *cuPtr, - EB_U32 puOriginX, - EB_U32 puOriginY, - EB_U32 lcuSize, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray) + CodingUnit_t *cuPtr, + EB_U32 puOriginX, + EB_U32 puOriginY, + EB_U32 lcuSize, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray) { EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - puOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - puOriginX); - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaNeighborArray, - puOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaNeighborArray, - puOriginX); - - (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); - - (&cuPtr->predictionUnitArray[0])->intraLumaTopMode = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - ((puOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then - (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width - - - return; + modeTypeNeighborArray, + puOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + puOriginX); + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaNeighborArray, + puOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaNeighborArray, + puOriginX); + + (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode = (EB_U32)( + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + + (&cuPtr->predictionUnitArray[0])->intraLumaTopMode = (EB_U32)( + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + ((puOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then + (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width + + + return; } /********************************************************** * Encode Pass - Update Sao Parameter Neighbor Array **********************************************************/ static void EncodePassUpdateSaoNeighborArrays( - NeighborArrayUnit_t *saoParamNeighborArray, - SaoParameters_t *saoParams, - EB_U32 originX, - EB_U32 originY, - EB_U32 size) + NeighborArrayUnit_t *saoParamNeighborArray, + SaoParameters_t *saoParams, + EB_U32 originX, + EB_U32 originY, + EB_U32 size) { - NeighborArrayUnitModeWrite( - saoParamNeighborArray, - (EB_U8*)saoParams, - originX, - originY, - size, - size, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); - - return; + NeighborArrayUnitModeWrite( + saoParamNeighborArray, + (EB_U8*)saoParams, + originX, + originY, + size, + size, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + + return; } /********************************************************** @@ -649,30 +649,30 @@ static void EncodePassUpdateSaoNeighborArrays( **********************************************************/ static void EncodeLoop( - EncDecContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 originX, - EB_U32 originY, - EB_U32 cbQp, - EbPictureBufferDesc_t *predSamples, // no basis/offset - EbPictureBufferDesc_t *coeffSamplesTB, // lcu based - EbPictureBufferDesc_t *residual16bit, // no basis/offset - EbPictureBufferDesc_t *transform16bit, // no basis/offset - EB_S16 *transformScratchBuffer, - EB_U32 *countNonZeroCoeffs, - EB_U32 useDeltaQp, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 intraLumaMode, + EncDecContext_t *contextPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 originX, + EB_U32 originY, + EB_U32 cbQp, + EbPictureBufferDesc_t *predSamples, // no basis/offset + EbPictureBufferDesc_t *coeffSamplesTB, // lcu based + EbPictureBufferDesc_t *residual16bit, // no basis/offset + EbPictureBufferDesc_t *transform16bit, // no basis/offset + EB_S16 *transformScratchBuffer, + EB_U32 *countNonZeroCoeffs, + EB_U32 useDeltaQp, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 intraLumaMode, EB_U32 componentMask, EB_COLOR_FORMAT colorFormat, EB_BOOL secondChroma, EB_U32 tuSize, - CabacCost_t *CabacCost, - EB_U32 dZoffset) + CabacCost_t *CabacCost, + EB_U32 dZoffset) { EB_U32 chromaQp = cbQp; - CodingUnit_t *cuPtr = contextPtr->cuPtr; + CodingUnit_t *cuPtr = contextPtr->cuPtr; TransformUnit_t *tuPtr = &cuPtr->transformUnitArray[contextPtr->tuItr]; EB_PICTURE sliceType = lcuPtr->pictureControlSetPtr->sliceType; EB_U32 temporalLayerIndex = lcuPtr->pictureControlSetPtr->temporalLayerIndex; @@ -686,23 +686,23 @@ static void EncodeLoop( tuChromaOffset = tuSize >> 1; } - const EB_U32 inputLumaOffset = ((originY + inputSamples->originY) * inputSamples->strideY) + (originX + inputSamples->originX); + const EB_U32 inputLumaOffset = ((originY + inputSamples->originY) * inputSamples->strideY) + (originX + inputSamples->originX); const EB_U32 predLumaOffset = ((predSamples->originY+originY) * predSamples->strideY) + (predSamples->originX+originX); const EB_U32 scratchLumaOffset = ((originY & (64 - 1)) * 64) + (originX & (64 - 1)); - const EB_U32 inputCbOffset = ((originX + inputSamples->originX) >> subWidthCMinus1) + + const EB_U32 inputCbOffset = ((originX + inputSamples->originX) >> subWidthCMinus1) + (((originY + tuChromaOffset + inputSamples->originY) >> subHeightCMinus1) * inputSamples->strideCb); - const EB_U32 inputCrOffset = ((originX + inputSamples->originX) >> subWidthCMinus1) + + const EB_U32 inputCrOffset = ((originX + inputSamples->originX) >> subWidthCMinus1) + (((originY + tuChromaOffset + inputSamples->originY) >> subHeightCMinus1) * inputSamples->strideCr); - const EB_U32 predCbOffset = ((predSamples->originX+originX) >> subWidthCMinus1) + + const EB_U32 predCbOffset = ((predSamples->originX+originX) >> subWidthCMinus1) + (((predSamples->originY+originY+tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCb); - const EB_U32 predCrOffset = ((predSamples->originX+originX) >> subWidthCMinus1) + + const EB_U32 predCrOffset = ((predSamples->originX+originX) >> subWidthCMinus1) + (((predSamples->originY+originY+tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCr); - const EB_U32 scratchCbOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + + const EB_U32 scratchCbOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + ((((originY + tuChromaOffset) & (64 - 1)) >> subHeightCMinus1) * (64 >> subWidthCMinus1)); - const EB_U32 scratchCrOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + + const EB_U32 scratchCrOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + ((((originY + tuChromaOffset) & (64 - 1)) >> subHeightCMinus1) * (64 >> subWidthCMinus1)); EB_U8 enableContouringQCUpdateFlag; @@ -712,9 +712,9 @@ static void EncodeLoop( lcuPtr->index, cuPtr->leafIndex) && (cuPtr->qp < lcuPtr->pictureControlSetPtr->pictureQp); - //********************************** - // Luma - //********************************** + //********************************** + // Luma + //********************************** if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { PictureResidual( inputSamples->bufferY + inputLumaOffset, @@ -737,39 +737,39 @@ static void EncodeLoop( (EB_BOOL)(tuSize == MIN_PU_SIZE), contextPtr->transCoeffShapeLuma); - UnifiedQuantizeInvQuantize( - contextPtr, - lcuPtr->pictureControlSetPtr, - ((EB_S16*)transform16bit->bufferY) + scratchLumaOffset, + UnifiedQuantizeInvQuantize( + contextPtr, + lcuPtr->pictureControlSetPtr, + ((EB_S16*)transform16bit->bufferY) + scratchLumaOffset, transform16bit->strideY, //64, - ((EB_S16*)coeffSamplesTB->bufferY) + scratchLumaOffset, - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - qp, - inputSamples->bitDepth, - tuSize, - sliceType, - &(countNonZeroCoeffs[0]), - contextPtr->transCoeffShapeLuma, - contextPtr->cleanSparseCeoffPfEncDec, - contextPtr->pmpMaskingLevelEncDec, - cuPtr->predictionModeFlag, - 0, - enableContouringQCUpdateFlag, - COMPONENT_LUMA, - temporalLayerIndex, - dZoffset, - cabacEncodeCtxPtr, - contextPtr->fullLambda, - intraLumaMode, - EB_INTRA_CHROMA_DM, - CabacCost); - - tuPtr->lumaCbf = countNonZeroCoeffs[0] ? EB_TRUE : EB_FALSE; + ((EB_S16*)coeffSamplesTB->bufferY) + scratchLumaOffset, + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + qp, + inputSamples->bitDepth, + tuSize, + sliceType, + &(countNonZeroCoeffs[0]), + contextPtr->transCoeffShapeLuma, + contextPtr->cleanSparseCeoffPfEncDec, + contextPtr->pmpMaskingLevelEncDec, + cuPtr->predictionModeFlag, + 0, + enableContouringQCUpdateFlag, + COMPONENT_LUMA, + temporalLayerIndex, + dZoffset, + cabacEncodeCtxPtr, + contextPtr->fullLambda, + intraLumaMode, + EB_INTRA_CHROMA_DM, + CabacCost); + + tuPtr->lumaCbf = countNonZeroCoeffs[0] ? EB_TRUE : EB_FALSE; if (tuSize > MIN_PU_SIZE) { - tuPtr->isOnlyDc[0] = (countNonZeroCoeffs[0] == 1 && (((EB_S16*)residual16bit->bufferY) + scratchLumaOffset)[0] != 0 && tuSize != 32) ? - EB_TRUE : - EB_FALSE; + tuPtr->isOnlyDc[0] = (countNonZeroCoeffs[0] == 1 && (((EB_S16*)residual16bit->bufferY) + scratchLumaOffset)[0] != 0 && tuSize != 32) ? + EB_TRUE : + EB_FALSE; if (contextPtr->transCoeffShapeLuma && tuPtr->lumaCbf && tuPtr->isOnlyDc[0] == EB_FALSE) { if (contextPtr->transCoeffShapeLuma == N2_SHAPE || contextPtr->transCoeffShapeLuma == N4_SHAPE) { @@ -787,93 +787,93 @@ static void EncodeLoop( } } } else { - if (contextPtr->transCoeffShapeLuma && tuPtr->lumaCbf) { - PfZeroOutUselessQuadrants( - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - residual16bit->strideY, //64, - (tuSize >> 1)); - - if (contextPtr->transCoeffShapeLuma == N4_SHAPE) { - PfZeroOutUselessQuadrants( - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - residual16bit->strideY, //64, - (tuSize >> 2)); - } - } - } - } + if (contextPtr->transCoeffShapeLuma && tuPtr->lumaCbf) { + PfZeroOutUselessQuadrants( + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + residual16bit->strideY, //64, + (tuSize >> 1)); + + if (contextPtr->transCoeffShapeLuma == N4_SHAPE) { + PfZeroOutUselessQuadrants( + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + residual16bit->strideY, //64, + (tuSize >> 2)); + } + } + } + } if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - //********************************** - // Cb - //********************************** - PictureResidual( - inputSamples->bufferCb + inputCbOffset, - inputSamples->strideCb, - predSamples->bufferCb + predCbOffset, - predSamples->strideCb, - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, - residual16bit->strideCb, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); - - // For the case that DC path chosen for chroma, we check the DC values and determine to use DC or N2Shape for chroma. Since there is only one flag for ChromaShaping, we do the prediction of Cr and Cb and decide on the chroma shaping - if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { - EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, - tuSize >> subWidthCMinus1, - residual16bit->strideCb); + //********************************** + // Cb + //********************************** + PictureResidual( + inputSamples->bufferCb + inputCbOffset, + inputSamples->strideCb, + predSamples->bufferCb + predCbOffset, + predSamples->strideCb, + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + residual16bit->strideCb, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); + + // For the case that DC path chosen for chroma, we check the DC values and determine to use DC or N2Shape for chroma. Since there is only one flag for ChromaShaping, we do the prediction of Cr and Cb and decide on the chroma shaping + if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { + EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + tuSize >> subWidthCMinus1, + residual16bit->strideCb); // Normalized based on the size. - sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); - if (sumResidual > 0) { - contextPtr->transCoeffShapeChroma = N2_SHAPE; - } - } - - EstimateTransform( - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); + if (sumResidual > 0) { + contextPtr->transCoeffShapeChroma = N2_SHAPE; + } + } + + EstimateTransform( + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, residual16bit->strideCb, - ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, + ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, transform16bit->strideCb, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - transformScratchBuffer, - BIT_INCREMENT_8BIT, - EB_FALSE, - contextPtr->transCoeffShapeChroma); - - UnifiedQuantizeInvQuantize( - contextPtr, - lcuPtr->pictureControlSetPtr, - ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + transformScratchBuffer, + BIT_INCREMENT_8BIT, + EB_FALSE, + contextPtr->transCoeffShapeChroma); + + UnifiedQuantizeInvQuantize( + contextPtr, + lcuPtr->pictureControlSetPtr, + ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, transform16bit->strideCb, - ((EB_S16*)coeffSamplesTB->bufferCb) + scratchCbOffset, - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, - chromaQp, - inputSamples->bitDepth, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - sliceType, - &(countNonZeroCoeffs[1]), - contextPtr->transCoeffShapeChroma, - contextPtr->cleanSparseCeoffPfEncDec, - contextPtr->pmpMaskingLevelEncDec, - cuPtr->predictionModeFlag, - useDeltaQp == EB_TRUE ? contextPtr->forceCbfFlag : 0, - enableContouringQCUpdateFlag, - COMPONENT_CHROMA, - temporalLayerIndex, - 0, - cabacEncodeCtxPtr, - contextPtr->fullLambda, - intraLumaMode, - EB_INTRA_CHROMA_DM, - CabacCost); - - if (secondChroma) { - tuPtr->cbCbf2 = countNonZeroCoeffs[1] ? EB_TRUE : EB_FALSE; - tuPtr->isOnlyDc2[0] = (countNonZeroCoeffs[1] == 1 && (((EB_S16*)residual16bit->bufferCb) + scratchCbOffset)[0] != 0) ? - EB_TRUE : - EB_FALSE; + ((EB_S16*)coeffSamplesTB->bufferCb) + scratchCbOffset, + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + chromaQp, + inputSamples->bitDepth, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + sliceType, + &(countNonZeroCoeffs[1]), + contextPtr->transCoeffShapeChroma, + contextPtr->cleanSparseCeoffPfEncDec, + contextPtr->pmpMaskingLevelEncDec, + cuPtr->predictionModeFlag, + useDeltaQp == EB_TRUE ? contextPtr->forceCbfFlag : 0, + enableContouringQCUpdateFlag, + COMPONENT_CHROMA, + temporalLayerIndex, + 0, + cabacEncodeCtxPtr, + contextPtr->fullLambda, + intraLumaMode, + EB_INTRA_CHROMA_DM, + CabacCost); + + if (secondChroma) { + tuPtr->cbCbf2 = countNonZeroCoeffs[1] ? EB_TRUE : EB_FALSE; + tuPtr->isOnlyDc2[0] = (countNonZeroCoeffs[1] == 1 && (((EB_S16*)residual16bit->bufferCb) + scratchCbOffset)[0] != 0) ? + EB_TRUE : + EB_FALSE; } else { tuPtr->cbCbf = countNonZeroCoeffs[1] ? EB_TRUE : EB_FALSE; @@ -915,41 +915,41 @@ static void EncodeLoop( } - //********************************** - // Cr - //********************************** - PictureResidual( - inputSamples->bufferCr + inputCrOffset, - inputSamples->strideCr, - predSamples->bufferCr + predCrOffset, - predSamples->strideCr, - ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, + //********************************** + // Cr + //********************************** + PictureResidual( + inputSamples->bufferCr + inputCrOffset, + inputSamples->strideCr, + predSamples->bufferCr + predCrOffset, + predSamples->strideCr, + ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, residual16bit->strideCr, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); - - if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { - EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, - tuSize >> subWidthCMinus1, - residual16bit->strideCr); - - sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); - if (sumResidual > 0) { - contextPtr->transCoeffShapeChroma = N2_SHAPE; - } - } - - EstimateTransform( - ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); + + if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { + EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, + tuSize >> subWidthCMinus1, + residual16bit->strideCr); + + sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); + if (sumResidual > 0) { + contextPtr->transCoeffShapeChroma = N2_SHAPE; + } + } + + EstimateTransform( + ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, residual16bit->strideCr, - ((EB_S16*)transform16bit->bufferCr) + scratchCrOffset, + ((EB_S16*)transform16bit->bufferCr) + scratchCrOffset, transform16bit->strideCr, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - transformScratchBuffer, - BIT_INCREMENT_8BIT, - EB_FALSE, - contextPtr->transCoeffShapeChroma); + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + transformScratchBuffer, + BIT_INCREMENT_8BIT, + EB_FALSE, + contextPtr->transCoeffShapeChroma); UnifiedQuantizeInvQuantize( contextPtr, @@ -979,10 +979,10 @@ static void EncodeLoop( CabacCost); if ((componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) && secondChroma) { - tuPtr->crCbf2 = countNonZeroCoeffs[2] ? EB_TRUE : EB_FALSE; - tuPtr->isOnlyDc2[1] = (countNonZeroCoeffs[2] == 1 && (((EB_S16*)residual16bit->bufferCr) + scratchCbOffset)[0] != 0) ? - EB_TRUE : - EB_FALSE; + tuPtr->crCbf2 = countNonZeroCoeffs[2] ? EB_TRUE : EB_FALSE; + tuPtr->isOnlyDc2[1] = (countNonZeroCoeffs[2] == 1 && (((EB_S16*)residual16bit->bufferCr) + scratchCbOffset)[0] != 0) ? + EB_TRUE : + EB_FALSE; } else { tuPtr->crCbf = countNonZeroCoeffs[2] ? EB_TRUE : EB_FALSE; @@ -1022,7 +1022,7 @@ static void EncodeLoop( } } } - } + } #ifdef DEBUG_REF_INFO if (lcuPtr->pictureControlSetPtr->pictureNumber == 0) { { @@ -1050,16 +1050,16 @@ static void EncodeLoop( if ((componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) && secondChroma) { tuPtr->nzCoefCount2[0] = (EB_U16)countNonZeroCoeffs[1]; tuPtr->nzCoefCount2[1] = (EB_U16)countNonZeroCoeffs[2]; - tuPtr->transCoeffShapeChroma2 = contextPtr->transCoeffShapeChroma; + tuPtr->transCoeffShapeChroma2 = contextPtr->transCoeffShapeChroma; } else { - tuPtr->transCoeffShapeLuma = contextPtr->transCoeffShapeLuma; - tuPtr->transCoeffShapeChroma = contextPtr->transCoeffShapeChroma; + tuPtr->transCoeffShapeLuma = contextPtr->transCoeffShapeLuma; + tuPtr->transCoeffShapeChroma = contextPtr->transCoeffShapeChroma; tuPtr->nzCoefCount[0] = (EB_U16)countNonZeroCoeffs[0]; tuPtr->nzCoefCount[1] = (EB_U16)countNonZeroCoeffs[1]; tuPtr->nzCoefCount[2] = (EB_U16)countNonZeroCoeffs[2]; } - return; + return; } /********************************************************** @@ -1082,25 +1082,25 @@ static void EncodeLoop( * **********************************************************/ static void EncodeGenerateRecon( - EncDecContext_t *contextPtr, - EB_U32 originX, - EB_U32 originY, + EncDecContext_t *contextPtr, + EB_U32 originX, + EB_U32 originY, EB_U32 componentMask, EB_COLOR_FORMAT colorFormat, EB_BOOL secondChroma, EB_U32 tuSize, - EbPictureBufferDesc_t *predSamples, // no basis/offset - EbPictureBufferDesc_t *residual16bit, // no basis/offset - EB_S16 *transformScratchBuffer) + EbPictureBufferDesc_t *predSamples, // no basis/offset + EbPictureBufferDesc_t *residual16bit, // no basis/offset + EB_S16 *transformScratchBuffer) { - EB_U32 predLumaOffset; - EB_U32 predChromaOffset; - EB_U32 scratchLumaOffset; - EB_U32 scratchChromaOffset; - EB_U32 reconLumaOffset; - EB_U32 reconChromaOffset; - - CodingUnit_t *cuPtr = contextPtr->cuPtr; + EB_U32 predLumaOffset; + EB_U32 predChromaOffset; + EB_U32 scratchLumaOffset; + EB_U32 scratchChromaOffset; + EB_U32 reconLumaOffset; + EB_U32 reconChromaOffset; + + CodingUnit_t *cuPtr = contextPtr->cuPtr; TransformUnit_t *tuPtr = &cuPtr->transformUnitArray[contextPtr->tuItr]; EbPictureBufferDesc_t *reconSamples = predSamples; @@ -1113,114 +1113,114 @@ static void EncodeGenerateRecon( } EB_BOOL cbCbf=secondChroma?tuPtr->cbCbf2:tuPtr->cbCbf; EB_BOOL crCbf=secondChroma?tuPtr->crCbf2:tuPtr->crCbf; - // *Note - The prediction is built in-place in the Recon buffer. It is overwritten with Reconstructed - // samples if the CBF==1 && SKIP==False + // *Note - The prediction is built in-place in the Recon buffer. It is overwritten with Reconstructed + // samples if the CBF==1 && SKIP==False - //********************************** - // Luma - //********************************** + //********************************** + // Luma + //********************************** if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { predLumaOffset = (predSamples->originY+originY) * predSamples->strideY + (predSamples->originX+originX); - scratchLumaOffset = ((originY & (63)) * 64) + (originX & (63)); + scratchLumaOffset = ((originY & (63)) * 64) + (originX & (63)); reconLumaOffset = (reconSamples->originY+originY) * reconSamples->strideY + (reconSamples->originX+originX); - if (tuPtr->lumaCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { - - EncodeInvTransform( - (tuSize==MIN_PU_SIZE)?EB_FALSE:(tuPtr->transCoeffShapeLuma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[0]), - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - residual16bit->strideY, - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - residual16bit->strideY, - tuSize, - transformScratchBuffer, - BIT_INCREMENT_8BIT, - (EB_BOOL)(tuSize == MIN_PU_SIZE)); - - AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][tuSize >> 3]( - predSamples->bufferY + predLumaOffset, - predSamples->strideY, - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - residual16bit->strideY, - reconSamples->bufferY + reconLumaOffset, - reconSamples->strideY, - tuSize, - tuSize); - } - } - - //********************************** - // Chroma - //********************************** + if (tuPtr->lumaCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { + + EncodeInvTransform( + (tuSize==MIN_PU_SIZE)?EB_FALSE:(tuPtr->transCoeffShapeLuma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[0]), + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + residual16bit->strideY, + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + residual16bit->strideY, + tuSize, + transformScratchBuffer, + BIT_INCREMENT_8BIT, + (EB_BOOL)(tuSize == MIN_PU_SIZE)); + + AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][tuSize >> 3]( + predSamples->bufferY + predLumaOffset, + predSamples->strideY, + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + residual16bit->strideY, + reconSamples->bufferY + reconLumaOffset, + reconSamples->strideY, + tuSize, + tuSize); + } + } + + //********************************** + // Chroma + //********************************** if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { predChromaOffset = ((predSamples->originX + originX) >> subWidthCMinus1) + (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCb); - scratchChromaOffset = ((originX & 63) >> subWidthCMinus1) + + scratchChromaOffset = ((originX & 63) >> subWidthCMinus1) + (((originY+tuChromaOffset) & 63) >> subHeightCMinus1) * (64 >> subWidthCMinus1); - reconChromaOffset = ((reconSamples->originX + originX) >> subWidthCMinus1) + + reconChromaOffset = ((reconSamples->originX + originX) >> subWidthCMinus1) + (((reconSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * reconSamples->strideCb); - //********************************** - // Cb - //********************************** - if (cbCbf== EB_TRUE && cuPtr->skipFlag == EB_FALSE) { - EncodeInvTransform( - (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[0]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[1])), - ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, - residual16bit->strideCb, - ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, - residual16bit->strideCb, + //********************************** + // Cb + //********************************** + if (cbCbf== EB_TRUE && cuPtr->skipFlag == EB_FALSE) { + EncodeInvTransform( + (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[0]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[1])), + ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, + residual16bit->strideCb, + ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, + residual16bit->strideCb, tuSize >> shift_bit, - transformScratchBuffer, - BIT_INCREMENT_8BIT, - EB_FALSE); - - AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][tuSize >> (3 + shift_bit)]( - predSamples->bufferCb + predChromaOffset, - predSamples->strideCb, - ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, - residual16bit->strideCb, - reconSamples->bufferCb + reconChromaOffset, - reconSamples->strideCb, + transformScratchBuffer, + BIT_INCREMENT_8BIT, + EB_FALSE); + + AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][tuSize >> (3 + shift_bit)]( + predSamples->bufferCb + predChromaOffset, + predSamples->strideCb, + ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, + residual16bit->strideCb, + reconSamples->bufferCb + reconChromaOffset, + reconSamples->strideCb, tuSize >> shift_bit, tuSize >> shift_bit); - } + } - //********************************** - // Cr - //********************************** + //********************************** + // Cr + //********************************** predChromaOffset = ((predSamples->originX+originX) >> subWidthCMinus1) + (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCr); - scratchChromaOffset = ((originX & (63)) >> subWidthCMinus1) + + scratchChromaOffset = ((originX & (63)) >> subWidthCMinus1) + (((originY+tuChromaOffset) & 63) >> subHeightCMinus1) * (64 >> subWidthCMinus1); - reconChromaOffset = ((reconSamples->originX+originX) >> subWidthCMinus1) + + reconChromaOffset = ((reconSamples->originX+originX) >> subWidthCMinus1) + (((reconSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * reconSamples->strideCr); - if (crCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { - EncodeInvTransform( - (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[1]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[2])), - ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, - residual16bit->strideCr, - ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, - residual16bit->strideCr, - tuSize >> shift_bit, - transformScratchBuffer, - BIT_INCREMENT_8BIT, - EB_FALSE); - - AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][tuSize >> (3 + shift_bit)]( - predSamples->bufferCr + predChromaOffset, - predSamples->strideCr, - ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, - residual16bit->strideCr, - reconSamples->bufferCr + reconChromaOffset, - reconSamples->strideCr, - tuSize >> shift_bit, - tuSize >> shift_bit); - } - } - - return; + if (crCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { + EncodeInvTransform( + (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[1]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[2])), + ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, + residual16bit->strideCr, + ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, + residual16bit->strideCr, + tuSize >> shift_bit, + transformScratchBuffer, + BIT_INCREMENT_8BIT, + EB_FALSE); + + AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][tuSize >> (3 + shift_bit)]( + predSamples->bufferCr + predChromaOffset, + predSamples->strideCr, + ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, + residual16bit->strideCr, + reconSamples->bufferCr + reconChromaOffset, + reconSamples->strideCr, + tuSize >> shift_bit, + tuSize >> shift_bit); + } + } + + return; } /********************************************************** @@ -1242,26 +1242,26 @@ static void EncodeGenerateRecon( * **********************************************************/ static void EncodeLoop16bit( - EncDecContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 originX, - EB_U32 originY, - EB_U32 cbQp, - EbPictureBufferDesc_t *predSamples, // no basis/offset - EbPictureBufferDesc_t *coeffSamplesTB, // lcu based - EbPictureBufferDesc_t *residual16bit, // no basis/offset - EbPictureBufferDesc_t *transform16bit, // no basis/offset - EB_S16 *transformScratchBuffer, - EB_U32 *countNonZeroCoeffs, - EB_U32 useDeltaQp, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 intraLumaMode, + EncDecContext_t *contextPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 originX, + EB_U32 originY, + EB_U32 cbQp, + EbPictureBufferDesc_t *predSamples, // no basis/offset + EbPictureBufferDesc_t *coeffSamplesTB, // lcu based + EbPictureBufferDesc_t *residual16bit, // no basis/offset + EbPictureBufferDesc_t *transform16bit, // no basis/offset + EB_S16 *transformScratchBuffer, + EB_U32 *countNonZeroCoeffs, + EB_U32 useDeltaQp, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 intraLumaMode, EB_U32 componentMask, EB_COLOR_FORMAT colorFormat, EB_BOOL secondChroma, EB_U32 tuSize, - CabacCost_t *CabacCost, - EB_U32 dZoffset) + CabacCost_t *CabacCost, + EB_U32 dZoffset) { EB_U32 chromaQp = cbQp; CodingUnit_t *cuPtr = contextPtr->cuPtr; @@ -1283,17 +1283,17 @@ static void EncodeLoop16bit( const EB_U32 predLumaOffset = ((predSamples16bit->originY + originY) * predSamples16bit->strideY) + (predSamples16bit->originX + originX); const EB_U32 scratchLumaOffset = ((originY & 63) * 64) + (originX & 63); - const EB_U32 inputCbOffset = ((((originY + tuChromaOffset) & 63) >> subHeightCMinus1) * inputSamples16bit->strideCb) + ((originX & 63) >> subWidthCMinus1); - const EB_U32 inputCrOffset = ((((originY + tuChromaOffset) & 63) >> subHeightCMinus1) * inputSamples16bit->strideCr) + ((originX & 63) >> subWidthCMinus1); + const EB_U32 inputCbOffset = ((((originY + tuChromaOffset) & 63) >> subHeightCMinus1) * inputSamples16bit->strideCb) + ((originX & 63) >> subWidthCMinus1); + const EB_U32 inputCrOffset = ((((originY + tuChromaOffset) & 63) >> subHeightCMinus1) * inputSamples16bit->strideCr) + ((originX & 63) >> subWidthCMinus1); - const EB_U32 predCbOffset = ((predSamples->originX + originX) >> subWidthCMinus1) + + const EB_U32 predCbOffset = ((predSamples->originX + originX) >> subWidthCMinus1) + (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCb); - const EB_U32 predCrOffset = ((predSamples->originX + originX) >> subWidthCMinus1) + + const EB_U32 predCrOffset = ((predSamples->originX + originX) >> subWidthCMinus1) + (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCr); - const EB_U32 scratchCbOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + + const EB_U32 scratchCbOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + ((((originY + tuChromaOffset) & (64 - 1)) >> subHeightCMinus1) * (64 >> subWidthCMinus1)); - const EB_U32 scratchCrOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + + const EB_U32 scratchCrOffset = ((originX & (64 - 1)) >> subWidthCMinus1) + ((((originY + tuChromaOffset) & (64 - 1)) >> subHeightCMinus1) * (64 >> subWidthCMinus1)); EB_U8 enableContouringQCUpdateFlag; @@ -1304,16 +1304,16 @@ static void EncodeLoop16bit( cuPtr->leafIndex) && (cuPtr->qp < lcuPtr->pictureControlSetPtr->pictureQp); //Update QP for Quant - qp += QP_BD_OFFSET; - chromaQp += QP_BD_OFFSET; + qp += QP_BD_OFFSET; + chromaQp += QP_BD_OFFSET; if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - PictureResidual16bit( - ((EB_U16*)inputSamples16bit->bufferY) + inputLumaOffset, - inputSamples16bit->strideY, - ((EB_U16*)predSamples16bit->bufferY) + predLumaOffset, - predSamples16bit->strideY, + PictureResidual16bit( + ((EB_U16*)inputSamples16bit->bufferY) + inputLumaOffset, + inputSamples16bit->strideY, + ((EB_U16*)predSamples16bit->bufferY) + predLumaOffset, + predSamples16bit->strideY, ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, 64, tuSize, @@ -1330,39 +1330,39 @@ static void EncodeLoop16bit( (EB_BOOL)(tuSize == MIN_PU_SIZE), contextPtr->transCoeffShapeLuma); - UnifiedQuantizeInvQuantize( - contextPtr, - lcuPtr->pictureControlSetPtr, - ((EB_S16*)transform16bit->bufferY) + scratchLumaOffset, - 64, - ((EB_S16*)coeffSamplesTB->bufferY) + scratchLumaOffset, - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - qp, - EB_10BIT, - tuSize, - sliceType, - &(countNonZeroCoeffs[0]), - contextPtr->transCoeffShapeLuma, - contextPtr->cleanSparseCeoffPfEncDec, - contextPtr->pmpMaskingLevelEncDec, - cuPtr->predictionModeFlag, - 0, - enableContouringQCUpdateFlag, - COMPONENT_LUMA, - temporalLayerIndex, - dZoffset, - cabacEncodeCtxPtr, - contextPtr->fullLambda, - intraLumaMode, - EB_INTRA_CHROMA_DM, - CabacCost); - - tuPtr->lumaCbf = countNonZeroCoeffs[0] ? EB_TRUE : EB_FALSE; + UnifiedQuantizeInvQuantize( + contextPtr, + lcuPtr->pictureControlSetPtr, + ((EB_S16*)transform16bit->bufferY) + scratchLumaOffset, + 64, + ((EB_S16*)coeffSamplesTB->bufferY) + scratchLumaOffset, + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + qp, + EB_10BIT, + tuSize, + sliceType, + &(countNonZeroCoeffs[0]), + contextPtr->transCoeffShapeLuma, + contextPtr->cleanSparseCeoffPfEncDec, + contextPtr->pmpMaskingLevelEncDec, + cuPtr->predictionModeFlag, + 0, + enableContouringQCUpdateFlag, + COMPONENT_LUMA, + temporalLayerIndex, + dZoffset, + cabacEncodeCtxPtr, + contextPtr->fullLambda, + intraLumaMode, + EB_INTRA_CHROMA_DM, + CabacCost); + + tuPtr->lumaCbf = countNonZeroCoeffs[0] ? EB_TRUE : EB_FALSE; if (tuSize > MIN_PU_SIZE) { - tuPtr->isOnlyDc[0] = (countNonZeroCoeffs[0] == 1 && (((EB_S16*)residual16bit->bufferY) + scratchLumaOffset)[0] != 0 && tuSize != 32) ? - EB_TRUE : - EB_FALSE; + tuPtr->isOnlyDc[0] = (countNonZeroCoeffs[0] == 1 && (((EB_S16*)residual16bit->bufferY) + scratchLumaOffset)[0] != 0 && tuSize != 32) ? + EB_TRUE : + EB_FALSE; if (contextPtr->transCoeffShapeLuma && tuPtr->lumaCbf && tuPtr->isOnlyDc[0] == EB_FALSE) { if (contextPtr->transCoeffShapeLuma == N2_SHAPE || contextPtr->transCoeffShapeLuma == N4_SHAPE) { @@ -1380,94 +1380,94 @@ static void EncodeLoop16bit( } } } else { - if (contextPtr->transCoeffShapeLuma && tuPtr->lumaCbf) { + if (contextPtr->transCoeffShapeLuma && tuPtr->lumaCbf) { - PfZeroOutUselessQuadrants( - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - 64, - (tuSize >> 1)); + PfZeroOutUselessQuadrants( + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + 64, + (tuSize >> 1)); - if (contextPtr->transCoeffShapeLuma == N4_SHAPE) { + if (contextPtr->transCoeffShapeLuma == N4_SHAPE) { - PfZeroOutUselessQuadrants( - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - 64, - (tuSize >> 2)); - } - } - } - } + PfZeroOutUselessQuadrants( + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + 64, + (tuSize >> 2)); + } + } + } + } if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - //********************************** - // Cb - //********************************** - PictureResidual16bit( - ((EB_U16*)inputSamples16bit->bufferCb) + inputCbOffset, - inputSamples16bit->strideCb, - ((EB_U16*)predSamples16bit->bufferCb) + predCbOffset, - predSamples16bit->strideCb, - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, - residual16bit->strideCb, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); - - // For the case that DC path chosen for chroma, we check the DC values and determine to use DC or N2Shape for chroma. Since there is only one flag for ChromaShaping, we do the prediction of Cr and Cb and decide on the chroma shaping - if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { - EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, - tuSize >> subWidthCMinus1, - residual16bit->strideCb); - sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); // Normalized based on the size. For chroma, tusize/2 +Tusize/2 - if (sumResidual > (1 << BIT_INCREMENT_10BIT)) { - contextPtr->transCoeffShapeChroma = N2_SHAPE; - } - } - - EncodeTransform( - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, - residual16bit->strideCb, - ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, - transform16bit->strideCb, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - transformScratchBuffer, - BIT_INCREMENT_10BIT, - EB_FALSE, - contextPtr->transCoeffShapeChroma); - - UnifiedQuantizeInvQuantize( - contextPtr, - lcuPtr->pictureControlSetPtr, - ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, - transform16bit->strideCb, - ((EB_S16*)coeffSamplesTB->bufferCb) + scratchCbOffset, - ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, - chromaQp, - EB_10BIT, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - sliceType, - &(countNonZeroCoeffs[1]), - contextPtr->transCoeffShapeChroma, - contextPtr->cleanSparseCeoffPfEncDec, - contextPtr->pmpMaskingLevelEncDec, - cuPtr->predictionModeFlag, - 0, //useDeltaQp == EB_TRUE ? contextPtr->forceCbfFlag : 0 - enableContouringQCUpdateFlag, - COMPONENT_CHROMA, - temporalLayerIndex, - 0, - cabacEncodeCtxPtr, - contextPtr->fullLambda, - intraLumaMode, - EB_INTRA_CHROMA_DM, - CabacCost); - - - if ((componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) && secondChroma) { - tuPtr->cbCbf2 = countNonZeroCoeffs[1] ? EB_TRUE : EB_FALSE; - tuPtr->isOnlyDc2[0] = (countNonZeroCoeffs[1] == 1 && (((EB_S16*)residual16bit->bufferCb) + scratchCbOffset)[0] != 0) ? - EB_TRUE : - EB_FALSE; + //********************************** + // Cb + //********************************** + PictureResidual16bit( + ((EB_U16*)inputSamples16bit->bufferCb) + inputCbOffset, + inputSamples16bit->strideCb, + ((EB_U16*)predSamples16bit->bufferCb) + predCbOffset, + predSamples16bit->strideCb, + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + residual16bit->strideCb, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); + + // For the case that DC path chosen for chroma, we check the DC values and determine to use DC or N2Shape for chroma. Since there is only one flag for ChromaShaping, we do the prediction of Cr and Cb and decide on the chroma shaping + if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { + EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + tuSize >> subWidthCMinus1, + residual16bit->strideCb); + sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); // Normalized based on the size. For chroma, tusize/2 +Tusize/2 + if (sumResidual > (1 << BIT_INCREMENT_10BIT)) { + contextPtr->transCoeffShapeChroma = N2_SHAPE; + } + } + + EncodeTransform( + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + residual16bit->strideCb, + ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, + transform16bit->strideCb, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + transformScratchBuffer, + BIT_INCREMENT_10BIT, + EB_FALSE, + contextPtr->transCoeffShapeChroma); + + UnifiedQuantizeInvQuantize( + contextPtr, + lcuPtr->pictureControlSetPtr, + ((EB_S16*)transform16bit->bufferCb) + scratchCbOffset, + transform16bit->strideCb, + ((EB_S16*)coeffSamplesTB->bufferCb) + scratchCbOffset, + ((EB_S16*)residual16bit->bufferCb) + scratchCbOffset, + chromaQp, + EB_10BIT, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + sliceType, + &(countNonZeroCoeffs[1]), + contextPtr->transCoeffShapeChroma, + contextPtr->cleanSparseCeoffPfEncDec, + contextPtr->pmpMaskingLevelEncDec, + cuPtr->predictionModeFlag, + 0, //useDeltaQp == EB_TRUE ? contextPtr->forceCbfFlag : 0 + enableContouringQCUpdateFlag, + COMPONENT_CHROMA, + temporalLayerIndex, + 0, + cabacEncodeCtxPtr, + contextPtr->fullLambda, + intraLumaMode, + EB_INTRA_CHROMA_DM, + CabacCost); + + + if ((componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) && secondChroma) { + tuPtr->cbCbf2 = countNonZeroCoeffs[1] ? EB_TRUE : EB_FALSE; + tuPtr->isOnlyDc2[0] = (countNonZeroCoeffs[1] == 1 && (((EB_S16*)residual16bit->bufferCb) + scratchCbOffset)[0] != 0) ? + EB_TRUE : + EB_FALSE; } else { tuPtr->cbCbf = countNonZeroCoeffs[1] ? EB_TRUE : EB_FALSE; @@ -1509,78 +1509,78 @@ static void EncodeLoop16bit( } - //********************************** - // Cr - //********************************** + //********************************** + // Cr + //********************************** PictureResidual16bit( - ((EB_U16*)inputSamples16bit->bufferCr) + inputCrOffset, - inputSamples16bit->strideCr, - ((EB_U16*)predSamples16bit->bufferCr) + predCrOffset, - predSamples16bit->strideCr, - ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, - residual16bit->strideCr, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); - - if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { - EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, - tuSize >> subWidthCMinus1, - residual16bit->strideCr); - - sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); // Normalized based on the size. For chroma, tusize/2 +Tusize/2 - if (sumResidual > (1 << BIT_INCREMENT_10BIT)) { - contextPtr->transCoeffShapeChroma = N2_SHAPE; - } - } - - EncodeTransform( - ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, - residual16bit->strideCr, - ((EB_S16*)transform16bit->bufferCr) + scratchCrOffset, - transform16bit->strideCr, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - transformScratchBuffer, - BIT_INCREMENT_10BIT, - EB_FALSE, - contextPtr->transCoeffShapeChroma); - - - { - UnifiedQuantizeInvQuantize( - contextPtr, - lcuPtr->pictureControlSetPtr, - ((EB_S16*)transform16bit->bufferCr) + scratchCrOffset, - transform16bit->strideCr, - ((EB_S16*)coeffSamplesTB->bufferCr) + scratchCrOffset, - ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, - chromaQp, - EB_10BIT, - tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, - sliceType, - &(countNonZeroCoeffs[2]), - contextPtr->transCoeffShapeChroma, - contextPtr->cleanSparseCeoffPfEncDec, - contextPtr->pmpMaskingLevelEncDec, - cuPtr->predictionModeFlag, - useDeltaQp == EB_TRUE ? contextPtr->forceCbfFlag : 0, //Jing: double check here, not align with Cb - enableContouringQCUpdateFlag, - COMPONENT_CHROMA, - temporalLayerIndex, - 0, - cabacEncodeCtxPtr, - contextPtr->fullLambda, - intraLumaMode, - EB_INTRA_CHROMA_DM, - CabacCost); - } - - if ((componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) && secondChroma) { - - tuPtr->crCbf2 = countNonZeroCoeffs[2] ? EB_TRUE : EB_FALSE; - tuPtr->isOnlyDc2[1] = (countNonZeroCoeffs[2] == 1 && (((EB_S16*)residual16bit->bufferCr) + scratchCbOffset)[0] != 0) ? - EB_TRUE : - EB_FALSE; + ((EB_U16*)inputSamples16bit->bufferCr) + inputCrOffset, + inputSamples16bit->strideCr, + ((EB_U16*)predSamples16bit->bufferCr) + predCrOffset, + predSamples16bit->strideCr, + ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, + residual16bit->strideCr, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize); + + if (tuSize > MIN_PU_SIZE && contextPtr->transCoeffShapeChroma == ONLY_DC_SHAPE) { + EB_S64 sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, + tuSize >> subWidthCMinus1, + residual16bit->strideCr); + + sumResidual = (ABS(sumResidual) / (tuSize >> subWidthCMinus1) / (tuSize >> subWidthCMinus1)); // Normalized based on the size. For chroma, tusize/2 +Tusize/2 + if (sumResidual > (1 << BIT_INCREMENT_10BIT)) { + contextPtr->transCoeffShapeChroma = N2_SHAPE; + } + } + + EncodeTransform( + ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, + residual16bit->strideCr, + ((EB_S16*)transform16bit->bufferCr) + scratchCrOffset, + transform16bit->strideCr, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + transformScratchBuffer, + BIT_INCREMENT_10BIT, + EB_FALSE, + contextPtr->transCoeffShapeChroma); + + + { + UnifiedQuantizeInvQuantize( + contextPtr, + lcuPtr->pictureControlSetPtr, + ((EB_S16*)transform16bit->bufferCr) + scratchCrOffset, + transform16bit->strideCr, + ((EB_S16*)coeffSamplesTB->bufferCr) + scratchCrOffset, + ((EB_S16*)residual16bit->bufferCr) + scratchCrOffset, + chromaQp, + EB_10BIT, + tuSize > MIN_PU_SIZE? (tuSize >> subWidthCMinus1): tuSize, + sliceType, + &(countNonZeroCoeffs[2]), + contextPtr->transCoeffShapeChroma, + contextPtr->cleanSparseCeoffPfEncDec, + contextPtr->pmpMaskingLevelEncDec, + cuPtr->predictionModeFlag, + useDeltaQp == EB_TRUE ? contextPtr->forceCbfFlag : 0, //Jing: double check here, not align with Cb + enableContouringQCUpdateFlag, + COMPONENT_CHROMA, + temporalLayerIndex, + 0, + cabacEncodeCtxPtr, + contextPtr->fullLambda, + intraLumaMode, + EB_INTRA_CHROMA_DM, + CabacCost); + } + + if ((componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) && secondChroma) { + + tuPtr->crCbf2 = countNonZeroCoeffs[2] ? EB_TRUE : EB_FALSE; + tuPtr->isOnlyDc2[1] = (countNonZeroCoeffs[2] == 1 && (((EB_S16*)residual16bit->bufferCr) + scratchCbOffset)[0] != 0) ? + EB_TRUE : + EB_FALSE; } else { tuPtr->crCbf = countNonZeroCoeffs[2] ? EB_TRUE : EB_FALSE; @@ -1620,21 +1620,21 @@ static void EncodeLoop16bit( } } } - } + } if ((componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) && secondChroma) { tuPtr->nzCoefCount2[0] = (EB_U16)countNonZeroCoeffs[1]; tuPtr->nzCoefCount2[1] = (EB_U16)countNonZeroCoeffs[2]; - tuPtr->transCoeffShapeChroma2 = contextPtr->transCoeffShapeChroma; + tuPtr->transCoeffShapeChroma2 = contextPtr->transCoeffShapeChroma; } else { - tuPtr->transCoeffShapeLuma = contextPtr->transCoeffShapeLuma; - tuPtr->transCoeffShapeChroma = contextPtr->transCoeffShapeChroma; + tuPtr->transCoeffShapeLuma = contextPtr->transCoeffShapeLuma; + tuPtr->transCoeffShapeChroma = contextPtr->transCoeffShapeChroma; tuPtr->nzCoefCount[0] = (EB_U16)countNonZeroCoeffs[0]; tuPtr->nzCoefCount[1] = (EB_U16)countNonZeroCoeffs[1]; tuPtr->nzCoefCount[2] = (EB_U16)countNonZeroCoeffs[2]; } - return; + return; } @@ -1669,14 +1669,14 @@ static void EncodeGenerateRecon16bit( EbPictureBufferDesc_t *residual16bit, // no basis/offset EB_S16 *transformScratchBuffer) { - EB_U32 predLumaOffset; - EB_U32 predChromaOffset; - EB_U32 scratchLumaOffset; - EB_U32 scratchChromaOffset; - EB_U32 reconLumaOffset; - EB_U32 reconChromaOffset; - - CodingUnit_t *cuPtr = contextPtr->cuPtr; + EB_U32 predLumaOffset; + EB_U32 predChromaOffset; + EB_U32 scratchLumaOffset; + EB_U32 scratchChromaOffset; + EB_U32 reconLumaOffset; + EB_U32 reconChromaOffset; + + CodingUnit_t *cuPtr = contextPtr->cuPtr; TransformUnit_t *tuPtr = &cuPtr->transformUnitArray[contextPtr->tuItr]; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; @@ -1688,28 +1688,28 @@ static void EncodeGenerateRecon16bit( } EB_BOOL cbCbf=secondChroma?tuPtr->cbCbf2:tuPtr->cbCbf; EB_BOOL crCbf=secondChroma?tuPtr->crCbf2:tuPtr->crCbf; - // *Note - The prediction is built in-place in the Recon buffer. It is overwritten with Reconstructed - // samples if the CBF==1 && SKIP==False + // *Note - The prediction is built in-place in the Recon buffer. It is overwritten with Reconstructed + // samples if the CBF==1 && SKIP==False - //********************************** - // Luma - //********************************** + //********************************** + // Luma + //********************************** if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { predLumaOffset = (predSamples->originY+originY) * predSamples->strideY + (predSamples->originX+originX); - scratchLumaOffset = ((originY & (63)) * 64) + (originX & (63)); + scratchLumaOffset = ((originY & (63)) * 64) + (originX & (63)); reconLumaOffset = (predSamples->originY + originY)* predSamples->strideY + (predSamples->originX + originX); - if (tuPtr->lumaCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { - EncodeInvTransform( - (tuSize==MIN_PU_SIZE)?EB_FALSE:(tuPtr->transCoeffShapeLuma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[0]), - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - 64, - ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, - 64, - tuSize, - transformScratchBuffer, - BIT_INCREMENT_10BIT, - (EB_BOOL)(tuSize == MIN_PU_SIZE)); + if (tuPtr->lumaCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { + EncodeInvTransform( + (tuSize==MIN_PU_SIZE)?EB_FALSE:(tuPtr->transCoeffShapeLuma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[0]), + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + 64, + ((EB_S16*)residual16bit->bufferY) + scratchLumaOffset, + 64, + tuSize, + transformScratchBuffer, + BIT_INCREMENT_10BIT, + (EB_BOOL)(tuSize == MIN_PU_SIZE)); AdditionKernel_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( (EB_U16*)predSamples->bufferY + predLumaOffset, @@ -1720,12 +1720,12 @@ static void EncodeGenerateRecon16bit( predSamples->strideY, tuSize, tuSize); - } - } + } + } - //********************************** - // Chroma - //********************************** + //********************************** + // Chroma + //********************************** if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { predChromaOffset = (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCb) + @@ -1735,35 +1735,35 @@ static void EncodeGenerateRecon16bit( reconChromaOffset = (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCb) + ((predSamples->originX + originX) >> subWidthCMinus1); - //********************************** - // Cb - //********************************** - if (cbCbf== EB_TRUE && cuPtr->skipFlag == EB_FALSE) { - EncodeInvTransform( - (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[0]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[1])), - ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, - residual16bit->strideCb, - ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, - residual16bit->strideCb, + //********************************** + // Cb + //********************************** + if (cbCbf== EB_TRUE && cuPtr->skipFlag == EB_FALSE) { + EncodeInvTransform( + (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[0]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[1])), + ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, + residual16bit->strideCb, + ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, + residual16bit->strideCb, tuSize >> shift_bit, - transformScratchBuffer, - BIT_INCREMENT_10BIT, - EB_FALSE); + transformScratchBuffer, + BIT_INCREMENT_10BIT, + EB_FALSE); AdditionKernel_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( (EB_U16*)predSamples->bufferCb + predChromaOffset, - predSamples->strideCb, - ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, - residual16bit->strideCb, + predSamples->strideCb, + ((EB_S16*)residual16bit->bufferCb) + scratchChromaOffset, + residual16bit->strideCb, (EB_U16*)predSamples->bufferCb + reconChromaOffset, predSamples->strideCb, tuSize >> shift_bit, tuSize >> shift_bit); - } + } - //********************************** - // Cr - //********************************** + //********************************** + // Cr + //********************************** predChromaOffset = (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCr) + ((predSamples->originX + originX) >> subWidthCMinus1); scratchChromaOffset = (((originY + tuChromaOffset) & 63) >> subHeightCMinus1) * (64 >> subWidthCMinus1) + @@ -1771,31 +1771,31 @@ static void EncodeGenerateRecon16bit( reconChromaOffset = (((predSamples->originY + originY + tuChromaOffset) >> subHeightCMinus1) * predSamples->strideCr) + ((predSamples->originX + originX) >> subWidthCMinus1); - if (crCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { - EncodeInvTransform( - (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[1]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[2])), - ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, - residual16bit->strideCr, - ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, - residual16bit->strideCr, - tuSize >> shift_bit, - transformScratchBuffer, - BIT_INCREMENT_10BIT, - EB_FALSE); + if (crCbf == EB_TRUE && cuPtr->skipFlag == EB_FALSE) { + EncodeInvTransform( + (tuSize==MIN_PU_SIZE)?EB_FALSE:(secondChroma ? (tuPtr->transCoeffShapeChroma2 == ONLY_DC_SHAPE || tuPtr->isOnlyDc2[1]) : (tuPtr->transCoeffShapeChroma == ONLY_DC_SHAPE || tuPtr->isOnlyDc[2])), + ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, + residual16bit->strideCr, + ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, + residual16bit->strideCr, + tuSize >> shift_bit, + transformScratchBuffer, + BIT_INCREMENT_10BIT, + EB_FALSE); AdditionKernel_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( (EB_U16*)predSamples->bufferCr + predChromaOffset, - predSamples->strideCr, - ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, - residual16bit->strideCr, + predSamples->strideCr, + ((EB_S16*)residual16bit->bufferCr) + scratchChromaOffset, + residual16bit->strideCr, (EB_U16*)predSamples->bufferCr + reconChromaOffset, predSamples->strideCr, - tuSize >> shift_bit, - tuSize >> shift_bit); - } - } + tuSize >> shift_bit, + tuSize >> shift_bit); + } + } - return; + return; } static EB_ENCODE_LOOP_FUNC_PTR EncodeLoopFunctionTable[2] = @@ -2083,7 +2083,7 @@ static void EncodePassUpdateQp( void SetPmEncDecMode( PictureControlSet_t *pictureControlSetPtr, - EncDecContext_t *contextPtr, + EncDecContext_t *contextPtr, EB_U32 lcuIndex, EB_U8 stationaryEdgeOverTimeFlag, EB_U8 pmStationaryEdgeOverTimeFlag){ @@ -2128,9 +2128,9 @@ void SetPmEncDecMode( } } - if (sequenceControlSetPtr->staticConfig.bitRateReduction == EB_TRUE && !contextPtr->forceCbfFlag && !((pictureControlSetPtr->sliceType == EB_I_PICTURE && contextPtr->cuStats->size == 8) || stationaryEdgeOverTimeFlag || pmSensitiveSkinArea || pmSensitiveCmplxContrastArea)) { + if (sequenceControlSetPtr->staticConfig.bitRateReduction == EB_TRUE && !contextPtr->forceCbfFlag && !((pictureControlSetPtr->sliceType == EB_I_PICTURE && contextPtr->cuStats->size == 8) || stationaryEdgeOverTimeFlag || pmSensitiveSkinArea || pmSensitiveCmplxContrastArea)) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { @@ -2251,13 +2251,13 @@ void SetPmEncDecMode( - if (contextPtr->cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == 32 && contextPtr->cuPtr->predictionUnitArray->intraLumaMode != EB_INTRA_DC && contextPtr->cuPtr->predictionUnitArray->intraLumaMode != EB_INTRA_PLANAR) { - contextPtr->pmpMaskingLevelEncDec = 0; - } + if (contextPtr->cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == 32 && contextPtr->cuPtr->predictionUnitArray->intraLumaMode != EB_INTRA_DC && contextPtr->cuPtr->predictionUnitArray->intraLumaMode != EB_INTRA_PLANAR) { + contextPtr->pmpMaskingLevelEncDec = 0; + } - if (pictureControlSetPtr->sliceType == EB_P_PICTURE) { - contextPtr->pmpMaskingLevelEncDec = 1; - } + if (pictureControlSetPtr->sliceType == EB_P_PICTURE) { + contextPtr->pmpMaskingLevelEncDec = 1; + } } @@ -2265,7 +2265,7 @@ void SetPmEncDecMode( } else{ - contextPtr->pmpMaskingLevelEncDec = 0; + contextPtr->pmpMaskingLevelEncDec = 0; } } @@ -2285,10 +2285,10 @@ void SetPmEncDecMode( void Pack2DBlock( EncDecContext_t *contextPtr, EbPictureBufferDesc_t *inputPicture, - EB_U32 originX, - EB_U32 originY, - EB_U32 width, - EB_U32 height) { + EB_U32 originX, + EB_U32 originY, + EB_U32 width, + EB_U32 height) { const EB_U32 inputLumaOffset = ((originY + inputPicture->originY) * inputPicture->strideY) + (originX + inputPicture->originX); const EB_U32 inputBitIncLumaOffset = ((originY + inputPicture->originY) * inputPicture->strideBitIncY) + (originX + inputPicture->originX); @@ -2369,192 +2369,192 @@ EB_ERRORTYPE QpmDeriveBeaAndSkipQpmFlagLcu( && (lcuPtr->pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex].edgeBlockNum > 0)) ? EB_TRUE : EB_FALSE; - contextPtr->backgorundEnhancement = EB_FALSE; + contextPtr->backgorundEnhancement = EB_FALSE; - contextPtr->backgorundEnhancement = EB_FALSE; + contextPtr->backgorundEnhancement = EB_FALSE; - contextPtr->skipQpmFlag = (sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction) ? EB_FALSE : EB_TRUE; + contextPtr->skipQpmFlag = (sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction) ? EB_FALSE : EB_TRUE; - if ((pictureControlSetPtr->ParentPcsPtr->logoPicFlag == EB_FALSE) && ((pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1) || (pictureControlSetPtr->ParentPcsPtr->highDarkLowLightAreaDensityFlag) || (pictureControlSetPtr->ParentPcsPtr->intraCodedBlockProbability > 90))){ - contextPtr->skipQpmFlag = EB_TRUE; - } + if ((pictureControlSetPtr->ParentPcsPtr->logoPicFlag == EB_FALSE) && ((pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1) || (pictureControlSetPtr->ParentPcsPtr->highDarkLowLightAreaDensityFlag) || (pictureControlSetPtr->ParentPcsPtr->intraCodedBlockProbability > 90))){ + contextPtr->skipQpmFlag = EB_TRUE; + } if (contextPtr->skipQpmFlag == EB_FALSE) { if (pictureControlSetPtr->ParentPcsPtr->picHomogenousOverTimeLcuPercentage > 30 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ - contextPtr->qpmQp = CLIP3(minQpAllowed, maxQpAllowed, pictureQp + 1); + contextPtr->qpmQp = CLIP3(minQpAllowed, maxQpAllowed, pictureQp + 1); } } - return return_error; + return return_error; } EB_ERRORTYPE EncQpmDeriveDeltaQPForEachLeafLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 lcuIndex, - CodingUnit_t *cuPtr, - EB_U32 cuDepth, - EB_U32 cuIndex, - EB_U32 cuSize, - EB_U8 type, - EB_U8 parent32x32Index, - EncDecContext_t *contextPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 lcuIndex, + CodingUnit_t *cuPtr, + EB_U32 cuDepth, + EB_U32 cuIndex, + EB_U32 cuSize, + EB_U8 type, + EB_U8 parent32x32Index, + EncDecContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - //LcuParams_t lcuParams; - EB_S64 complexityDistance; - EB_S8 deltaQp = 0; - EB_U8 qpmQp = contextPtr->qpmQp; - EB_U8 minQpAllowed = (EB_U8)sequenceControlSetPtr->staticConfig.minQpAllowed; - EB_U8 maxQpAllowed = (EB_U8)sequenceControlSetPtr->staticConfig.maxQpAllowed; - EB_S16 cuQP; + //LcuParams_t lcuParams; + EB_S64 complexityDistance; + EB_S8 deltaQp = 0; + EB_U8 qpmQp = contextPtr->qpmQp; + EB_U8 minQpAllowed = (EB_U8)sequenceControlSetPtr->staticConfig.minQpAllowed; + EB_U8 maxQpAllowed = (EB_U8)sequenceControlSetPtr->staticConfig.maxQpAllowed; + EB_S16 cuQP; EB_BOOL skipOis8x8 = (pictureControlSetPtr->ParentPcsPtr->skipOis8x8 && cuSize == 8); - EB_U32 usedDepth = cuDepth; - if (skipOis8x8) - usedDepth = 2; - - EB_U32 cuIndexInRaterScan = MD_SCAN_TO_RASTER_SCAN[cuIndex]; + EB_U32 usedDepth = cuDepth; + if (skipOis8x8) + usedDepth = 2; - EB_BOOL acEnergyBasedAntiContouring = pictureControlSetPtr->sliceType == EB_I_PICTURE ? EB_TRUE : EB_FALSE; - EB_U8 lowerQPClass; + EB_U32 cuIndexInRaterScan = MD_SCAN_TO_RASTER_SCAN[cuIndex]; - EB_S8 nonMovingDeltaQp = contextPtr->nonMovingDeltaQp; + EB_BOOL acEnergyBasedAntiContouring = pictureControlSetPtr->sliceType == EB_I_PICTURE ? EB_TRUE : EB_FALSE; + EB_U8 lowerQPClass; - EB_S8 bea64x64DeltaQp; + EB_S8 nonMovingDeltaQp = contextPtr->nonMovingDeltaQp; - cuQP = qpmQp; - cuPtr->qp = qpmQp; + EB_S8 bea64x64DeltaQp; - EB_U32 distortion = 0; + cuQP = qpmQp; + cuPtr->qp = qpmQp; - if (!contextPtr->skipQpmFlag){ + EB_U32 distortion = 0; - // INTRA MODE - if (type == INTRA_MODE){ + if (!contextPtr->skipQpmFlag){ - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuIndex]; + // INTRA MODE + if (type == INTRA_MODE){ - if (cuSize > 32){ - distortion = - oisCu32Cu16ResultsPtr->sortedOisCandidate[1][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[2][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[3][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[4][0].distortion; - } - else if (cuSize == 32) { - const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; - } - else{ - if (cuSize > 8){ - const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; - } - else{ - if (skipOis8x8){ + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuIndex]; - const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); - const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; + if (cuSize > 32){ + distortion = + oisCu32Cu16ResultsPtr->sortedOisCandidate[1][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[2][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[3][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[4][0].distortion; + } + else if (cuSize == 32) { + const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; + distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; + } + else{ + if (cuSize > 8){ + const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; + distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; + } + else{ + if (skipOis8x8){ - distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; - } - else { + const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); + const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; - const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth; + distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; + } + else { - if (oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ - distortion = oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; - } - else{ + const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth; - const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); - const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; + if (oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ + distortion = oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; + } + else{ - if (oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ - distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; - } - else { - distortion = 0; - } - } + const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); + const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; - } - } - } + if (oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ + distortion = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; + } + else { + distortion = 0; + } + } + } + } + } - distortion = (EB_U32)CLIP3(pictureControlSetPtr->ParentPcsPtr->intraComplexityMin[usedDepth], pictureControlSetPtr->ParentPcsPtr->intraComplexityMax[usedDepth], distortion); - complexityDistance = ((EB_S32)distortion - (EB_S32)pictureControlSetPtr->ParentPcsPtr->intraComplexityAvg[usedDepth]); - if (complexityDistance < 0){ + distortion = (EB_U32)CLIP3(pictureControlSetPtr->ParentPcsPtr->intraComplexityMin[usedDepth], pictureControlSetPtr->ParentPcsPtr->intraComplexityMax[usedDepth], distortion); + complexityDistance = ((EB_S32)distortion - (EB_S32)pictureControlSetPtr->ParentPcsPtr->intraComplexityAvg[usedDepth]); - deltaQp = (pictureControlSetPtr->ParentPcsPtr->intraMinDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->minDeltaQpWeight * contextPtr->minDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->intraMinDistance[usedDepth])) : 0; - } - else{ + if (complexityDistance < 0){ - deltaQp = (pictureControlSetPtr->ParentPcsPtr->intraMaxDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->maxDeltaQpWeight * contextPtr->maxDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->intraMaxDistance[usedDepth])) : 0; - } - // QPM action - if (lcuPtr->pictureControlSetPtr->sceneCaracteristicId == EB_FRAME_CARAC_2) { - if (lcuPtr->pictureControlSetPtr->ParentPcsPtr->lcuCmplxContrastArray[lcuIndex] && deltaQp > 0) { - deltaQp = 0; - } - } - } - // INTER MODE - else{ - distortion = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexInRaterScan].distortionDirection[0].distortion; - if (skipOis8x8){ - EB_U32 cuIndexRScan = MD_SCAN_TO_RASTER_SCAN[ParentBlockIndex[cuIndex]]; + deltaQp = (pictureControlSetPtr->ParentPcsPtr->intraMinDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->minDeltaQpWeight * contextPtr->minDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->intraMinDistance[usedDepth])) : 0; + } + else{ - distortion = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexRScan].distortionDirection[0].distortion; + deltaQp = (pictureControlSetPtr->ParentPcsPtr->intraMaxDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->maxDeltaQpWeight * contextPtr->maxDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->intraMaxDistance[usedDepth])) : 0; + } + // QPM action + if (lcuPtr->pictureControlSetPtr->sceneCaracteristicId == EB_FRAME_CARAC_2) { + if (lcuPtr->pictureControlSetPtr->ParentPcsPtr->lcuCmplxContrastArray[lcuIndex] && deltaQp > 0) { + deltaQp = 0; + } + } + } + // INTER MODE + else{ + distortion = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexInRaterScan].distortionDirection[0].distortion; + if (skipOis8x8){ + EB_U32 cuIndexRScan = MD_SCAN_TO_RASTER_SCAN[ParentBlockIndex[cuIndex]]; - } - distortion = (EB_U32)CLIP3(pictureControlSetPtr->ParentPcsPtr->interComplexityMin[usedDepth], pictureControlSetPtr->ParentPcsPtr->interComplexityMax[usedDepth], distortion); - complexityDistance = ((EB_S32)distortion - (EB_S32)pictureControlSetPtr->ParentPcsPtr->interComplexityAvg[usedDepth]); + distortion = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexRScan].distortionDirection[0].distortion; - if (complexityDistance < 0){ + } + distortion = (EB_U32)CLIP3(pictureControlSetPtr->ParentPcsPtr->interComplexityMin[usedDepth], pictureControlSetPtr->ParentPcsPtr->interComplexityMax[usedDepth], distortion); + complexityDistance = ((EB_S32)distortion - (EB_S32)pictureControlSetPtr->ParentPcsPtr->interComplexityAvg[usedDepth]); - deltaQp = (pictureControlSetPtr->ParentPcsPtr->interMinDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->minDeltaQpWeight * contextPtr->minDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->interMinDistance[usedDepth])) : 0; - } - else{ + if (complexityDistance < 0){ - deltaQp = (pictureControlSetPtr->ParentPcsPtr->interMaxDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->maxDeltaQpWeight * contextPtr->maxDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->interMaxDistance[usedDepth])) : 0; - } - } - - if (contextPtr->backgorundEnhancement){ - // Use the 8x8 background enhancement only for the Intra slice, otherwise, use the existing LCU based BEA results - bea64x64DeltaQp = nonMovingDeltaQp; - - if (((cuIndex > 0) && ((pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][parent32x32Index]) > ANTI_CONTOURING_LUMA_T2 || (pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][parent32x32Index]) < ANTI_CONTOURING_LUMA_T1)) || - ((cuIndex == 0) && ((pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][0]) > ANTI_CONTOURING_LUMA_T2 || (pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][0]) < ANTI_CONTOURING_LUMA_T1))) { - - if (bea64x64DeltaQp < 0){ - bea64x64DeltaQp = 0; - } - - } + deltaQp = (pictureControlSetPtr->ParentPcsPtr->interMinDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->minDeltaQpWeight * contextPtr->minDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->interMinDistance[usedDepth])) : 0; + } + else{ + + deltaQp = (pictureControlSetPtr->ParentPcsPtr->interMaxDistance[usedDepth] != 0) ? (EB_S8)((contextPtr->maxDeltaQpWeight * contextPtr->maxDeltaQp[usedDepth] * complexityDistance) / (100 * pictureControlSetPtr->ParentPcsPtr->interMaxDistance[usedDepth])) : 0; + } + } + + if (contextPtr->backgorundEnhancement){ + // Use the 8x8 background enhancement only for the Intra slice, otherwise, use the existing LCU based BEA results + bea64x64DeltaQp = nonMovingDeltaQp; + + if (((cuIndex > 0) && ((pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][parent32x32Index]) > ANTI_CONTOURING_LUMA_T2 || (pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][parent32x32Index]) < ANTI_CONTOURING_LUMA_T1)) || + ((cuIndex == 0) && ((pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][0]) > ANTI_CONTOURING_LUMA_T2 || (pictureControlSetPtr->ParentPcsPtr->yMean[lcuIndex][0]) < ANTI_CONTOURING_LUMA_T1))) { + + if (bea64x64DeltaQp < 0){ + bea64x64DeltaQp = 0; + } + + } deltaQp += bea64x64DeltaQp; - } + } if ((pictureControlSetPtr->ParentPcsPtr->logoPicFlag)){ - deltaQp = (deltaQp < contextPtr->minDeltaQp[0]) ? deltaQp : contextPtr->minDeltaQp[0]; - } + deltaQp = (deltaQp < contextPtr->minDeltaQp[0]) ? deltaQp : contextPtr->minDeltaQp[0]; + } LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuIndex]); if (lcuStatPtr->stationaryEdgeOverTimeFlag && deltaQp > 0){ deltaQp = 0; } - // QPM action + // QPM action if (lcuPtr->pictureControlSetPtr->sceneCaracteristicId == EB_FRAME_CARAC_2) { if (lcuPtr->pictureControlSetPtr->ParentPcsPtr->lcuCmplxContrastArray[lcuIndex] && deltaQp > 0) { deltaQp = 0; @@ -2568,63 +2568,63 @@ EB_ERRORTYPE EncQpmDeriveDeltaQPForEachLeafLcu( lcuPtr->index, (EB_U8) cuIndex); - if (lowerQPClass){ + if (lowerQPClass){ if (lowerQPClass == 3) deltaQp = ANTI_CONTOURING_DELTA_QP_0; else if (lowerQPClass == 2) deltaQp = ANTI_CONTOURING_DELTA_QP_1; else if (lowerQPClass == 1) deltaQp = ANTI_CONTOURING_DELTA_QP_2; - } + } } deltaQp -= contextPtr->grassEnhancementFlag ? 3 : 0; - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) - deltaQp = ((deltaQp < 0 && sequenceControlSetPtr->staticConfig.bitRateReduction && !sequenceControlSetPtr->staticConfig.improveSharpness) || - (deltaQp > 0 && sequenceControlSetPtr->staticConfig.improveSharpness && !sequenceControlSetPtr->staticConfig.bitRateReduction)) ? 0 : deltaQp; - else - deltaQp = (deltaQp > 0 && sequenceControlSetPtr->staticConfig.improveSharpness) ? 0 : deltaQp; - if (sequenceControlSetPtr->staticConfig.rateControlMode == 1 || sequenceControlSetPtr->staticConfig.rateControlMode == 2){ - - if (qpmQp > RC_QPMOD_MAXQP){ - deltaQp = MIN(0, deltaQp); - } - - cuQP = (qpmQp + deltaQp); - - - if ((qpmQp <= RC_QPMOD_MAXQP)){ - cuQP = (EB_U8)CLIP3( - minQpAllowed, - RC_QPMOD_MAXQP, - cuQP); - } - } - else{ + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) + deltaQp = ((deltaQp < 0 && sequenceControlSetPtr->staticConfig.bitRateReduction && !sequenceControlSetPtr->staticConfig.improveSharpness) || + (deltaQp > 0 && sequenceControlSetPtr->staticConfig.improveSharpness && !sequenceControlSetPtr->staticConfig.bitRateReduction)) ? 0 : deltaQp; + else + deltaQp = (deltaQp > 0 && sequenceControlSetPtr->staticConfig.improveSharpness) ? 0 : deltaQp; + if (sequenceControlSetPtr->staticConfig.rateControlMode == 1 || sequenceControlSetPtr->staticConfig.rateControlMode == 2){ + + if (qpmQp > RC_QPMOD_MAXQP){ + deltaQp = MIN(0, deltaQp); + } + + cuQP = (qpmQp + deltaQp); + + + if ((qpmQp <= RC_QPMOD_MAXQP)){ + cuQP = (EB_U8)CLIP3( + minQpAllowed, + RC_QPMOD_MAXQP, + cuQP); + } + } + else{ cuQP = (qpmQp + deltaQp); - } + } - cuQP = (EB_U8)CLIP3( - minQpAllowed, - maxQpAllowed, - cuQP); + cuQP = (EB_U8)CLIP3( + minQpAllowed, + maxQpAllowed, + cuQP); - } + } cuPtr->qp = cuQP ; - lcuPtr->qp = (cuSize == 64) ? (EB_U8)cuPtr->qp : lcuPtr->qp; + lcuPtr->qp = (cuSize == 64) ? (EB_U8)cuPtr->qp : lcuPtr->qp; - cuPtr->deltaQp = (EB_S16)cuPtr->qp - (EB_S16)qpmQp; + cuPtr->deltaQp = (EB_S16)cuPtr->qp - (EB_S16)qpmQp; - cuPtr->orgDeltaQp = cuPtr->deltaQp; + cuPtr->orgDeltaQp = cuPtr->deltaQp; - return return_error; + return return_error; } @@ -2633,28 +2633,28 @@ this function checks whether any intra CU is present in the current LCU *************************************/ EB_BOOL isIntraPresent( - LargestCodingUnit_t *lcuPtr) + LargestCodingUnit_t *lcuPtr) { - EB_U8 leafIndex = 0; - while (leafIndex < CU_MAX_COUNT) { + EB_U8 leafIndex = 0; + while (leafIndex < CU_MAX_COUNT) { - CodingUnit_t * const cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; + CodingUnit_t * const cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; - if (cuPtr->splitFlag == EB_FALSE) { + if (cuPtr->splitFlag == EB_FALSE) { - const CodedUnitStats_t *cuStatsPtr = GetCodedUnitStats(leafIndex); - if (cuPtr->predictionModeFlag == INTRA_MODE) - return EB_TRUE; + const CodedUnitStats_t *cuStatsPtr = GetCodedUnitStats(leafIndex); + if (cuPtr->predictionModeFlag == INTRA_MODE) + return EB_TRUE; - leafIndex += DepthOffset[cuStatsPtr->depth]; - } - else { - leafIndex++; - } - } + leafIndex += DepthOffset[cuStatsPtr->depth]; + } + else { + leafIndex++; + } + } - return EB_FALSE; + return EB_FALSE; } @@ -2684,8 +2684,8 @@ void EncodePassPreFetchRef( EbReferenceObject_t *referenceObject; EB_U16 refList0PosX = 0; EB_U16 refList0PosY = 0; - EB_U8 counter; - EB_U16 *src0Ptr; + EB_U8 counter; + EB_U16 *src0Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; @@ -2732,8 +2732,8 @@ void EncodePassPreFetchRef( EbReferenceObject_t *referenceObject; EB_U16 refList1PosX = 0; EB_U16 refList1PosY = 0; - EB_U8 counter; - EB_U16 *src1Ptr; + EB_U8 counter; + EB_U16 *src1Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; @@ -2787,10 +2787,10 @@ void EncodePassPreFetchRef( EbReferenceObject_t *referenceObject; EB_U16 refList0PosX = 0; EB_U16 refList0PosY = 0; - EB_U32 integPosL0x; - EB_U32 integPosL0y; - EB_U8 counter; - EB_U8 *src0Ptr; + EB_U32 integPosL0x; + EB_U32 integPosL0y; + EB_U8 counter; + EB_U8 *src0Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture; @@ -2827,10 +2827,10 @@ void EncodePassPreFetchRef( EbReferenceObject_t *referenceObject; EB_U16 refList1PosX = 0; EB_U16 refList1PosY = 0; - EB_U32 integPosL1x; - EB_U32 integPosL1y; - EB_U8 counter; - EB_U8 *src1Ptr; + EB_U32 integPosL1x; + EB_U32 integPosL1y; + EB_U8 counter; + EB_U8 *src1Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture; @@ -3210,11 +3210,11 @@ EB_EXTERN void EncodePass( cuPtr->deltaQp = 0; - cuPtr->qp = (sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction || sequenceControlSetPtr->staticConfig.segmentOvEnabled) ? contextPtr->qpmQp : pictureControlSetPtr->pictureQp; - lcuPtr->qp = (sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction || sequenceControlSetPtr->staticConfig.segmentOvEnabled) ? contextPtr->qpmQp : pictureControlSetPtr->pictureQp; + cuPtr->qp = (sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction || sequenceControlSetPtr->staticConfig.segmentOvEnabled) ? contextPtr->qpmQp : pictureControlSetPtr->pictureQp; + lcuPtr->qp = (sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction || sequenceControlSetPtr->staticConfig.segmentOvEnabled) ? contextPtr->qpmQp : pictureControlSetPtr->pictureQp; cuPtr->orgDeltaQp = cuPtr->deltaQp; - if (!contextPtr->skipQpmFlag && + if (!contextPtr->skipQpmFlag && (sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction) && (contextPtr->cuStats->depth <= pictureControlSetPtr->difCuDeltaQpDepth)) { EncQpmDeriveDeltaQPForEachLeafLcu( @@ -3235,7 +3235,7 @@ EB_EXTERN void EncodePass( EB_U64 yCoeffBitsTemp = contextPtr->mdContext->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits; EB_S16 yDc = 0; EB_U16 yCountNonZeroCoeffs = 0; - EB_U32 yBitsThsld = (contextPtr->cuStats->size > 32) ? contextPtr->yBitsThsld : (contextPtr->cuStats->size > 16) ? (contextPtr->yBitsThsld >> 1) : (contextPtr->yBitsThsld >> 2); + EB_U32 yBitsThsld = (contextPtr->cuStats->size > 32) ? contextPtr->yBitsThsld : (contextPtr->cuStats->size > 16) ? (contextPtr->yBitsThsld >> 1) : (contextPtr->yBitsThsld >> 2); EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(cuPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); EB_U8 cbQp = 0; @@ -3321,7 +3321,7 @@ EB_EXTERN void EncodePass( is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, tileLeftBoundary, tileTopBoundary, tileRightBoundary); - GenerateChromaIntraReferenceSamplesFuncTable[is16bit]( + GenerateChromaIntraReferenceSamplesFuncTable[is16bit]( constrainedIntraFlag, enableStrongIntraSmoothing, contextPtr->cuOriginX, @@ -3376,14 +3376,14 @@ EB_EXTERN void EncodePass( lcuStatPtr->stationaryEdgeOverTimeFlag, pictureControlSetPtr->temporalLayerIndex > 0 ? lcuStatPtr->pmStationaryEdgeOverTimeFlag : lcuStatPtr->stationaryEdgeOverTimeFlag); - // Set Fast El coef shaping method + // Set Fast El coef shaping method contextPtr->transCoeffShapeLuma = DEFAULT_SHAPE; contextPtr->transCoeffShapeChroma = DEFAULT_SHAPE; - if (fastEl && contextPtr->pmpMaskingLevelEncDec > MASK_THSHLD_1) { + if (fastEl && contextPtr->pmpMaskingLevelEncDec > MASK_THSHLD_1) { yDc = contextPtr->mdContext->mdEpPipeLcu[cuPtr->leafIndex].yDc[0]; yCountNonZeroCoeffs = contextPtr->mdContext->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[0]; - if ((cuPtr->rootCbf == 0) || + if ((cuPtr->rootCbf == 0) || ((yCoeffBitsTemp <= yBitsThsld) && yDc < YDC_THSHLD_1 && yCountNonZeroCoeffs <= 1)) { // Skip pass for cuPtr->rootCbf == 0 caused some VQ issues in chroma, so DC path is used instead contextPtr->transCoeffShapeLuma = ONLY_DC_SHAPE; @@ -3414,13 +3414,13 @@ EB_EXTERN void EncodePass( transformInnerArrayPtr, countNonZeroCoeffs, useDeltaQpSegments, - (CabacEncodeContext_t*)coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - (EB_U32)puPtr->intraLumaMode, + (CabacEncodeContext_t*)coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + (EB_U32)puPtr->intraLumaMode, PICTURE_BUFFER_DESC_FULL_MASK, colorFormat, EB_FALSE, (contextPtr->cuStats->size == 64) ? 32 : contextPtr->cuStats->size, - pictureControlSetPtr->cabacCost, + pictureControlSetPtr->cabacCost, cuPtr->deltaQp > 0 ? 0 : dZoffset); EncodeGenerateReconFunctionPtr[is16bit]( @@ -3450,88 +3450,88 @@ EB_EXTERN void EncodePass( is16bit); } // Transform Loop - if (colorFormat == EB_YUV422) { - GenerateChromaIntraReferenceSamplesFuncTable[is16bit]( - constrainedIntraFlag, - enableStrongIntraSmoothing, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - cuStats->size, - MAX_LCU_SIZE, - cuStats->depth, - epModeTypeNeighborArray, - epLumaReconNeighborArray, - epCbReconNeighborArray, - epCrReconNeighborArray, - is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, - colorFormat, + if (colorFormat == EB_YUV422) { + GenerateChromaIntraReferenceSamplesFuncTable[is16bit]( + constrainedIntraFlag, + enableStrongIntraSmoothing, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + cuStats->size, + MAX_LCU_SIZE, + cuStats->depth, + epModeTypeNeighborArray, + epLumaReconNeighborArray, + epCbReconNeighborArray, + epCrReconNeighborArray, + is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, + colorFormat, EB_TRUE, tileLeftBoundary, EB_FALSE, tileRightBoundary); - // Prediction - EncodePassIntraPredictionFuncTable[is16bit]( - is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, - contextPtr->cuOriginX + reconBuffer->originX, - contextPtr->cuOriginY + reconBuffer->originY, - cuStats->size, - cuStats->size>>1, - reconBuffer, - colorFormat, + // Prediction + EncodePassIntraPredictionFuncTable[is16bit]( + is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, + contextPtr->cuOriginX + reconBuffer->originX, + contextPtr->cuOriginY + reconBuffer->originY, + cuStats->size, + cuStats->size>>1, + reconBuffer, + colorFormat, EB_TRUE, - (EB_U32)puPtr->intraLumaMode, + (EB_U32)puPtr->intraLumaMode, EB_INTRA_CHROMA_DM, - PICTURE_BUFFER_DESC_CHROMA_MASK); - - //EncodeLoop - { - EncodeLoopFunctionTable[is16bit]( - contextPtr, - lcuPtr, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - cbQp, - reconBuffer, - coeffBufferTB, - residualBuffer, - transformBuffer, - transformInnerArrayPtr, - countNonZeroCoeffs, - useDeltaQpSegments, - (CabacEncodeContext_t*)coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - (EB_U32)puPtr->intraLumaMode, - PICTURE_BUFFER_DESC_CHROMA_MASK, - colorFormat, + PICTURE_BUFFER_DESC_CHROMA_MASK); + + //EncodeLoop + { + EncodeLoopFunctionTable[is16bit]( + contextPtr, + lcuPtr, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + cbQp, + reconBuffer, + coeffBufferTB, + residualBuffer, + transformBuffer, + transformInnerArrayPtr, + countNonZeroCoeffs, + useDeltaQpSegments, + (CabacEncodeContext_t*)coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + (EB_U32)puPtr->intraLumaMode, + PICTURE_BUFFER_DESC_CHROMA_MASK, + colorFormat, EB_TRUE, (contextPtr->cuStats->size == 64) ? 32 : contextPtr->cuStats->size, - pictureControlSetPtr->cabacCost, - cuPtr->deltaQp > 0 ? 0 : dZoffset); - - EncodeGenerateReconFunctionPtr[is16bit]( - contextPtr, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - PICTURE_BUFFER_DESC_CHROMA_MASK, - colorFormat, + pictureControlSetPtr->cabacCost, + cuPtr->deltaQp > 0 ? 0 : dZoffset); + + EncodeGenerateReconFunctionPtr[is16bit]( + contextPtr, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + PICTURE_BUFFER_DESC_CHROMA_MASK, + colorFormat, EB_TRUE, (contextPtr->cuStats->size == 64) ? 32 : contextPtr->cuStats->size, - reconBuffer, - residualBuffer, - transformInnerArrayPtr); - - // Update Recon Samples-INTRA- - EncodePassUpdateReconSampleNeighborArrays( - epLumaReconNeighborArray, - epCbReconNeighborArray, - epCrReconNeighborArray, - reconBuffer, - contextPtr->cuOriginX, - contextPtr->cuOriginY+(cuStats->size>>1), - cuStats->size, - PICTURE_BUFFER_DESC_CHROMA_MASK, - colorFormat, - is16bit); - } - } + reconBuffer, + residualBuffer, + transformInnerArrayPtr); + + // Update Recon Samples-INTRA- + EncodePassUpdateReconSampleNeighborArrays( + epLumaReconNeighborArray, + epCbReconNeighborArray, + epCrReconNeighborArray, + reconBuffer, + contextPtr->cuOriginX, + contextPtr->cuOriginY+(cuStats->size>>1), + cuStats->size, + PICTURE_BUFFER_DESC_CHROMA_MASK, + colorFormat, + is16bit); + } + } // Update the Intra-specific Neighbor Arrays EncodePassUpdateIntraModeNeighborArrays( @@ -3580,9 +3580,9 @@ EB_EXTERN void EncodePass( EB_U8 partitionIndex; EB_U8 componentMask = PICTURE_BUFFER_DESC_LUMA_MASK; - for (partitionIndex = 0; partitionIndex < 4; partitionIndex++) { - // Partition Loop - contextPtr->tuItr = partitionIndex + 1; + for (partitionIndex = 0; partitionIndex < 4; partitionIndex++) { + // Partition Loop + contextPtr->tuItr = partitionIndex + 1; EB_U16 partitionOriginX = contextPtr->cuOriginX + INTRA_4x4_OFFSET_X[partitionIndex]; EB_U16 partitionOriginY = contextPtr->cuOriginY + INTRA_4x4_OFFSET_Y[partitionIndex]; @@ -3621,10 +3621,10 @@ EB_EXTERN void EncodePass( epLumaReconNeighborArray, epCbReconNeighborArray, epCrReconNeighborArray, - is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, - pictureLeftBoundary, - pictureTopBoundary, - pictureRightBoundary); + is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, + pictureLeftBoundary, + pictureTopBoundary, + pictureRightBoundary); componentMask = PICTURE_BUFFER_DESC_LUMA_MASK; if (partitionIndex == 0 || @@ -3641,7 +3641,7 @@ EB_EXTERN void EncodePass( pictureRightBoundary = (lcuPtr->lcuEdgeInfoPtr->tileRightEdgeFlag == EB_TRUE && ((((partitionOriginX / 2) + MIN_PU_SIZE) & ((MAX_LCU_SIZE / 2) - 1)) == 0)) ? EB_TRUE : EB_FALSE; } componentMask = PICTURE_BUFFER_DESC_FULL_MASK; - GenerateChromaIntraReferenceSamplesFuncTable[is16bit]( + GenerateChromaIntraReferenceSamplesFuncTable[is16bit]( constrainedIntraFlag, enableStrongIntraSmoothing, (colorFormat == EB_YUV444) ? partitionOriginX : contextPtr->cuOriginX, @@ -3653,7 +3653,7 @@ EB_EXTERN void EncodePass( epLumaReconNeighborArray, epCbReconNeighborArray, epCrReconNeighborArray, - is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, + is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, colorFormat, (colorFormat == EB_YUV444) ? EB_FALSE : (EB_BOOL)partitionIndex, pictureLeftBoundary, @@ -3661,7 +3661,7 @@ EB_EXTERN void EncodePass( pictureRightBoundary); } - // Prediction + // Prediction if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { EncodePassIntraPredictionFuncTable[is16bit]( is16bit ? (void*)contextPtr->intraRefPtr16 : (void*)contextPtr->intraRefPtr, @@ -3732,17 +3732,17 @@ EB_EXTERN void EncodePass( pictureControlSetPtr->cabacCost, cuPtr->deltaQp > 0 ? 0 : dZoffset); - EncodeGenerateReconFunctionPtr[is16bit]( - contextPtr, - partitionOriginX, - partitionOriginY, - componentMask, - colorFormat, - EB_FALSE, + EncodeGenerateReconFunctionPtr[is16bit]( + contextPtr, + partitionOriginX, + partitionOriginY, + componentMask, + colorFormat, + EB_FALSE, MIN_PU_SIZE, - reconBuffer, - residualBuffer, - transformInnerArrayPtr); + reconBuffer, + residualBuffer, + transformInnerArrayPtr); // Update the Intra-specific Neighbor Arrays EncodePassUpdateIntraModeNeighborArrays( @@ -3980,7 +3980,7 @@ EB_EXTERN void EncodePass( tuSizeChroma = (colorFormat == EB_YUV444 ? 32: 16); } - //TU LOOP for MV mode + Luma CBF decision. + //TU LOOP for MV mode + Luma CBF decision. contextPtr->forceCbfFlag = (contextPtr->skipQpmFlag) ? EB_FALSE : lcuPtr->lcuEdgeInfoPtr->tileLeftEdgeFlag && ((tuOriginX & 63) == 0) && (tuOriginY == lcuOriginY); @@ -3992,7 +3992,7 @@ EB_EXTERN void EncodePass( lcuStatPtr->stationaryEdgeOverTimeFlag, pictureControlSetPtr->temporalLayerIndex > 0 ? lcuStatPtr->pmStationaryEdgeOverTimeFlag : lcuStatPtr->stationaryEdgeOverTimeFlag); - // Set Fast El coef shaping method + // Set Fast El coef shaping method contextPtr->transCoeffShapeLuma = DEFAULT_SHAPE; contextPtr->transCoeffShapeChroma = DEFAULT_SHAPE; @@ -4181,7 +4181,7 @@ EB_EXTERN void EncodePass( lcuStatPtr->stationaryEdgeOverTimeFlag, pictureControlSetPtr->temporalLayerIndex > 0 ? lcuStatPtr->pmStationaryEdgeOverTimeFlag : lcuStatPtr->stationaryEdgeOverTimeFlag); - // Set Fast El coef shaping method + // Set Fast El coef shaping method contextPtr->transCoeffShapeLuma = DEFAULT_SHAPE; contextPtr->transCoeffShapeChroma = DEFAULT_SHAPE; @@ -4714,7 +4714,7 @@ EB_EXTERN void EncodePass( &lcuPtr->saoParams, contextPtr->mdRateEstimationPtr, contextPtr->fullLambda, - contextPtr->fullChromaLambdaSao, + contextPtr->fullChromaLambdaSao, contextPtr->saoMode, pictureControlSetPtr, lcuOriginX, diff --git a/Source/Lib/Codec/EbCodingLoop.h b/Source/Lib/Codec/EbCodingLoop.h index fc85107cb..2c89b91bc 100644 --- a/Source/Lib/Codec/EbCodingLoop.h +++ b/Source/Lib/Codec/EbCodingLoop.h @@ -15,23 +15,23 @@ extern "C" { #endif /******************************************* - * ModeDecisionLCU + * ModeDecisionLCU * performs CL (LCU) *******************************************/ typedef EB_ERRORTYPE(*EB_MODE_DECISION)( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, const MdcLcuData_t * const mdcResultTbPtr, LargestCodingUnit_t *lcuPtr, EB_U32 lcuOriginX, EB_U32 lcuOriginY, - EB_U32 lcuAddr, + EB_U32 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE ModeDecisionLcu( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, const MdcLcuData_t * const mdcResultTbPtr, LargestCodingUnit_t *lcuPtr, EB_U16 lcuOriginX, @@ -40,39 +40,39 @@ extern EB_ERRORTYPE ModeDecisionLcu( ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE BdpConfiguration( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, LargestCodingUnit_t *lcuPtr, LcuParams_t *lcuParamPtr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE BdpPillar( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE BdpMvMergePass( - PictureControlSet_t *pictureControlSetPtr, - LcuParams_t *lcuParamPtr, + PictureControlSet_t *pictureControlSetPtr, + LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr); @@ -88,22 +88,22 @@ extern EB_ERRORTYPE LinkBdptoMd( extern EB_ERRORTYPE ModeDecisionRefinementLcu( - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, EB_U32 lcuOriginX, EB_U32 lcuOriginY, - ModeDecisionContext_t *contextPtr); + ModeDecisionContext_t *contextPtr); extern EB_ERRORTYPE QpmDeriveWeightsMinAndMax( - PictureControlSet_t *pictureControlSetPtr, - EncDecContext_t *contextPtr); + PictureControlSet_t *pictureControlSetPtr, + EncDecContext_t *contextPtr); extern void EncodePass( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, LargestCodingUnit_t *lcuPtr, EB_U32 tbAddr, - EB_U32 lcuOriginX, + EB_U32 lcuOriginX, EB_U32 lcuOriginY, EB_U32 lcuQp, EB_BOOL enableSaoFlag, diff --git a/Source/Lib/Codec/EbCodingUnit.c b/Source/Lib/Codec/EbCodingUnit.c index 751a41ac1..3f797c783 100644 --- a/Source/Lib/Codec/EbCodingUnit.c +++ b/Source/Lib/Codec/EbCodingUnit.c @@ -35,12 +35,12 @@ EB_ERRORTYPE LargestCodingUnitCtor( EB_U8 codedLeafIndex; EB_U32 tuIndex; EbPictureBufferDescInitData_t coeffInitData; - + LargestCodingUnit_t *largestCodingUnitPtr; EB_MALLOC(LargestCodingUnit_t*, largestCodingUnitPtr, sizeof(LargestCodingUnit_t), EB_N_PTR); *largetCodingUnitDblPtr = largestCodingUnitPtr; - + // ************ LCU *************** if((pictureWidth - lcuOriginX) < lcuSize) { borderLargestCuSize = pictureWidth - lcuOriginX; @@ -49,7 +49,7 @@ EB_ERRORTYPE LargestCodingUnitCtor( borderLargestCuSize -= (borderLargestCuSize & ((~0u) << Log2f(borderLargestCuSize))); } } - + if((pictureHeight - lcuOriginY) < lcuSize) { borderLargestCuSize = pictureHeight - lcuOriginY; // Which borderLargestCuSize is not a power of two @@ -62,8 +62,8 @@ EB_ERRORTYPE LargestCodingUnitCtor( largestCodingUnitPtr->sizeLog2 = (EB_U8)Log2f(lcuSize); largestCodingUnitPtr->originX = lcuOriginX; largestCodingUnitPtr->originY = lcuOriginY; - - largestCodingUnitPtr->index = lcuIndex; + + largestCodingUnitPtr->index = lcuIndex; EB_MALLOC(CodingUnit_t**, largestCodingUnitPtr->codedLeafArrayPtr, sizeof(CodingUnit_t*) * CU_MAX_COUNT, EB_N_PTR); for(codedLeafIndex=0; codedLeafIndex < CU_MAX_COUNT; ++codedLeafIndex) { @@ -75,23 +75,23 @@ EB_ERRORTYPE LargestCodingUnitCtor( largestCodingUnitPtr->codedLeafArrayPtr[codedLeafIndex]->leafIndex = codedLeafIndex; } - + coeffInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; coeffInitData.maxWidth = lcuSize; coeffInitData.maxHeight = lcuSize; coeffInitData.bitDepth = EB_16BIT; coeffInitData.colorFormat = largestCodingUnitPtr->pictureControlSetPtr->colorFormat; - coeffInitData.leftPadding = 0; - coeffInitData.rightPadding = 0; - coeffInitData.topPadding = 0; - coeffInitData.botPadding = 0; + coeffInitData.leftPadding = 0; + coeffInitData.rightPadding = 0; + coeffInitData.topPadding = 0; + coeffInitData.botPadding = 0; coeffInitData.splitMode = EB_FALSE; return_error = EbPictureBufferDescCtor( (EB_PTR*) &(largestCodingUnitPtr->quantizedCoeff), (EB_PTR) &coeffInitData); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } diff --git a/Source/Lib/Codec/EbCodingUnit.h b/Source/Lib/Codec/EbCodingUnit.h index 2d1aad10d..dfcae050f 100644 --- a/Source/Lib/Codec/EbCodingUnit.h +++ b/Source/Lib/Codec/EbCodingUnit.h @@ -53,7 +53,7 @@ extern "C" { struct PictureControlSet_s; #define MAX_CU_COST (0xFFFFFFFFFFFFFFFFull >> 1) -#define INVALID_FAST_CANDIDATE_INDEX ~0 +#define INVALID_FAST_CANDIDATE_INDEX ~0 #define MAX_OIS_0 7 // when I Slice #define MAX_OIS_1 9 // when P/B Slice and oisKernelLevel = 0 @@ -71,18 +71,18 @@ typedef struct CodingUnit_s unsigned qp : 6; unsigned refQp : 6; - signed deltaQp : 8; // can be signed 8bits - signed orgDeltaQp : 8; + signed deltaQp : 8; // can be signed 8bits + signed orgDeltaQp : 8; // Coded Tree - struct { - unsigned leafIndex : 8; - unsigned splitFlag : 1; - unsigned skipFlag : 1; + struct { + unsigned leafIndex : 8; + unsigned splitFlag : 1; + unsigned skipFlag : 1; - }; + }; } CodingUnit_t; @@ -109,24 +109,24 @@ typedef struct OisLcuResults_s typedef struct OisCu32Cu16Results_s { - EB_U8 totalIntraLumaMode[21]; - OisCandidate_t* sortedOisCandidate[21]; + EB_U8 totalIntraLumaMode[21]; + OisCandidate_t* sortedOisCandidate[21]; } OisCu32Cu16Results_t; typedef struct OisCu8Results_s { - EB_U8 totalIntraLumaMode[64]; - OisCandidate_t* sortedOisCandidate[64]; + EB_U8 totalIntraLumaMode[64]; + OisCandidate_t* sortedOisCandidate[64]; } OisCu8Results_t; typedef struct SaoStats_s { - EB_S32 **boDiff; + EB_S32 **boDiff; EB_U16 **boCount; - EB_S32 eoDiff[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1]; + EB_S32 eoDiff[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1]; EB_U16 eoCount[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1]; EB_S32 *eoDiff1D; EB_U32 *eoCount1D; @@ -146,17 +146,17 @@ typedef struct SaoParameters_s { typedef struct QpmLcuResults_s { EB_U8 cuQP; - EB_U8 cuIntraQP; + EB_U8 cuIntraQP; EB_U8 cuInterQP; EB_S8 deltaQp; - EB_S8 innerLcuCudeltaQp; + EB_S8 innerLcuCudeltaQp; } QpmLcuResults_t; typedef struct EdgeLcuResults_s { EB_U8 edgeBlockNum; - EB_U8 isolatedHighIntensityLcu; + EB_U8 isolatedHighIntensityLcu; } EdgeLcuResults_t; @@ -210,7 +210,7 @@ typedef struct LargestCodingUnit_s { EB_U8 intra4x4Mode[256]; EB_U8 preMdcRefinementLevel; - EB_U8 chromaEncodeMode; + EB_U8 chromaEncodeMode; EB_INTRA4x4_SEARCH_METHOD intra4x4SearchMethod; diff --git a/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c b/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c index e7acfdd74..86d4ecc83 100644 --- a/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c +++ b/Source/Lib/Codec/EbCoeffEstimation_Intrinsic.c @@ -42,12 +42,12 @@ static const EB_U8 CabacEstimatedBitsV2[] = static EB_U32 EncodeLastSignificantXYTemp( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 lastSigXPos, - EB_U32 lastSigYPos, - const EB_U32 size, - const EB_U32 isChroma) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 lastSigXPos, + EB_U32 lastSigYPos, + const EB_U32 size, + const EB_U32 isChroma) { EB_U32 coeffBits = 0; @@ -81,29 +81,29 @@ static EB_U32 EncodeLastSignificantXTemp( EB_S32 shift; EB_U32 contextIndex; EB_S32 groupCount; - + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize-2)*3 + ((logBlockSize-1)>>2)); shift = isChroma ? (logBlockSize-2) : ((logBlockSize+1)>>2); - + // X position xGroupIndex = lastSigXYGroupIndex[ lastSigXPos ]; - + for (contextIndex = 0; contextIndex < xGroupIndex; contextIndex++) { coeffBits += CabacEstimatedBitsV2[ 1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (xGroupIndex < lastSigXYGroupIndex[ size - 1 ]) { coeffBits += CabacEstimatedBitsV2[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (xGroupIndex > 3) { groupCount = (xGroupIndex - 2 ) >> 1; coeffBits += groupCount * ONE_BIT; } - + return coeffBits; } @@ -120,29 +120,29 @@ static EB_U32 EncodeLastSignificantYTemp( EB_S32 shift; EB_U32 contextIndex; EB_S32 groupCount; - + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize-2)*3 + ((logBlockSize-1)>>2)); shift = isChroma ? (logBlockSize-2) : ((logBlockSize+1)>>2); - + // Y position yGroupIndex = lastSigXYGroupIndex[ lastSigYPos ]; - + for (contextIndex = 0; contextIndex < yGroupIndex; contextIndex++) { coeffBits += CabacEstimatedBitsV2[ 1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (yGroupIndex < lastSigXYGroupIndex[ size - 1 ]) { coeffBits += CabacEstimatedBitsV2[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[ blockSizeOffset + (contextIndex>>shift) ] ]; } - + if (yGroupIndex > 3) { groupCount = (yGroupIndex - 2 ) >> 1; coeffBits += groupCount * ONE_BIT; } - + return coeffBits; } @@ -171,7 +171,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsLast[120+2*i] = EncodeLastSignificantXTemp(cabacEncodeCtxPtr, i, 4, 2, 1); CabacCostPtr->CabacBitsLast[121+2*i] = EncodeLastSignificantYTemp(cabacEncodeCtxPtr, i, 4, 2, 1); } - + for (i = 0; i < 8; i++) { CabacCostPtr->CabacBitsLast[8+2*i] = EncodeLastSignificantXTemp(cabacEncodeCtxPtr, i, 8, 3, 0); @@ -237,7 +237,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, for (i = 0; i < 3; i++) { EB_S32 j; - + for (j = 0; j < 16; j++) { CabacCostPtr->CabacBitsSigV[2*i+0][j] = CabacCostPtr->CabacBitsSig[1+2*contextIndexMap4[i][j]]; @@ -246,7 +246,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsSigV[2*i+7][j] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap4[i][j]+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; } } - + for (i = 0; i < 16; i++) { // Index: diag 0 / non diag 1 : context, always 0 : pos @@ -262,7 +262,7 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsSigV[20+1][i] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap8[1][0][i]+2*15]; CabacCostPtr->CabacBitsSigV[22+0][i] = CabacCostPtr->CabacBitsSig[1+2*contextIndexMap8[1][0][i]+2*18]; CabacCostPtr->CabacBitsSigV[22+1][i] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap8[1][0][i]+2*18]; - + CabacCostPtr->CabacBitsSigV[24+0][i] = CabacCostPtr->CabacBitsSig[1+2*contextIndexMap8[0][0][i]+2*9+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[24+1][i] = CabacCostPtr->CabacBitsSig[0+2*contextIndexMap8[0][0][i]+2*9+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[26+0][i] = CabacCostPtr->CabacBitsSigV[24+0][i]; @@ -281,14 +281,14 @@ void PrecomputeCabacCost(CabacCost_t *CabacCostPtr, CabacCostPtr->CabacBitsSigV[16+1][i] = CabacCostPtr->CabacBitsSig[0+2*0]; CabacCostPtr->CabacBitsSigV[20+0][i] = CabacCostPtr->CabacBitsSig[1+2*0]; CabacCostPtr->CabacBitsSigV[20+1][i] = CabacCostPtr->CabacBitsSig[0+2*0]; - + CabacCostPtr->CabacBitsSigV[24+0][i] = CabacCostPtr->CabacBitsSig[1+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[24+1][i] = CabacCostPtr->CabacBitsSig[0+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[28+0][i] = CabacCostPtr->CabacBitsSig[1+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; CabacCostPtr->CabacBitsSigV[28+1][i] = CabacCostPtr->CabacBitsSig[0+2*NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS]; } } - + for (i = 0; i < 32; i += 2) { EB_S32 j; @@ -310,7 +310,7 @@ static EB_U32 RemainingCoeffExponentialGolombCodeTemp(EB_U32 symbolValue, EB_U32 { EB_S32 codeWord = symbolValue >> golombParam; EB_U32 numberOfBins; - + numberOfBins = golombParam + 1; if (codeWord < COEF_REMAIN_BIN_REDUCTION) { @@ -321,7 +321,7 @@ static EB_U32 RemainingCoeffExponentialGolombCodeTemp(EB_U32 symbolValue, EB_U32 codeWord -= COEF_REMAIN_BIN_REDUCTION - 1; numberOfBins += 2 * Log2f(codeWord) + COEF_REMAIN_BIN_REDUCTION; } - + return ONE_BIT * numberOfBins; } @@ -332,623 +332,623 @@ static const EB_U8 g_mask[32] = { static inline EB_U32 RemainingCoeffExponentialGolombCodeTempZeroParam(EB_U32 symbolValue) { - EB_S32 codeWord = symbolValue; - EB_U32 numberOfBins; - - numberOfBins = 1; - if (codeWord < COEF_REMAIN_BIN_REDUCTION) - { - numberOfBins += codeWord; - } - else - { - codeWord -= COEF_REMAIN_BIN_REDUCTION - 1; - numberOfBins += 2 * Log2f(codeWord) + COEF_REMAIN_BIN_REDUCTION; - } - - return ONE_BIT * numberOfBins; + EB_S32 codeWord = symbolValue; + EB_U32 numberOfBins; + + numberOfBins = 1; + if (codeWord < COEF_REMAIN_BIN_REDUCTION) + { + numberOfBins += codeWord; + } + else + { + codeWord -= COEF_REMAIN_BIN_REDUCTION - 1; + numberOfBins += 2 * Log2f(codeWord) + COEF_REMAIN_BIN_REDUCTION; + } + + return ONE_BIT * numberOfBins; } EB_ERRORTYPE PmEstimateQuantCoeffLuma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 coeffBits = 0; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_U32 posLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; - - - __m128i sigBits = _mm_setzero_si128(); - __m128i cs0, cs1; - __m128i z0 = _mm_setzero_si128(); - __m128i *sigBitsPtr; - - (void)(cabacEncodeCtxPtr); - (void)(type); - (void)(intraLumaMode); - (void)(intraChromaMode); - (void)componentType; - (void)size; - // Coefficients ordered according to scan order (absolute values) + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 coeffBits = 0; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_U32 posLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; + + + __m128i sigBits = _mm_setzero_si128(); + __m128i cs0, cs1; + __m128i z0 = _mm_setzero_si128(); + __m128i *sigBitsPtr; + + (void)(cabacEncodeCtxPtr); + (void)(type); + (void)(intraLumaMode); + (void)(intraChromaMode); + (void)componentType; + (void)size; + // Coefficients ordered according to scan order (absolute values) __m128i linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_U16))] = {{0}}; - EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; - EB_U16 greaterThan1Map; + EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; + EB_U16 greaterThan1Map; - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 absVal; - EB_U32 symbolValue; + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 absVal; + EB_U32 symbolValue; - coeffBits += CabacCost->CabacBitsLast[0]; - coeffBits += CabacCost->CabacBitsLast[1]; + coeffBits += CabacCost->CabacBitsLast[0]; + coeffBits += CabacCost->CabacBitsLast[1]; - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; - coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; + coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[symbolValue]; + // Add bits for coeff_abs_level_greater2_flag + coeffBits += CabacCost->CabacBitsG2[symbolValue]; - if (symbolValue) - { - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + if (symbolValue) + { + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } - } + } + } - coeffBits += ONE_BIT; // Sign bit + coeffBits += ONE_BIT; // Sign bit - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; - } + return return_error; + } - //------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------- - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - EB_S32 sigmap; + EB_S32 sigmap; - { + { - __m128i z1; - __m128i a0, a1, a2, a3; - __m128i b0, b1, c0, c1, d0, d1; - __m128i s0, s1; + __m128i z1; + __m128i a0, a1, a2, a3; + __m128i b0, b1, c0, c1, d0, d1; + __m128i s0, s1; - EB_S16 *subblockPtr; + EB_S16 *subblockPtr; - // determine position of subblock within transform block - subblockPtr = coeffBufferPtr; + // determine position of subblock within transform block + subblockPtr = coeffBufferPtr; - a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- - a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- - a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- - a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- + a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- + a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- + a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- + a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - { - EB_S32 v03, v30; + { + EB_S32 v03, v30; - b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 - b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 + b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 - c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 + c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - v03 = _mm_extract_epi16(a0, 3); - v30 = _mm_extract_epi16(a3, 0); + v03 = _mm_extract_epi16(a0, 3); + v30 = _mm_extract_epi16(a3, 0); - d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 - d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 + d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 - d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 - } + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 + d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 + } - //CHKN: use abs - // Absolute value (note: _mm_abs_epi16 requires SSSE3) - s0 = _mm_srai_epi16(d0, 15); - s1 = _mm_srai_epi16(d1, 15); - d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); - d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); + //CHKN: use abs + // Absolute value (note: _mm_abs_epi16 requires SSSE3) + s0 = _mm_srai_epi16(d0, 15); + s1 = _mm_srai_epi16(d1, 15); + d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); + d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); - z0 = _mm_packs_epi16(d0, d1); - z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); - z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); + z0 = _mm_packs_epi16(d0, d1); + z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); + z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - sigmap = _mm_movemask_epi8(z0) ^ 0xffff; + sigmap = _mm_movemask_epi8(z0) ^ 0xffff; - linearCoeff[0] = d0; - linearCoeff[1] = d1; + linearCoeff[0] = d0; + linearCoeff[1] = d1; - greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); + greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); - } + } - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost - // subblock position + // subblock position - posLast = Log2f(sigmap); + posLast = Log2f(sigmap); - coeffGroupPosition = scans4[0][posLast]; + coeffGroupPosition = scans4[0][posLast]; - lastSigYPos = coeffGroupPosition >> 2; - lastSigXPos = coeffGroupPosition & 3; + lastSigYPos = coeffGroupPosition >> 2; + lastSigXPos = coeffGroupPosition & 3; - // Add cost of significance map - sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[0]; - cs0 = _mm_loadu_si128(sigBitsPtr); - cs1 = _mm_loadu_si128(sigBitsPtr + 1); - cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); + // Add cost of significance map + sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[0]; + cs0 = _mm_loadu_si128(sigBitsPtr); + cs1 = _mm_loadu_si128(sigBitsPtr + 1); + cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); - // Set bit count to zero for positions that are not coded - cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); + // Set bit count to zero for positions that are not coded + cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); - sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); - // Add significance bits - sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 - coeffBits += _mm_cvtsi128_si32(sigBits); + sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); + // Add significance bits + sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 + coeffBits += _mm_cvtsi128_si32(sigBits); - // Encode the position of last significant coefficient - coeffBits += CabacCost->CabacBitsLast[2 * lastSigXPos + 0]; - coeffBits += CabacCost->CabacBitsLast[2 * lastSigYPos + 1]; + // Encode the position of last significant coefficient + coeffBits += CabacCost->CabacBitsLast[2 * lastSigXPos + 0]; + coeffBits += CabacCost->CabacBitsLast[2 * lastSigYPos + 1]; - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels - subSetIndex = 0; - do - { + subSetIndex = 0; + do + { - EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) - EB_S32 index; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 index; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); - coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) + coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) - if (greaterThan1Map == 0) - { - coeffBits += CabacCost->CabacBitsG1x[numNonZeroCoeffs - 1]; - continue; - } + if (greaterThan1Map == 0) + { + coeffBits += CabacCost->CabacBitsG1x[numNonZeroCoeffs - 1]; + continue; + } - sigmap = sigmap << 16; + sigmap = sigmap << 16; - EB_S32 subPosition = 15; + EB_S32 subPosition = 15; - EB_U32 count = 0; - do - { - if (sigmap < 0) - { - absCoeff[count++] = linearCoeffBufferPtr[subPosition]; - } - subPosition--; - sigmap <<= 1; - } while (sigmap); + EB_U32 count = 0; + do + { + if (sigmap < 0) + { + absCoeff[count++] = linearCoeffBufferPtr[subPosition]; + } + subPosition--; + sigmap <<= 1; + } while (sigmap); - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for coeff_abs_level_greater1_flag + // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag + // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[symbolValue]; + coeffBits += CabacCost->CabacBitsG2[symbolValue]; - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } + } - index++; + index++; - // Exit loop early as remaining coefficients are coded differently - break; - } + // Exit loop early as remaining coefficients are coded differently + break; + } - } + } - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for >1 flag + // Add bits for >1 flag - coeffBits += CabacCost->CabacBitsG1[symbolValue]; + coeffBits += CabacCost->CabacBitsG1[symbolValue]; - if (symbolValue) - { - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); - } - } + if (symbolValue) + { + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); + } + } - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < (EB_S32)numNonZeroCoeffs; index++) - { - EB_S32 absVal = absCoeff[index]; + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < (EB_S32)numNonZeroCoeffs; index++) + { + EB_S32 absVal = absCoeff[index]; - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); - } + } - } while (--subSetIndex >= 0); + } while (--subSetIndex >= 0); - // Add local bit counter to global bit counter + // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; + return return_error; } EB_ERRORTYPE PmEstimateQuantCoeffChroma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 coeffBits = 0; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_U32 posLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; - - (void)(cabacEncodeCtxPtr); - (void)(type); - (void)(intraLumaMode); - (void)(intraChromaMode); - (void)componentType; - (void)size; - __m128i sigBits = _mm_setzero_si128(); - __m128i cs0, cs1; - __m128i z0 = _mm_setzero_si128(); - //EB_S32 sigCtx = 0; - - __m128i *sigBitsPtr; - - - // Coefficients ordered according to scan order (absolute values) + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 coeffBits = 0; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_U32 posLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; + + (void)(cabacEncodeCtxPtr); + (void)(type); + (void)(intraLumaMode); + (void)(intraChromaMode); + (void)componentType; + (void)size; + __m128i sigBits = _mm_setzero_si128(); + __m128i cs0, cs1; + __m128i z0 = _mm_setzero_si128(); + //EB_S32 sigCtx = 0; + + __m128i *sigBitsPtr; + + + // Coefficients ordered according to scan order (absolute values) __m128i linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_U16))] = {{0}}; - EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; + EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; - EB_U16 greaterThan1Map; + EB_U16 greaterThan1Map; - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 absVal; - EB_U32 symbolValue; + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 absVal; + EB_U32 symbolValue; - coeffBits += CabacCost->CabacBitsLast[120 + 0]; - coeffBits += CabacCost->CabacBitsLast[120 + 1]; + coeffBits += CabacCost->CabacBitsLast[120 + 0]; + coeffBits += CabacCost->CabacBitsLast[120 + 1]; - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; - coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag + // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; + coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } - } + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + } + } - coeffBits += ONE_BIT; // Sign bit - // Add local bit counter to global bit counter + coeffBits += ONE_BIT; // Sign bit + // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; - } + return return_error; + } - //sigCtx = 0; - //if (isChroma) - // sigCtx += 6; + //sigCtx = 0; + //if (isChroma) + // sigCtx += 6; - //------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------- - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - EB_S32 sigmap; + EB_S32 sigmap; - { + { - __m128i z1; - // __m128i z2; - __m128i a0, a1, a2, a3; - __m128i b0, b1, c0, c1, d0, d1; - __m128i s0, s1; + __m128i z1; + // __m128i z2; + __m128i a0, a1, a2, a3; + __m128i b0, b1, c0, c1, d0, d1; + __m128i s0, s1; - EB_S16 *subblockPtr; + EB_S16 *subblockPtr; - // determine position of subblock within transform block - subblockPtr = coeffBufferPtr; + // determine position of subblock within transform block + subblockPtr = coeffBufferPtr; - a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- - a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- - a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- - a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- + a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- + a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- + a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- + a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - { - EB_S32 v03, v30; + { + EB_S32 v03, v30; - b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 - b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 + b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 - c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 + c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - v03 = _mm_extract_epi16(a0, 3); - v30 = _mm_extract_epi16(a3, 0); + v03 = _mm_extract_epi16(a0, 3); + v30 = _mm_extract_epi16(a3, 0); - d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 - d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 + d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 - d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 - } + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 + d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 + } - //CHKN: use abs - // Absolute value (note: _mm_abs_epi16 requires SSSE3) - s0 = _mm_srai_epi16(d0, 15); - s1 = _mm_srai_epi16(d1, 15); - d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); - d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); + //CHKN: use abs + // Absolute value (note: _mm_abs_epi16 requires SSSE3) + s0 = _mm_srai_epi16(d0, 15); + s1 = _mm_srai_epi16(d1, 15); + d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); + d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); - z0 = _mm_packs_epi16(d0, d1); - z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); - z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); + z0 = _mm_packs_epi16(d0, d1); + z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); + z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - sigmap = _mm_movemask_epi8(z0) ^ 0xffff; + sigmap = _mm_movemask_epi8(z0) ^ 0xffff; - linearCoeff[0] = d0; - linearCoeff[1] = d1; + linearCoeff[0] = d0; + linearCoeff[1] = d1; - greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); + greaterThan1Map = (EB_U16)_mm_movemask_epi8(z1); - } + } - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost - // subblock position + // subblock position - posLast = Log2f(sigmap); + posLast = Log2f(sigmap); - coeffGroupPosition = scans4[0][posLast]; + coeffGroupPosition = scans4[0][posLast]; - lastSigYPos = coeffGroupPosition >> 2; - lastSigXPos = coeffGroupPosition & 3; + lastSigYPos = coeffGroupPosition >> 2; + lastSigXPos = coeffGroupPosition & 3; - // Add cost of significance map - sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[6]; - cs0 = _mm_loadu_si128(sigBitsPtr); - cs1 = _mm_loadu_si128(sigBitsPtr + 1); - cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); + // Add cost of significance map + sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[6]; + cs0 = _mm_loadu_si128(sigBitsPtr); + cs1 = _mm_loadu_si128(sigBitsPtr + 1); + cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); - // Set bit count to zero for positions that are not coded - cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); + // Set bit count to zero for positions that are not coded + cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask + 16 - posLast))); - sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); - // Add significance bits - sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 - coeffBits += _mm_cvtsi128_si32(sigBits); + sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); + // Add significance bits + sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 + coeffBits += _mm_cvtsi128_si32(sigBits); - // Encode the position of last significant coefficient + // Encode the position of last significant coefficient - coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigXPos]; - coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigYPos + 1]; + coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigXPos]; + coeffBits += CabacCost->CabacBitsLast[120 + 2 * lastSigYPos + 1]; - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels - subSetIndex = 0; - do - { + subSetIndex = 0; + do + { - EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) - EB_S32 index; - // EB_U32 contextSet; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 index; + // EB_U32 contextSet; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZeroCoeffs); - coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) + coeffBits += ONE_BIT * numNonZeroCoeffs; // Add bits for coeff_sign_flag (all coefficients in subblock) - if (greaterThan1Map == 0) - { - coeffBits += CabacCost->CabacBitsG1x[4 * 16 + numNonZeroCoeffs - 1]; - continue; - } + if (greaterThan1Map == 0) + { + coeffBits += CabacCost->CabacBitsG1x[4 * 16 + numNonZeroCoeffs - 1]; + continue; + } - sigmap = sigmap << 16; + sigmap = sigmap << 16; - EB_S32 subPosition = 15; + EB_S32 subPosition = 15; - EB_U32 count = 0; - do - { - if (sigmap < 0) - { - absCoeff[count++] = linearCoeffBufferPtr[subPosition]; - } - subPosition--; - sigmap <<= 1; - } while (sigmap); + EB_U32 count = 0; + do + { + if (sigmap < 0) + { + absCoeff[count++] = linearCoeffBufferPtr[subPosition]; + } + subPosition--; + sigmap <<= 1; + } while (sigmap); - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for coeff_abs_level_greater1_flag + // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 * (16 + 1) + symbolValue]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag + // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; + coeffBits += CabacCost->CabacBitsG2[2 * (4) + symbolValue]; - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 3); - } + } - index++; + index++; - // Exit loop early as remaining coefficients are coded differently - break; - } + // Exit loop early as remaining coefficients are coded differently + break; + } - } + } - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Add bits for >1 flag + // Add bits for >1 flag - coeffBits += CabacCost->CabacBitsG1[2 * 16 + symbolValue]; + coeffBits += CabacCost->CabacBitsG1[2 * 16 + symbolValue]; - if (symbolValue) - { - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); + if (symbolValue) + { + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 2); - } - } + } + } - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < (EB_S32)numNonZeroCoeffs; index++) - { - EB_S32 absVal = absCoeff[index]; - coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < (EB_S32)numNonZeroCoeffs; index++) + { + EB_S32 absVal = absCoeff[index]; + coeffBits += RemainingCoeffExponentialGolombCodeTempZeroParam(absVal - 1); - } + } - } while (--subSetIndex >= 0); + } while (--subSetIndex >= 0); - // Add local bit counter to global bit counter + // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits << 10; + *coeffBitsLong += coeffBits << 10; - return return_error; + return return_error; } /********************************************************************** @@ -956,21 +956,21 @@ EB_ERRORTYPE PmEstimateQuantCoeffChroma_SSE2( **********************************************************************/ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { EB_ERRORTYPE return_error = EB_ErrorNone; - + EB_S32 isChroma = componentType != COMPONENT_LUMA; EB_U32 logBlockSize = Log2f(size); EB_U32 coeffBits = 0; @@ -985,7 +985,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( EB_S32 lastSigXPos; EB_S32 lastSigYPos; EB_U32 contextOffset1; - + __m128i sigBits = _mm_setzero_si128(); __m128i cs0, cs1; @@ -993,12 +993,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( EB_S32 sigCtx = 0; EB_U8 nnz[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ]; __m128i *sigBitsPtr; - + // Coefficients ordered according to scan order (absolute values) __m128i linearCoeff[ MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_U16)) ]; EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; EB_U16 greaterThan1Map[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ] ={0}; - + // Significance map for each 4x4 subblock // 1 bit per coefficient // i-th bit corresponds to i-th coefficient in forward scan order @@ -1014,7 +1014,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( EB_U32 contextOffset2; coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, 0, 0, size, isChroma); - + absVal = ABS(coeffBufferPtr[ 0 ]); symbolValue = absVal > 1; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; @@ -1022,11 +1022,11 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( // Add bits for coeff_abs_level_greater1_flag coeffBits += CabacCost->CabacBitsG1[2*(contextOffset+1) + symbolValue]; - + if (symbolValue) { symbolValue = absVal > 2; - + // Add bits for coeff_abs_level_greater2_flag coeffBits += CabacCost->CabacBitsG2[2*(contextOffset2) + symbolValue]; if (symbolValue) @@ -1035,10 +1035,10 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 3, 0); } } - + coeffBits += ONE_BIT; // Sign bit // Add local bit counter to global bit counter - + *coeffBitsLong += coeffBits << 10; return return_error; } @@ -1046,7 +1046,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( // Compute the scanning type // optimized this if statement later - + if (type == INTRA_MODE) { // The test on partition size should be commented out to get conformance for Intra 4x4 ! @@ -1056,12 +1056,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( // the mode of upper-left corner of current CU //intraLumaMode = candidatePtr->intraLumaMode[0]; //intraChromaMode = candidatePtr->intraChromaMode[0]; - + if (logBlockSize <= (EB_U32)(3 - isChroma)) { EB_U32 tempIntraChromaMode = chromaMappingTable[ intraChromaMode ]; EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; - + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; @@ -1069,7 +1069,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } } - + if (logBlockSize == 2) { sigCtx = 2 * scanIndex; // 6 values @@ -1079,7 +1079,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { sigCtx = 12; if (isChroma) sigCtx += 12; - + if (logBlockSize != 3) { sigCtx += 4; @@ -1089,9 +1089,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( sigCtx += 8; } } - + //------------------------------------------------------------------------------------------------------------------- - + // Loop through subblocks to reorder coefficients according to scan order // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients subSetIndex = 0; @@ -1104,41 +1104,41 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( __m128i s0, s1; EB_S32 sigmap; EB_S16 *subblockPtr; - + // determine position of subblock within transform block coeffGroupPosition = sbScans[ logBlockSize-2 ][ subSetIndex ]; coeffGroupPositionY = coeffGroupPosition >> 4; coeffGroupPositionX = coeffGroupPosition & 15; - + if (scanIndex == SCAN_HOR2) { // Subblock scan is mirrored for horizontal scan SWAP(coeffGroupPositionX, coeffGroupPositionY); } - + /*EB_S16 **/subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - + a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - + if (scanIndex == SCAN_DIAG2) { EB_S32 v03, v30; - + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - + v03 = _mm_extract_epi16(a0, 3); v30 = _mm_extract_epi16(a3, 0); - + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 } @@ -1151,11 +1151,11 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { b0 = _mm_unpacklo_epi16(a0, a2); // 00 20 01 21 02 22 03 23 b1 = _mm_unpacklo_epi16(a1, a3); // 10 30 11 31 12 32 13 33 - + d0 = _mm_unpacklo_epi16(b0, b1); // 00 10 20 30 01 11 21 31 d1 = _mm_unpackhi_epi16(b0, b1); // 02 12 22 32 03 13 23 33 } - + // Absolute value (note: _mm_abs_epi16 requires SSSE3) s0 = _mm_srai_epi16(d0, 15); s1 = _mm_srai_epi16(d1, 15); @@ -1164,23 +1164,23 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( z0 = _mm_packs_epi16(d0, d1); z1 = _mm_cmpgt_epi8(z0, _mm_set1_epi8(1)); z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - + sigmap = _mm_movemask_epi8(z0) ^ 0xffff; subblockSigmap[ subSetIndex ] = (EB_U16)sigmap; - + if (sigmap != 0) { EB_U32 num; - + lastScanSet = subSetIndex; linearCoeff[ 2 * subSetIndex + 0 ] = d0; linearCoeff[ 2 * subSetIndex + 1 ] = d1; - + greaterThan1Map[ subSetIndex ] = (EB_U16) _mm_movemask_epi8(z1); - + // Count number of bits set in sigmap (Hamming weight) z2 = _mm_sad_epu8(z0, _mm_setzero_si128()); - + num = 16; num += _mm_cvtsi128_si32(z2); num += _mm_extract_epi16(z2, 4); @@ -1197,7 +1197,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { nnz[subSetIndex] = 0; } - + if (sigmap != 0 || subSetIndex == 0) { // Add cost of significance map @@ -1213,13 +1213,13 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } sigCtx |= 2; // differentiate between first and other blocks because of DC subSetIndex++; - + // Check that we are not going beyond block end } //------------------------------------------------------------------------------------------------------------------- // Obtain the last significant X and Y positions and compute their bit cost - + // subblock position coeffGroupPosition = sbScans[ logBlockSize - 2 ][ lastScanSet ]; coeffGroupPositionY = coeffGroupPosition >> 4; @@ -1227,28 +1227,28 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( lastSigYPos = 4 * coeffGroupPositionY; lastSigXPos = 4 * coeffGroupPositionX; scanPosLast = 16 * lastScanSet; - + // position within subblock posLast = Log2f(subblockSigmap[ lastScanSet ]); coeffGroupPosition = scans4[ scanIndex != SCAN_DIAG2 ][ posLast ]; lastSigYPos += coeffGroupPosition >> 2; lastSigXPos += coeffGroupPosition & 3; scanPosLast += posLast; - + // Add cost of significance map sigBitsPtr = (__m128i *)CabacCost->CabacBitsSigV[sigCtx]; cs0 = _mm_loadu_si128(sigBitsPtr); cs1 = _mm_loadu_si128(sigBitsPtr+1); cs0 = _mm_xor_si128(cs0, _mm_and_si128(cs1, z0)); - + // Set bit count to zero for positions that are not coded cs0 = _mm_and_si128(cs0, _mm_loadu_si128((__m128i *)(g_mask+16-posLast))); - + sigBits = _mm_add_epi64(sigBits, _mm_sad_epu8(cs0, _mm_setzero_si128())); // Add significance bits sigBits = _mm_add_epi32(sigBits, _mm_shuffle_epi32(sigBits, 0x4e)); // 01001110 coeffBits += _mm_cvtsi128_si32(sigBits); - + // Should swap row/col for SCAN_HOR and SCAN_VER: // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) // - SCAN_VER because of equation (7-66) in H.265 (04/2013) @@ -1257,33 +1257,33 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( { SWAP(lastSigXPos, lastSigYPos); } - + // Encode the position of last significant coefficient coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, isChroma); - + //------------------------------------------------------------------------------------------------------------------- // Encode Coefficient levels - + contextOffset1 = 1; - + // Loop over subblocks subSetIndex = lastScanSet; do { EB_S32 numNonZero = 0; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) EB_U32 golombRiceParam = 0; EB_S32 index; EB_U32 contextSet; EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded EB_U32 contextOffset; EB_U32 contextOffset2; - + // 1. Subblock-level significance flag - + if (subSetIndex != 0) { - + if (subSetIndex != lastScanSet) { EB_U32 sigCoeffGroupContextIndex; @@ -1291,12 +1291,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( sigCoeffGroupContextIndex = 0; sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - + significanceFlag = (subblockSigmap[ subSetIndex ] != 0); - + // Add bits for coded_sub_block_flag coeffBits += CabacCost->CabacBitsSigMl[2*sigCoeffGroupContextIndex+significanceFlag]; - + if (!significanceFlag) { // Nothing else to do for this subblock since all coefficients in it are zero @@ -1305,21 +1305,21 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } - - + + // 3. Coefficient level values - + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - + numNonZero = nnz[ subSetIndex ]; numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - { - coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) - } + { + coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) + } if (greaterThan1Map[subSetIndex] == 0) { @@ -1344,7 +1344,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } while (sigMap); } - + // Loop over coefficients until base value of Exp-Golomb coding changes // Base value changes after either // - 8th coefficient @@ -1376,14 +1376,14 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } } - + // Loop over coefficients after first one that was > 1 but before 8th one // Base value is know to be equal to 2 for ( ; index < numCoeffWithCodedGt1Flag; index++) { EB_S32 absVal = absCoeff[ index ]; EB_U32 symbolValue = absVal > 1; - + // Add bits for >1 flag coeffBits += CabacCost->CabacBitsG1[2*contextOffset + symbolValue]; if (symbolValue) @@ -1392,7 +1392,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } - + // Loop over remaining coefficients (8th and beyond) // Base value is known to be equal to 1 for ( ; index < numNonZero; index++ ) @@ -1404,29 +1404,29 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( } } while (--subSetIndex >= 0); - + // Add local bit counter to global bit counter *coeffBitsLong += coeffBits << 10; - + return return_error; } EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { EB_ERRORTYPE return_error = EB_ErrorNone; - + EB_S32 isChroma = componentType != COMPONENT_LUMA; EB_U32 logBlockSize = Log2f(size); EB_U32 coeffBits = 0; @@ -1442,17 +1442,17 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( EB_S32 lastSigYPos; EB_U32 significantFlagContextOffset; EB_U32 contextOffset1; - + // Coefficients ordered according to scan order (absolute values) EB_U16 linearCoeff[ MAX_TU_SIZE * MAX_TU_SIZE ]; EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; EB_U16 greaterThan1Map[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ]; - + // Significance map for each 4x4 subblock // 1 bit per coefficient // i-th bit corresponds to i-th coefficient in forward scan order EB_U16 subblockSigmap[ MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4) ]; - + // DC-only fast track if (numNonZeroCoeffs == 1 && coeffBufferPtr[ 0 ] != 0) { @@ -1460,21 +1460,21 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( EB_U32 symbolValue; EB_U32 contextOffset; EB_U32 contextOffset2; - + coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, 0, 0, size, isChroma); - + absVal = ABS(coeffBufferPtr[ 0 ]); symbolValue = absVal > 1; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; - + // Add bits for coeff_abs_level_greater1_flag coeffBits += CabacCost->CabacBitsG1[2*(contextOffset+1) + symbolValue]; - + if (symbolValue) { symbolValue = absVal > 2; - + // Add bits for coeff_abs_level_greater2_flag coeffBits += CabacCost->CabacBitsG2[2*(contextOffset2) + symbolValue]; @@ -1484,17 +1484,17 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 3, 0); } } - + coeffBits += ONE_BIT; // Sign bit // Add local bit counter to global bit counter - + *coeffBitsLong += coeffBits << 10; return return_error; } - + // Compute the scanning type // optimized this if statement later - + if (type == INTRA_MODE) { // The test on partition size should be commented out to get conformance for Intra 4x4 ! @@ -1504,12 +1504,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( // the mode of upper-left corner of current CU //intraLumaMode = candidatePtr->intraLumaMode[0]; //intraChromaMode = candidatePtr->intraChromaMode[0]; - + if (logBlockSize <= (EB_U32)(3 - isChroma)) { EB_U32 tempIntraChromaMode = chromaMappingTable[ intraChromaMode ]; EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; - + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; @@ -1517,15 +1517,15 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } } - + //------------------------------------------------------------------------------------------------------------------- - + // Loop through subblocks to reorder coefficients according to scan order // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients subSetIndex = 0; while (1) { - EB_S16 *subblockPtr; + EB_S16 *subblockPtr; EB_S16 k; EB_S32 sigmap = 0; EB_U32 num = 0; @@ -1534,18 +1534,18 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( coeffGroupPosition = sbScans[ logBlockSize-2 ][ subSetIndex ]; coeffGroupPositionY = coeffGroupPosition >> 4; coeffGroupPositionX = coeffGroupPosition & 15; - + if (scanIndex == SCAN_HOR2) { // Subblock scan is mirrored for horizontal scan SWAP(coeffGroupPositionX, coeffGroupPositionY); } - + subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - + for (k = 0; k < 16; k++) { - EB_U32 val , isNonZero; + EB_U32 val , isNonZero; EB_U32 position = scans4[ scanIndex != SCAN_DIAG2 ][ k ]; EB_U32 positionY = position >> 2; EB_U32 positionX = position & 3; @@ -1554,7 +1554,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( // Subblock scan is mirrored for horizontal scan SWAP(positionX, positionY); } - + /*EB_U32*/ val = ABS(subblockPtr[ coeffStride * positionY + positionX ]); linearCoeff[ 16 * subSetIndex + k ] = (EB_U16) val; /*EB_U32 */isNonZero = val != 0; @@ -1565,29 +1565,29 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( g1map |= 1 << k; } } - + subblockSigmap[ subSetIndex ] = (EB_U16) sigmap; greaterThan1Map[ subSetIndex ] = (EB_U16) g1map; if (sigmap != 0) { lastScanSet = subSetIndex; - + numNonZeroCoeffs -= num; if (numNonZeroCoeffs == 0) { break; } } - + subSetIndex++; - + // Check that we are not going beyond block end } - + //------------------------------------------------------------------------------------------------------------------- // Obtain the last significant X and Y positions and compute their bit cost - + // subblock position coeffGroupPosition = sbScans[ logBlockSize - 2 ][ lastScanSet ]; coeffGroupPositionY = coeffGroupPosition >> 4; @@ -1595,14 +1595,14 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( lastSigYPos = 4 * coeffGroupPositionY; lastSigXPos = 4 * coeffGroupPositionX; scanPosLast = 16 * lastScanSet; - + // position within subblock posLast = Log2f(subblockSigmap[ lastScanSet ]); coeffGroupPosition = scans4[ scanIndex != SCAN_DIAG2 ][ posLast ]; lastSigYPos += coeffGroupPosition >> 2; lastSigXPos += coeffGroupPosition & 3; scanPosLast += posLast; - + // Should swap row/col for SCAN_HOR and SCAN_VER: // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) // - SCAN_VER because of equation (7-66) in H.265 (04/2013) @@ -1611,48 +1611,48 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( { SWAP(lastSigXPos, lastSigYPos); } - + // Encode the position of last significant coefficient coeffBits += EncodeLastSignificantXYTemp(CabacCost,cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, isChroma); - + //------------------------------------------------------------------------------------------------------------------- // Encode Coefficient levels - + significantFlagContextOffset = (!isChroma)? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - + contextOffset1 = 1; - + // Loop over subblocks subSetIndex = lastScanSet; do { EB_S32 numNonZero = 0; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) EB_U32 golombRiceParam = 0; EB_S32 index; EB_U32 contextSet; EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded EB_U32 contextOffset; EB_U32 contextOffset2; - + // 1. Subblock-level significance flag - + if (subSetIndex != 0) { - + if (subSetIndex != lastScanSet) { EB_U32 sigCoeffGroupContextIndex; EB_U32 significanceFlag; - + sigCoeffGroupContextIndex = 0; sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - + significanceFlag = (subblockSigmap[ subSetIndex ] != 0); - + // Add bits for coded_sub_block_flag coeffBits += CabacCost->CabacBitsSigMl[2*sigCoeffGroupContextIndex+significanceFlag]; - + if (!significanceFlag) { // Nothing else to do for this subblock since all coefficients in it are zero @@ -1660,9 +1660,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } } - + // 2. Coefficient significance flags - + // Use do {} while(0) loop to avoid goto statement (early exit) do { @@ -1673,7 +1673,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( EB_U32 tempOffset; const EB_U8 *contextIndexMapPtr; EB_U8 *bitsPtr; - + if ( subSetIndex == lastScanSet ) { absCoeff[ 0 ] = linearCoeffBufferPtr[ scanPosLast ]; @@ -1697,12 +1697,12 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( scanPosSig = subPosition + 15; sigMap <<= 16; } - + if (subSetIndex == 0) { subPosition2 = 1; } - + if (logBlockSize == 2) { tempOffset = 0; @@ -1714,7 +1714,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( tempOffset += (!isChroma && subSetIndex != 0 ) ? 3 : 0; contextIndexMapPtr = contextIndexMap8[ scanIndex != SCAN_DIAG2 ][ 0 ] - subPosition; } - + bitsPtr = CabacCost->CabacBitsSig + 2 * significantFlagContextOffset; bitsPtr += 2 * tempOffset; @@ -1723,9 +1723,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( { EB_U32 sigContextIndex; EB_S32 sigCoeffFlag = sigMap < 0; - + sigContextIndex = contextIndexMapPtr[ scanPosSig ]; - + // Add bits for sig_coeff_flag coeffBits += bitsPtr[2 * sigContextIndex + sigCoeffFlag]; @@ -1738,11 +1738,11 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( sigMap <<= 1; scanPosSig--; } - + if (scanPosSig == 0) { EB_S32 sigCoeffFlag = sigMap < 0; - + coeffBits += CabacCost->CabacBitsSig[ 2 * significantFlagContextOffset + sigCoeffFlag ]; if (sigCoeffFlag) @@ -1753,18 +1753,18 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } while (0); - + // 3. Coefficient level values - + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - + { - coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) - } + coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) + } if (greaterThan1Map[subSetIndex] == 0) { @@ -1774,7 +1774,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } continue; } - + // Loop over coefficients until base value of Exp-Golomb coding changes // Base value changes after either // - 8th coefficient @@ -1783,14 +1783,14 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( { EB_S32 absVal = absCoeff[ index ]; EB_U32 symbolValue = absVal > 1; - + // Add bits for coeff_abs_level_greater1_flag coeffBits += CabacCost->CabacBitsG1[2*(contextOffset+contextOffset1) + symbolValue]; - + if (symbolValue) { symbolValue = absVal > 2; - + // Add bits for coeff_abs_level_greater2_flag coeffBits += CabacCost->CabacBitsG2[2*(contextOffset2) + symbolValue]; @@ -1799,31 +1799,31 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( // Golomb Rice parameter is known to be 0 here coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 3, 0); } - + index++; // Exit loop early as remaining coefficients are coded differently break; } } - + // Loop over coefficients after first one that was > 1 but before 8th one // Base value is know to be equal to 2 for ( ; index < numCoeffWithCodedGt1Flag; index++) { EB_S32 absVal = absCoeff[ index ]; EB_U32 symbolValue = absVal > 1; - + // Add bits for >1 flag coeffBits += CabacCost->CabacBitsG1[2*contextOffset + symbolValue]; if (symbolValue) { coeffBits += RemainingCoeffExponentialGolombCodeTemp(absVal - 2, golombRiceParam); - + } } - + // Loop over remaining coefficients (8th and beyond) // Base value is known to be equal to 1 for ( ; index < numNonZero; index++ ) @@ -1834,9 +1834,9 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( } } while (--subSetIndex >= 0); - + // Add local bit counter to global bit counter *coeffBitsLong += coeffBits << 10; - + return return_error; } diff --git a/Source/Lib/Codec/EbComputeMean.h b/Source/Lib/Codec/EbComputeMean.h index e80631fad..8f19f3c29 100644 --- a/Source/Lib/Codec/EbComputeMean.h +++ b/Source/Lib/Codec/EbComputeMean.h @@ -27,7 +27,7 @@ static const EB_COMPUTE_MEAN_FUNC ComputeMeanFunc[2][EB_ASM_TYPE_TOTAL] = { // C_DEFAULT ComputeMean, // AVX2 - ComputeMean8x8_AVX2_INTRIN + ComputeMean8x8_AVX2_INTRIN }, { // C_DEFAULT diff --git a/Source/Lib/Codec/EbComputeSAD.h b/Source/Lib/Codec/EbComputeSAD.h index e8311a801..813afeb06 100644 --- a/Source/Lib/Codec/EbComputeSAD.h +++ b/Source/Lib/Codec/EbComputeSAD.h @@ -60,13 +60,13 @@ extern "C" { typedef EB_U32(*EB_COMPUTE8X4SAD_TYPE)( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr + EB_U8 *ref, // input parameter, reference samples Ptr EB_U32 refStride); // input parameter, reference stride typedef EB_U32(*EB_COMPUTE8X8SAD_TYPE)( EB_U8 *src, // input parameter, source samples Ptr EB_U32 srcStride, // input parameter, source stride - EB_U8 *ref, // input parameter, reference samples Ptr + EB_U8 *ref, // input parameter, reference samples Ptr EB_U32 refStride); // input parameter, reference stride typedef void(*EB_GETEIGHTSAD8x8)( @@ -110,12 +110,12 @@ extern "C" { { /*0 4xM */ Compute4xMSad_SSE2_INTRIN, /*1 8xM */ Compute8xMSad_SSE2_INTRIN, - /*2 16xM */ Compute16xMSad_SSE2_INTRIN,//Compute16xMSad_AVX2_INTRIN is slower than the SSE2 version - /*3 24xM */ Compute24xMSad_AVX2_INTRIN, - /*4 32xM */ Compute32xMSad_AVX2_INTRIN, + /*2 16xM */ Compute16xMSad_SSE2_INTRIN,//Compute16xMSad_AVX2_INTRIN is slower than the SSE2 version + /*3 24xM */ Compute24xMSad_AVX2_INTRIN, + /*4 32xM */ Compute32xMSad_AVX2_INTRIN, /*5 40xM */ Compute40xMSad_AVX2_INTRIN, - /*6 48xM */ Compute48xMSad_AVX2_INTRIN, - /*7 56xM */ Compute56xMSad_AVX2_INTRIN, + /*6 48xM */ Compute48xMSad_AVX2_INTRIN, + /*7 56xM */ Compute56xMSad_AVX2_INTRIN, /*8 64xM */ Compute64xMSad_AVX2_INTRIN, }, }; diff --git a/Source/Lib/Codec/EbDeblockingFilter.c b/Source/Lib/Codec/EbDeblockingFilter.c index 351544963..f8a207260 100644 --- a/Source/Lib/Codec/EbDeblockingFilter.c +++ b/Source/Lib/Codec/EbDeblockingFilter.c @@ -29,40 +29,40 @@ const EB_U8 TcTable_8x8[54] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 24 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 24 }; const EB_S32 BetaTable_8x8[52] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }; void EncodePassUpdateSaoNeighborArrays( - NeighborArrayUnit_t *saoParamNeighborArray, - SaoParameters_t *saoParams, - EB_U32 originX, - EB_U32 originY, - EB_U32 size); + NeighborArrayUnit_t *saoParamNeighborArray, + SaoParameters_t *saoParams, + EB_U32 originX, + EB_U32 originY, + EB_U32 size); /** setQpArrayBasedOnCU() is used to set qp in the qpArray on a CU basis. */ void SetQpArrayBasedOnCU( - PictureControlSet_t *pictureControlSetPtr, //input parameter - EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU - EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU - EB_U32 cuSizeInMinCuSize, //input parameter - EB_U32 cuQp) //input parameter, Qp of the CU + PictureControlSet_t *pictureControlSetPtr, //input parameter + EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU + EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU + EB_U32 cuSizeInMinCuSize, //input parameter + EB_U32 cuQp) //input parameter, Qp of the CU { - EB_U32 verticalIdx; - EB_U32 qpArrayIdx = (cuPos_y / MIN_CU_SIZE) * pictureControlSetPtr->qpArrayStride + (cuPos_x / MIN_CU_SIZE); + EB_U32 verticalIdx; + EB_U32 qpArrayIdx = (cuPos_y / MIN_CU_SIZE) * pictureControlSetPtr->qpArrayStride + (cuPos_x / MIN_CU_SIZE); - for (verticalIdx = 0; verticalIdx < cuSizeInMinCuSize; ++verticalIdx) { - EB_MEMSET(pictureControlSetPtr->qpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, - cuQp, sizeof(EB_U8)*cuSizeInMinCuSize); - } + for (verticalIdx = 0; verticalIdx < cuSizeInMinCuSize; ++verticalIdx) { + EB_MEMSET(pictureControlSetPtr->qpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, + cuQp, sizeof(EB_U8)*cuSizeInMinCuSize); + } - return; + return; } @@ -70,368 +70,368 @@ void SetQpArrayBasedOnCU( is used to set qp in the qpArray on a CU basis. */ void entropySetQpArrayBasedOnCU( - PictureControlSet_t *pictureControlSetPtr, //input parameter - EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU - EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU - EB_U32 cuWidth, //input parameter - EB_U32 cuHeight, //input parameter - EB_U32 cuQp) //input parameter, Qp of the CU + PictureControlSet_t *pictureControlSetPtr, //input parameter + EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU + EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU + EB_U32 cuWidth, //input parameter + EB_U32 cuHeight, //input parameter + EB_U32 cuQp) //input parameter, Qp of the CU { - EB_U32 verticalIdx; - EB_U32 cuPos_xInMinCuSize = cuPos_x / MIN_CU_SIZE; - EB_U32 cuPos_yInMinCuSize = cuPos_y / MIN_CU_SIZE; - EB_U32 cuWidthInMinCuSize = cuWidth / MIN_CU_SIZE; - EB_U32 cuHeightInMinCuSize = cuHeight / MIN_CU_SIZE; - EB_U32 qpArrayIdx = cuPos_yInMinCuSize * pictureControlSetPtr->qpArrayStride + cuPos_xInMinCuSize; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - (cuPos_x % MIN_CU_SIZE == 0 && cuPos_y % MIN_CU_SIZE == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR4); - - CHECK_REPORT_ERROR( - (cuWidth % MIN_CU_SIZE == 0 && cuHeight % MIN_CU_SIZE == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR4); - for (verticalIdx = 0; verticalIdx < cuHeightInMinCuSize; ++verticalIdx) { - EB_MEMSET(pictureControlSetPtr->entropyQpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, - cuQp, sizeof(EB_U8)*cuWidthInMinCuSize); - } - - return; + EB_U32 verticalIdx; + EB_U32 cuPos_xInMinCuSize = cuPos_x / MIN_CU_SIZE; + EB_U32 cuPos_yInMinCuSize = cuPos_y / MIN_CU_SIZE; + EB_U32 cuWidthInMinCuSize = cuWidth / MIN_CU_SIZE; + EB_U32 cuHeightInMinCuSize = cuHeight / MIN_CU_SIZE; + EB_U32 qpArrayIdx = cuPos_yInMinCuSize * pictureControlSetPtr->qpArrayStride + cuPos_xInMinCuSize; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + (cuPos_x % MIN_CU_SIZE == 0 && cuPos_y % MIN_CU_SIZE == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR4); + + CHECK_REPORT_ERROR( + (cuWidth % MIN_CU_SIZE == 0 && cuHeight % MIN_CU_SIZE == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR4); + for (verticalIdx = 0; verticalIdx < cuHeightInMinCuSize; ++verticalIdx) { + EB_MEMSET(pictureControlSetPtr->entropyQpArray + qpArrayIdx + verticalIdx * pictureControlSetPtr->qpArrayStride, + cuQp, sizeof(EB_U8)*cuWidthInMinCuSize); + } + + return; } /** CalculateBSForPUBoundary() is used to calulate the bS for a particular(horizontal/vertical) edge of a 4x4 block on the PU boundary. */ EB_U8 CalculateBSForPUBoundary( - EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. - PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. - PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. - EB_MODETYPE puCodingMode, - EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, //input parameter - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) //input parameter + EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. + PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. + PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. + EB_MODETYPE puCodingMode, + EB_MODETYPE neighbourPuCodingMode, + EB_BOOL isVerticalEdge, //input parameter + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) //input parameter { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - EB_BOOL bSDeterminationCondition1; - EB_BOOL bSDeterminationCondition2; - EB_BOOL bSDeterminationCondition3; - EB_PICTURE sliceType; - EB_U64 puRefList0POC; - EB_U64 puRefList1POC; - EB_U64 neighborPuRefList0POC; - EB_U64 neighborPuRefList1POC; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - sliceType = pictureControlSetPtr->sliceType; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - switch (sliceType) { - case EB_P_PICTURE: - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - // different number of motion vectors or difference reference pictures - bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); - - // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition3 = (EB_BOOL)(( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); - - break; - - case EB_B_PICTURE: - switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { - case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - break; - case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - - break; - case 2: // BI_PRED + UNI_PRED_LIST_0 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1)); - - break; - case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - - break; - case 5: // BI_PRED + UNI_PRED_LIST_1 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 6: // UNI_PRED_LIST_0 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 7: // UNI_PRED_LIST_1 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 8: // BI_PRED + BI_PRED - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && - (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - - bSDeterminationCondition1 = (EB_BOOL)( - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)) && - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0))); - } - else { - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - } - else { - if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - } - else { - bSDeterminationCondition1 = EB_TRUE; - } - } - } - - break; - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR2); - bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! - break; - } - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); - - break; - - case EB_I_PICTURE: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR3); - break; - - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR5); - break; - } - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + EB_BOOL bSDeterminationCondition1; + EB_BOOL bSDeterminationCondition2; + EB_BOOL bSDeterminationCondition3; + EB_PICTURE sliceType; + EB_U64 puRefList0POC; + EB_U64 puRefList1POC; + EB_U64 neighborPuRefList0POC; + EB_U64 neighborPuRefList1POC; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + sliceType = pictureControlSetPtr->sliceType; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + switch (sliceType) { + case EB_P_PICTURE: + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + // different number of motion vectors or difference reference pictures + bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); + + // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition3 = (EB_BOOL)(( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); + + break; + + case EB_B_PICTURE: + switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { + case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + break; + case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + + break; + case 2: // BI_PRED + UNI_PRED_LIST_0 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1)); + + break; + case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + + break; + case 5: // BI_PRED + UNI_PRED_LIST_1 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 6: // UNI_PRED_LIST_0 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 7: // UNI_PRED_LIST_1 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 8: // BI_PRED + BI_PRED + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && + (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + + bSDeterminationCondition1 = (EB_BOOL)( + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)) && + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0))); + } + else { + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + } + else { + if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + } + else { + bSDeterminationCondition1 = EB_TRUE; + } + } + } + + break; + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR2); + bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! + break; + } + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); + + break; + + case EB_I_PICTURE: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR3); + break; + + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR5); + break; + } + } + + return bS; } void SetBSArrayBasedOnPUBoundary( - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - PredictionUnit_t *puPtr, - CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + PredictionUnit_t *puPtr, + CodingUnit_t *cuPtr, + const CodedUnitStats_t *cuStatsPtr, + EB_U32 tbOriginX, + EB_U32 tbOriginY, EB_BOOL tileLeftBoundary, EB_BOOL tileTopBoundary, - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - - // MV Uint - MvUnit_t *mvUnitPtr; - - // 4x4 block - EB_U32 puTopLeft4x4blkAddr = (cuStatsPtr->originX >> 2) + ((cuStatsPtr->originY >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (cuStatsPtr->size >> 2) - 1; - EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((cuStatsPtr->size >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; - EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block - EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block - // PU - //PredictionUnit_t *neighbourPuPtrOLD; - PredictionUnit_t neighbourPu; - EB_MODETYPE neighbourPuMode; - EB_U32 neighborPuIdx; - - // set bS for the horizontal PU boundary which lies on the 8 sample edge - //if ((cuStatsPtr->originY & 7) == 0 && cuStatsPtr->originY + tbOriginY != 0) { - if ((cuStatsPtr->originY & 7) == 0 && !tileTopBoundary) { - - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { - - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; - - neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; - - horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForPUBoundary( - tbOriginX + blk4x4Pos_x, // to be modified - tbOriginY + blk4x4Pos_y, // to be modified - puPtr, - &neighbourPu, - (EB_MODETYPE)cuPtr->predictionModeFlag, - neighbourPuMode, - EB_FALSE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - // set bS for the vertical PU boundary which lies on the 8 sample edge - //if ((cuStatsPtr->originX & 7) == 0 && cuStatsPtr->originX + tbOriginX != 0) { - if ((cuStatsPtr->originX & 7) == 0 && !tileLeftBoundary) { - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; - - - neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; - - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForPUBoundary( - tbOriginX + blk4x4Pos_x, // to be modified - tbOriginY + blk4x4Pos_y, // to be modified - puPtr, - &neighbourPu, - (EB_MODETYPE)cuPtr->predictionModeFlag, - neighbourPuMode, - EB_TRUE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + + // MV Uint + MvUnit_t *mvUnitPtr; + + // 4x4 block + EB_U32 puTopLeft4x4blkAddr = (cuStatsPtr->originX >> 2) + ((cuStatsPtr->originY >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (cuStatsPtr->size >> 2) - 1; + EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((cuStatsPtr->size >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; + EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block + EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block + // PU + //PredictionUnit_t *neighbourPuPtrOLD; + PredictionUnit_t neighbourPu; + EB_MODETYPE neighbourPuMode; + EB_U32 neighborPuIdx; + + // set bS for the horizontal PU boundary which lies on the 8 sample edge + //if ((cuStatsPtr->originY & 7) == 0 && cuStatsPtr->originY + tbOriginY != 0) { + if ((cuStatsPtr->originY & 7) == 0 && !tileTopBoundary) { + + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { + + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; + + neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + + horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForPUBoundary( + tbOriginX + blk4x4Pos_x, // to be modified + tbOriginY + blk4x4Pos_y, // to be modified + puPtr, + &neighbourPu, + (EB_MODETYPE)cuPtr->predictionModeFlag, + neighbourPuMode, + EB_FALSE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + // set bS for the vertical PU boundary which lies on the 8 sample edge + //if ((cuStatsPtr->originX & 7) == 0 && cuStatsPtr->originX + tbOriginX != 0) { + if ((cuStatsPtr->originX & 7) == 0 && !tileLeftBoundary) { + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; + + + neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForPUBoundary( + tbOriginX + blk4x4Pos_x, // to be modified + tbOriginY + blk4x4Pos_y, // to be modified + puPtr, + &neighbourPu, + (EB_MODETYPE)cuPtr->predictionModeFlag, + neighbourPuMode, + EB_TRUE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } /** CalculateBSForTUBoundaryInsidePU() @@ -439,29 +439,29 @@ is used to calulate the bS for a particular(horizontal/vertical) edge of a 4x4 b TU boundary which lays inside a PU. */ static inline EB_U8 CalculateBSForTUBoundaryInsidePU( - EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. - EB_BOOL isVerticalEdge, //input paramter - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) + EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. + EB_BOOL isVerticalEdge, //input paramter + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (cuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (cuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; + } + + return bS; } /** SetBSArrayBasedOnTUBoundary() @@ -470,462 +470,462 @@ is used to calulate the bS on TU boundary. Note - This implementation is based on the assumption that the TU can never go across the PU. */ void SetBSArrayBasedOnTUBoundary( - EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. - EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. - EB_U32 tuWidth, //input parameter - EB_U32 tuHeight, //input parameter - //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. - const CodedUnitStats_t *cuStatsPtr, - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. - EB_U32 tbOriginX, - EB_U32 tbOriginY, - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. + EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. + EB_U32 tuWidth, //input parameter + EB_U32 tuHeight, //input parameter + //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. + const CodedUnitStats_t *cuStatsPtr, + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. + EB_U32 tbOriginX, + EB_U32 tbOriginY, + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; - EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; - EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; + EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; + EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; - //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU + //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU if ((tuPos_y & 7) == 0 && tuPos_y != 0 && tuPos_y != tbOriginY + cuStatsPtr->originY) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { - horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_FALSE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { + horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_FALSE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU if ((tuPos_x & 7) == 0 && tuPos_x != 0 && tuPos_x != tbOriginX + cuStatsPtr->originX) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_TRUE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_TRUE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } EB_U8 Intra4x4CalculateBSForPUBoundary( - EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. - PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. - PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. - EB_MODETYPE puCodingMode, - EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, //input parameter - EB_BOOL isVerticalPuBoundaryAlsoTuBoundary, //input parameter - EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary, - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) //input parameter + EB_U32 blk4x4Pos_x, //input parameter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input parameter, picture-wise vertical location of the 4x4 block. + PredictionUnit_t *puPtr, //input parameter, the pointer to the PU where the 4x4 block belongs to. + PredictionUnit_t *neighbourPuPtr, //input parameter, neighbourPuPtr is the pointer to the left/top neighbour PU of the 4x4 block. + EB_MODETYPE puCodingMode, + EB_MODETYPE neighbourPuCodingMode, + EB_BOOL isVerticalEdge, //input parameter + EB_BOOL isVerticalPuBoundaryAlsoTuBoundary, //input parameter + EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary, + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) //input parameter { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - EB_BOOL bSDeterminationCondition1; - EB_BOOL bSDeterminationCondition2; - EB_BOOL bSDeterminationCondition3; - EB_BOOL isTuBoundary = isVerticalEdge ? isVerticalPuBoundaryAlsoTuBoundary : isHorizontalPuBoundaryAlsoTuBoundary; - EB_PICTURE sliceType; - EB_U64 puRefList0POC; - EB_U64 puRefList1POC; - EB_U64 neighborPuRefList0POC; - EB_U64 neighborPuRefList1POC; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - sliceType = pictureControlSetPtr->sliceType; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - switch (sliceType) { - case EB_P_PICTURE: - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - // different number of motion vectors or difference reference pictures - bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); - - // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition3 = (EB_BOOL)(isTuBoundary && ( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); - - break; - - case EB_B_PICTURE: - switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { - case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0)); - - break; - case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList0POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - - break; - case 2: // BI_PRED + UNI_PRED_LIST_0 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList0POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1)); - - break; - case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - bSDeterminationCondition1 = (EB_BOOL)( - (puRefList1POC != neighborPuRefList1POC) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - - break; - case 5: // BI_PRED + UNI_PRED_LIST_1 - bSDeterminationCondition1 = EB_TRUE; - - break; - case 6: // UNI_PRED_LIST_0 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 7: // UNI_PRED_LIST_1 + BI_PRED - bSDeterminationCondition1 = EB_TRUE; - - break; - case 8: // BI_PRED + BI_PRED - puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; - puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; - - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && - (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - - bSDeterminationCondition1 = (EB_BOOL)( - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)) && - (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0))); - } - else { - if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_0) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_1)); - } - else { - if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { - bSDeterminationCondition1 = (EB_BOOL)( - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_0, - REF_LIST_1) || - CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( - puPtr, - neighbourPuPtr, - REF_LIST_1, - REF_LIST_0)); - } - else { - bSDeterminationCondition1 = EB_TRUE; - } - } - } - - break; - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR2); - bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! - break; - } - - // in non-zero luma TU, bS = 1 - bSDeterminationCondition2 = (EB_BOOL)(isTuBoundary && ( - pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); - - bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); - - break; - - case EB_I_PICTURE: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR3); - break; - - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR5); - break; - } - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + EB_BOOL bSDeterminationCondition1; + EB_BOOL bSDeterminationCondition2; + EB_BOOL bSDeterminationCondition3; + EB_BOOL isTuBoundary = isVerticalEdge ? isVerticalPuBoundaryAlsoTuBoundary : isHorizontalPuBoundaryAlsoTuBoundary; + EB_PICTURE sliceType; + EB_U64 puRefList0POC; + EB_U64 puRefList1POC; + EB_U64 neighborPuRefList0POC; + EB_U64 neighborPuRefList1POC; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + sliceType = pictureControlSetPtr->sliceType; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (puCodingMode == INTRA_MODE || neighbourPuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + switch (sliceType) { + case EB_P_PICTURE: + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + // different number of motion vectors or difference reference pictures + bSDeterminationCondition1 = (EB_BOOL)(puRefList0POC != neighborPuRefList0POC); + + // if the difference of the horizontal or vertical components of MV >= 4 quater luma pixel, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition3 = (EB_BOOL)(isTuBoundary && ( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2 | bSDeterminationCondition3); + + break; + + case EB_B_PICTURE: + switch (puPtr->interPredDirectionIndex + ((neighbourPuPtr->interPredDirectionIndex) * 3)) { + case 0: // UNI_PRED_LIST_0 + UNI_PRED_LIST_0 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0)); + + break; + case 1: // UNI_PRED_LIST_1 + UNI_PRED_LIST_0 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList0POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + + break; + case 2: // BI_PRED + UNI_PRED_LIST_0 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 3: // UNI_PRED_LIST_0 + UNI_PRED_LIST_1 + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList0POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1)); + + break; + case 4: // UNI_PRED_LIST_1 + UNI_PRED_LIST_1 + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + bSDeterminationCondition1 = (EB_BOOL)( + (puRefList1POC != neighborPuRefList1POC) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + + break; + case 5: // BI_PRED + UNI_PRED_LIST_1 + bSDeterminationCondition1 = EB_TRUE; + + break; + case 6: // UNI_PRED_LIST_0 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 7: // UNI_PRED_LIST_1 + BI_PRED + bSDeterminationCondition1 = EB_TRUE; + + break; + case 8: // BI_PRED + BI_PRED + puRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + neighborPuRefList0POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr)->refPOC; + puRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + neighborPuRefList1POC = ((EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr)->refPOC; + + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC) && + (puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + + bSDeterminationCondition1 = (EB_BOOL)( + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)) && + (CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0))); + } + else { + if ((puRefList0POC == neighborPuRefList0POC) && (puRefList1POC == neighborPuRefList1POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_0) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_1)); + } + else { + if ((puRefList0POC == neighborPuRefList1POC) && (puRefList1POC == neighborPuRefList0POC)) { + bSDeterminationCondition1 = (EB_BOOL)( + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_0, + REF_LIST_1) || + CHECK_MV_COMPONENT_EQUAL_OR_GREATER_THAN_4( + puPtr, + neighbourPuPtr, + REF_LIST_1, + REF_LIST_0)); + } + else { + bSDeterminationCondition1 = EB_TRUE; + } + } + } + + break; + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR2); + bSDeterminationCondition1 = EB_FALSE; // junk code to avoid compiling warning! + break; + } + + // in non-zero luma TU, bS = 1 + bSDeterminationCondition2 = (EB_BOOL)(isTuBoundary && ( + pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)])); + + bS = (EB_U8)(bSDeterminationCondition1 | bSDeterminationCondition2); + + break; + + case EB_I_PICTURE: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR3); + break; + + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR5); + break; + } + } + + return bS; } static inline EB_U8 Intra4x4CalculateBSForTUBoundaryInsidePU( - EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. - EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. - EB_BOOL isVerticalEdge, //input paramter - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) + EB_U32 blk4x4Pos_x, //input paramter, picture-wise horizontal location of the 4x4 block. + EB_U32 blk4x4Pos_y, //input paramter, picture-wise vertical location of the 4x4 block. + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the 4x4 block belongs to. + EB_BOOL isVerticalEdge, //input paramter + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) { - EB_U8 bS = 0; - EB_U32 blk4x4PosNeighbourX; - EB_U32 blk4x4PosNeighbourY; - - blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; - blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; - - if (cuCodingMode == INTRA_MODE) { - bS = 2; - } - else { - bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || - pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; - } - - return bS; + EB_U8 bS = 0; + EB_U32 blk4x4PosNeighbourX; + EB_U32 blk4x4PosNeighbourY; + + blk4x4PosNeighbourX = isVerticalEdge ? blk4x4Pos_x - 4 : blk4x4Pos_x; + blk4x4PosNeighbourY = isVerticalEdge ? blk4x4Pos_y : blk4x4Pos_y - 4; + + if (cuCodingMode == INTRA_MODE) { + bS = 2; + } + else { + bS = pictureControlSetPtr->cbfMapArray[(blk4x4Pos_x >> 2) + (blk4x4Pos_y >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)] || + pictureControlSetPtr->cbfMapArray[(blk4x4PosNeighbourX >> 2) + (blk4x4PosNeighbourY >> 2) *(sequenceControlSetPtr->lumaWidth >> 2)]; + } + + return bS; } void Intra4x4SetBSArrayBasedOnTUBoundary( - EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. - EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. - EB_U32 tuWidth, //input parameter - EB_U32 tuHeight, //input parameter - EB_BOOL isHorizontalTuBoundaryAlsoPuBoundary, //input parameter - EB_BOOL isVerticalTuBoundaryAlsoPuBoundary, //input parameter - //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. - const CodedUnitStats_t *cuStatsPtr, - EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. - EB_U32 tbOriginX, - EB_U32 tbOriginY, - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + EB_U32 tuPos_x, //input parameter, the picture-wise horizontal location of a TU. + EB_U32 tuPos_y, //input parameter, the picture-wise vertical location of a TU. + EB_U32 tuWidth, //input parameter + EB_U32 tuHeight, //input parameter + EB_BOOL isHorizontalTuBoundaryAlsoPuBoundary, //input parameter + EB_BOOL isVerticalTuBoundaryAlsoPuBoundary, //input parameter + //CodingUnit_t *cuPtr, //input parameter, pointer to the CU where the TU belongs to. + const CodedUnitStats_t *cuStatsPtr, + EB_MODETYPE cuCodingMode, //input paramter, the coding mode of the CU where the TU belongs to. + EB_U32 tbOriginX, + EB_U32 tbOriginY, + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; - - EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; - EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; - - //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU - if ((tuPos_y & 7) == 0 && tuPos_y != 0 && tuPos_y != tbOriginY + cuStatsPtr->originY && !isHorizontalTuBoundaryAlsoPuBoundary) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { - horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = Intra4x4CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_FALSE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU - if ((tuPos_x & 7) == 0 && tuPos_x != 0 && tuPos_x != tbOriginX + cuStatsPtr->originX && !isVerticalTuBoundaryAlsoPuBoundary) { - for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = Intra4x4CalculateBSForTUBoundaryInsidePU( - tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), - tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), - cuCodingMode, - EB_TRUE, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + + EB_U32 tuTopLeft4x4blkAddr = ((tuPos_x&(lcuSize - 1)) >> 2) + (((tuPos_y&(lcuSize - 1)) >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 tuTopRight4x4blkAddr = tuTopLeft4x4blkAddr + (tuWidth >> 2) - 1; + EB_U32 tuBottomLeft4x4blkAddr = tuTopLeft4x4blkAddr + (((tuHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; + + //set bS for the horizontal TU boundary which lies on the 8 sample edge inside a PU + if ((tuPos_y & 7) == 0 && tuPos_y != 0 && tuPos_y != tbOriginY + cuStatsPtr->originY && !isHorizontalTuBoundaryAlsoPuBoundary) { + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuTopRight4x4blkAddr; ++blk4x4Addr) { + horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = Intra4x4CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_FALSE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + //set bS for the vertical TU boundary which lies on the 8 sample edge inside a PU + if ((tuPos_x & 7) == 0 && tuPos_x != 0 && tuPos_x != tbOriginX + cuStatsPtr->originX && !isVerticalTuBoundaryAlsoPuBoundary) { + for (blk4x4Addr = tuTopLeft4x4blkAddr; blk4x4Addr <= tuBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = Intra4x4CalculateBSForTUBoundaryInsidePU( + tbOriginX + ((blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2), + tbOriginY + ((blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2), + cuCodingMode, + EB_TRUE, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } void Intra4x4SetBSArrayBasedOnPUBoundary( - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - PredictionUnit_t *puPtr, - CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr, - EB_U32 puOriginX, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + PredictionUnit_t *puPtr, + CodingUnit_t *cuPtr, + const CodedUnitStats_t *cuStatsPtr, + EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_BOOL isVerticalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. - EB_BOOL isHorizontalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. - PictureControlSet_t *pictureControlSetPtr, - EB_U8 *horizontalEdgeBSArray, - EB_U8 *verticalEdgeBSArray) + EB_U32 tbOriginY, + EB_BOOL isVerticalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. + EB_BOOL isHorizontalPUBoundaryAlsoPictureBoundary, //input parameter, please refer to the detailed explanation above. + PictureControlSet_t *pictureControlSetPtr, + EB_U8 *horizontalEdgeBSArray, + EB_U8 *verticalEdgeBSArray) { - const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - - - // MV Uint - MvUnit_t *mvUnitPtr; - - // 4x4 block - EB_U32 puTopLeft4x4blkAddr = (puOriginX >> 2) + ((puOriginY >> 2) << logMaxLcuSizeIn4x4blk); - EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (puWidth >> 2) - 1; - EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((puHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); - EB_U32 blk4x4Addr; - EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block - EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block - EB_BOOL isVerticalPuBoundaryAlsoTuBoundary; - EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - // PU - //PredictionUnit_t *neighbourPuPtrOLD; - PredictionUnit_t neighbourPu; - EB_MODETYPE neighbourPuMode; - EB_U32 neighborPuIdx; - - /*CHECK_REPORT_ERROR( - (cuPtr->partitionMode == SIZE_2Nx2N), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR6);*/ - - // set bS for the horizontal PU boundary which lies on the 8 sample edge - if ((puOriginY & 7) == 0 && puOriginY + tbOriginY != 0 && !isHorizontalPUBoundaryAlsoPictureBoundary) { - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { - - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - - if (puOriginY == cuStatsPtr->originY){ - isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - if (puOriginX == cuStatsPtr->originX){ - isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - - CHECK_REPORT_ERROR( - ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR6); - - neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; - - - CHECK_REPORT_ERROR( - (*(modeTypeNeighborArray->topArray + neighborPuIdx) != (EB_U8)INVALID_MODE), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR9); - - neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + const EB_U32 logMinPuSize = Log2f(MIN_PU_SIZE); + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + + + // MV Uint + MvUnit_t *mvUnitPtr; + + // 4x4 block + EB_U32 puTopLeft4x4blkAddr = (puOriginX >> 2) + ((puOriginY >> 2) << logMaxLcuSizeIn4x4blk); + EB_U32 puTopRight4x4blkAddr = puTopLeft4x4blkAddr + (puWidth >> 2) - 1; + EB_U32 puBottomLeft4x4blkAddr = puTopLeft4x4blkAddr + (((puHeight >> 2) - 1) << logMaxLcuSizeIn4x4blk); + EB_U32 blk4x4Addr; + EB_U32 blk4x4Pos_x; // sample-based LCU-wise horizontal location of the 4x4 block + EB_U32 blk4x4Pos_y; // sample-based LCU-wise vertical location of the 4x4 block + EB_BOOL isVerticalPuBoundaryAlsoTuBoundary; + EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + // PU + //PredictionUnit_t *neighbourPuPtrOLD; + PredictionUnit_t neighbourPu; + EB_MODETYPE neighbourPuMode; + EB_U32 neighborPuIdx; + + /*CHECK_REPORT_ERROR( + (cuPtr->partitionMode == SIZE_2Nx2N), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR6);*/ + + // set bS for the horizontal PU boundary which lies on the 8 sample edge + if ((puOriginY & 7) == 0 && puOriginY + tbOriginY != 0 && !isHorizontalPUBoundaryAlsoPictureBoundary) { + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puTopRight4x4blkAddr; ++blk4x4Addr) { + + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + + if (puOriginY == cuStatsPtr->originY){ + isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + if (puOriginX == cuStatsPtr->originX){ + isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + + CHECK_REPORT_ERROR( + ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR6); + + neighborPuIdx = (tbOriginX + blk4x4Pos_x) >> logMinPuSize; + + + CHECK_REPORT_ERROR( + (*(modeTypeNeighborArray->topArray + neighborPuIdx) != (EB_U8)INVALID_MODE), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR9); + + neighbourPuMode = *(modeTypeNeighborArray->topArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->topArray) + neighborPuIdx; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] = Intra4x4CalculateBSForPUBoundary( @@ -940,63 +940,63 @@ void Intra4x4SetBSArrayBasedOnPUBoundary( EB_FALSE, pictureControlSetPtr, sequenceControlSetPtr); - } - } - - // set bS for the vertical PU boundary which lies on the 8 sample edge - if ((puOriginX & 7) == 0 && puOriginX + tbOriginX != 0 && !isVerticalPUBoundaryAlsoPictureBoundary) { - for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { - blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; - blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; - - if (puOriginY == cuStatsPtr->originY){ - isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - if (puOriginX == cuStatsPtr->originX){ - isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; - } - else{ - isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; - } - - CHECK_REPORT_ERROR( - ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR6); - - neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; - - CHECK_REPORT_ERROR( - (*(modeTypeNeighborArray->leftArray + neighborPuIdx) != (EB_U8)INVALID_MODE), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR9); - - neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); - mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; - neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; - neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; - neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; - - verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] - = Intra4x4CalculateBSForPUBoundary( - tbOriginX + blk4x4Pos_x, // to be modified - tbOriginY + blk4x4Pos_y, // to be modified - puPtr, - &neighbourPu, - (EB_MODETYPE)cuPtr->predictionModeFlag, - neighbourPuMode, - EB_TRUE, - isVerticalPuBoundaryAlsoTuBoundary, - isHorizontalPuBoundaryAlsoTuBoundary, - pictureControlSetPtr, - sequenceControlSetPtr); - } - } - - return; + } + } + + // set bS for the vertical PU boundary which lies on the 8 sample edge + if ((puOriginX & 7) == 0 && puOriginX + tbOriginX != 0 && !isVerticalPUBoundaryAlsoPictureBoundary) { + for (blk4x4Addr = puTopLeft4x4blkAddr; blk4x4Addr <= puBottomLeft4x4blkAddr; blk4x4Addr += MaxLcuSizeIn4x4blk) { + blk4x4Pos_x = (blk4x4Addr & (MaxLcuSizeIn4x4blk - 1)) << 2; + blk4x4Pos_y = (blk4x4Addr >> logMaxLcuSizeIn4x4blk) << 2; + + if (puOriginY == cuStatsPtr->originY){ + isHorizontalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isHorizontalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + if (puOriginX == cuStatsPtr->originX){ + isVerticalPuBoundaryAlsoTuBoundary = EB_TRUE; + } + else{ + isVerticalPuBoundaryAlsoTuBoundary = cuPtr->transformUnitArray[0].splitFlag ? EB_TRUE : EB_FALSE; + } + + CHECK_REPORT_ERROR( + ((blk4x4Pos_x == puOriginX) || (blk4x4Pos_y == puOriginY)), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR6); + + neighborPuIdx = (tbOriginY + blk4x4Pos_y) >> logMinPuSize; + + CHECK_REPORT_ERROR( + (*(modeTypeNeighborArray->leftArray + neighborPuIdx) != (EB_U8)INVALID_MODE), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR9); + + neighbourPuMode = *(modeTypeNeighborArray->leftArray + neighborPuIdx); + mvUnitPtr = (MvUnit_t*)(mvNeighborArray->leftArray) + neighborPuIdx /** neighborArrays->mv->unitSize*/; + neighbourPu.interPredDirectionIndex = mvUnitPtr->predDirection; + neighbourPu.mv[REF_LIST_0].mvUnion = mvUnitPtr->mv[REF_LIST_0].mvUnion; + neighbourPu.mv[REF_LIST_1].mvUnion = mvUnitPtr->mv[REF_LIST_1].mvUnion; + + verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)] + = Intra4x4CalculateBSForPUBoundary( + tbOriginX + blk4x4Pos_x, // to be modified + tbOriginY + blk4x4Pos_y, // to be modified + puPtr, + &neighbourPu, + (EB_MODETYPE)cuPtr->predictionModeFlag, + neighbourPuMode, + EB_TRUE, + isVerticalPuBoundaryAlsoTuBoundary, + isHorizontalPuBoundaryAlsoTuBoundary, + pictureControlSetPtr, + sequenceControlSetPtr); + } + } + + return; } @@ -1025,373 +1025,373 @@ centerSamplePos_y is the picutre-wise vertical location of the start sample of e reconPictureControlSet is the pointer to the PictureControlSet of the reconstructed picture */ static void Luma8x8blkDLFCore( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. - EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. - EB_U8 bSEdgeA, //please refer to the detailed explantion above. - EB_U8 bSEdgeB, //please refer to the detailed explantion above. - EB_U8 bSEdgeC, //please refer to the detailed explantion above. - EB_U8 bSEdgeD, //please refer to the detailed explantion above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. + EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. + EB_U8 bSEdgeA, //please refer to the detailed explantion above. + EB_U8 bSEdgeB, //please refer to the detailed explantion above. + EB_U8 bSEdgeC, //please refer to the detailed explantion above. + EB_U8 bSEdgeD, //please refer to the detailed explantion above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. { - EB_U32 curCuQp; - EB_BYTE edgeStartFilteredSamplePtr; - EB_U32 neighbourCuQp; - EB_S32 CUqpIndex; - EB_U32 Qp; - EB_U32 Tc; - EB_S32 Beta; - //EB_BOOL PCMFlagArray[2]; - - //vertical edge A filtering - if (bSEdgeA > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset )]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - } - - //vertical edge C filtering - if (bSEdgeC > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - } - - //horizontal edge B filtering - if (bSEdgeB > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - //horizontal edge D filtering - if (bSEdgeD > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - return; + EB_U32 curCuQp; + EB_BYTE edgeStartFilteredSamplePtr; + EB_U32 neighbourCuQp; + EB_S32 CUqpIndex; + EB_U32 Qp; + EB_U32 Tc; + EB_S32 Beta; + //EB_BOOL PCMFlagArray[2]; + + //vertical edge A filtering + if (bSEdgeA > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset )]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + } + + //vertical edge C filtering + if (bSEdgeC > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + } + + //horizontal edge B filtering + if (bSEdgeB > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + //horizontal edge D filtering + if (bSEdgeD > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + return; } void Luma8x8blkDLFCore16bit( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. - EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. - EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. - EB_U8 bSEdgeA, //please refer to the detailed explantion above. - EB_U8 bSEdgeB, //please refer to the detailed explantion above. - EB_U8 bSEdgeC, //please refer to the detailed explantion above. - EB_U8 bSEdgeD, //please refer to the detailed explantion above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explantion above. + EB_U32 reconLumaPicStride, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_x, //please refer to the detailed explantion above. + EB_U32 centerSamplePos_y, //please refer to the detailed explantion above. + EB_U8 bSEdgeA, //please refer to the detailed explantion above. + EB_U8 bSEdgeB, //please refer to the detailed explantion above. + EB_U8 bSEdgeC, //please refer to the detailed explantion above. + EB_U8 bSEdgeD, //please refer to the detailed explantion above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explantion above. { - EB_U32 curCuQp; - EB_U32 neighbourCuQp; - EB_S32 CUqpIndex; - EB_U32 Qp; - EB_U32 Tc; - EB_S32 Beta; - EB_U16 *edgeStartFilteredSamplePtr; - //EB_BOOL PCMFlagArray[2]; - - //vertical edge A filtering - if (bSEdgeA > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - } - - //vertical edge C filtering - if (bSEdgeC > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_TRUE, - Tc, - Beta); - //PCMFlagArray); - } - - //horizontal edge B filtering - if (bSEdgeB > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - //horizontal edge D filtering - if (bSEdgeD > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - Tc = Tc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; - - // luma 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconLumaPicStride, - EB_FALSE, - Tc, - Beta); - } - - return; + EB_U32 curCuQp; + EB_U32 neighbourCuQp; + EB_S32 CUqpIndex; + EB_U32 Qp; + EB_U32 Tc; + EB_S32 Beta; + EB_U16 *edgeStartFilteredSamplePtr; + //EB_BOOL PCMFlagArray[2]; + + //vertical edge A filtering + if (bSEdgeA > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeA > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + (centerSamplePos_y - 4) * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + } + + //vertical edge C filtering + if (bSEdgeC > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeC > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_TRUE, + Tc, + Beta); + //PCMFlagArray); + } + + //horizontal edge B filtering + if (bSEdgeB > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeB > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + (centerSamplePos_x - 4); + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + //horizontal edge D filtering + if (bSEdgeD > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + Tc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bSEdgeD > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + Tc = Tc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + centerSamplePos_y * reconLumaPicStride + centerSamplePos_x; + + // luma 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconLumaPicStride, + EB_FALSE, + Tc, + Beta); + } + + return; } /** chroma8x8blkDLFCore() @@ -1423,835 +1423,835 @@ bSEdgeDArray[0] - bS of the left 2 sample of edge D. bSEdgeAArray[1] - bS of the reconPictureControlSet is the pointer to the PictureControlSet of the reconstructed picture */ static void chroma8x8blkDLFCore( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. - EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. - EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. + EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. + EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. { - EB_U8 curCuQp; - EB_BYTE edgeStartSampleCb; - EB_BYTE edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; + EB_U8 curCuQp; + EB_BYTE edgeStartSampleCb; + EB_BYTE edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - //vertical edge A filtering - if (bSEdgeAArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + //vertical edge A filtering + if (bSEdgeAArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - - } - if (bSEdgeAArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + + } + if (bSEdgeAArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - - } - - //vertical edge C filtering - if (bSEdgeCArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + + } + + //vertical edge C filtering + if (bSEdgeCArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - } - - if (bSEdgeCArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + } + + if (bSEdgeCArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - } - - //horizontal edge B filtering - if (bSEdgeBArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + } + + //horizontal edge B filtering + if (bSEdgeBArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - if (bSEdgeBArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + if (bSEdgeBArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - //horizontal edge D filtering - if (bSEdgeDArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + //horizontal edge D filtering + if (bSEdgeDArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; - - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - if (bSEdgeDArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; + + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + if (bSEdgeDArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x + 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - - } - - return; + centerSamplePos_x + 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + + } + + return; } static void chroma8x8blkDLFCore16bit( - EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. - EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. - EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. - EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. - EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. - PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. + EbPictureBufferDesc_t *reconPic, //please refer to the detailed explanation above. + EB_U32 reconChromaPicStride, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_x, //please refer to the detailed explanation above. + EB_U32 centerSamplePos_y, //please refer to the detailed explanation above. + EB_U8 *bSEdgeAArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeBArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeCArray, //please refer to the detailed explanation above. + EB_U8 *bSEdgeDArray, //please refer to the detailed explanation above. + PictureControlSet_t *reconPictureControlSet) //please refer to the detailed explanation above. { - EB_U8 curCuQp; - EB_U16 *edgeStartSampleCb; - EB_U16 *edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; + EB_U8 curCuQp; + EB_U16 *edgeStartSampleCb; + EB_U16 *edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - //vertical edge A filtering - if (bSEdgeAArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + //vertical edge A filtering + if (bSEdgeAArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 4, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + centerSamplePos_x - 1, + centerSamplePos_y - 4, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 4) * reconChromaPicStride + centerSamplePos_x; - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - if (bSEdgeAArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + if (bSEdgeAArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y - 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - //vertical edge C filtering - if (bSEdgeCArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y - 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y - 2) * reconChromaPicStride + centerSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + //vertical edge C filtering + if (bSEdgeCArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); - - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - if (bSEdgeCArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); + + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + if (bSEdgeCArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 1, - centerSamplePos_y + 2, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - //horizontal edge B filtering - if (bSEdgeBArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 1, + centerSamplePos_y + 2, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (centerSamplePos_y + 2) * reconChromaPicStride + centerSamplePos_x; + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + //horizontal edge B filtering + if (bSEdgeBArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 4, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 4, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - if (bSEdgeBArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 4, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 4); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + if (bSEdgeBArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x - 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x - 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - //horizontal edge D filtering - if (bSEdgeDArray[0] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x - 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x - 2); + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + //horizontal edge D filtering + if (bSEdgeDArray[0] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; - - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - if (bSEdgeDArray[1] > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + centerSamplePos_x, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - (EB_S32) reconPictureControlSet->qpArrayStride; + + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + centerSamplePos_x; + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + if (bSEdgeDArray[1] > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y, - reconPictureControlSet->qpArrayStride); + centerSamplePos_x + 2, + centerSamplePos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - centerSamplePos_x + 2, - centerSamplePos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconChromaPicStride, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - - return; + centerSamplePos_x + 2, + centerSamplePos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + centerSamplePos_y * reconChromaPicStride + (centerSamplePos_x + 2); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconChromaPicStride, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + + return; } /** LCUInternalAreaDLFCore() is used to apply the deblocking filter in the LCU internal area (excluding the LCU boundary) as the first pass DLF. */ EB_ERRORTYPE LCUInternalAreaDLFCore( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. - PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. + PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. { - EB_ERRORTYPE return_error = EB_ErrorNone; - - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U8 bS; - - // variables for luma componet - EB_U32 blk4x4Addr; - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; - EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; - EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; - EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; - EB_S32 Beta; - - // variables for chroma component - EB_U32 blk2x2Addr; - EB_U32 twoSampleEdgeStartSamplePos_x; - EB_U32 twoSampleEdgeStartSamplePos_y; + EB_ERRORTYPE return_error = EB_ErrorNone; + + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U8 bS; + + // variables for luma componet + EB_U32 blk4x4Addr; + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; + EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; + EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; + EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; + EB_S32 Beta; + + // variables for chroma component + EB_U32 blk2x2Addr; + EB_U32 twoSampleEdgeStartSamplePos_x; + EB_U32 twoSampleEdgeStartSamplePos_y; EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; @@ -2264,247 +2264,247 @@ EB_ERRORTYPE LCUInternalAreaDLFCore( EB_U32 numVerticalChromaSampleEdges = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); EB_U32 numHorizontalChromaSampleEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); EB_U32 num2SampleEdgesPerVerticalChromaSampleEdge = (lcuHeight >> (colorFormat==EB_YUV420?2:1)) - 2 - (((lcuHeight & (colorFormat==EB_YUV420?15:7)) == 0) << 1); - EB_U32 num2SampleEdgesPerHorizontalChromaSampleEdge = (lcuWidth >> (colorFormat==EB_YUV444?1:2)) - 2 - (((lcuWidth & (colorFormat==EB_YUV444?7:15)) == 0) << 1); - EB_U8 curCuQp; - EB_BYTE edgeStartFilteredSamplePtr; - EB_BYTE edgeStartSampleCb; - EB_BYTE edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR8); - - /***** luma component filtering *****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { - // edge B - fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - } - - - /***** chroma component filtering ****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { - twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + EB_U32 num2SampleEdgesPerHorizontalChromaSampleEdge = (lcuWidth >> (colorFormat==EB_YUV444?1:2)) - 2 - (((lcuWidth & (colorFormat==EB_YUV444?7:15)) == 0) << 1); + EB_U8 curCuQp; + EB_BYTE edgeStartFilteredSamplePtr; + EB_BYTE edgeStartSampleCb; + EB_BYTE edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR8); + + /***** luma component filtering *****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { + // edge B + fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + edgeStartFilteredSamplePtr = reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + } + + + /***** chroma component filtering ****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { + twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_TRUE, - cbTc, - crTc); - - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { - twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position - twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_TRUE, + cbTc, + crTc); + + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { + twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position + twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_FALSE, - cbTc, - crTc); - - } - } - } - - return return_error; + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + edgeStartSampleCb = reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_FALSE, + cbTc, + crTc); + + } + } + } + + return return_error; } /** LCUInternalAreaDLFCore16bit() @@ -2512,38 +2512,38 @@ is used to apply the deblocking filter in the LCU internal area (excluding the L as the first pass DLF. */ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. - PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *verticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *horizontalEdgeBSArray, //input parameter, the pointer to the hotizontal edge BS array. + PictureControlSet_t *reconPictureControlSet) //input parameter, picture control set. { - EB_ERRORTYPE return_error = EB_ErrorNone; - - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U8 bS; - - // variables for luma componet - EB_U32 blk4x4Addr; - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; - EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; - EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; - EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; - EB_S32 Beta; - - // variables for chroma component - EB_U32 blk2x2Addr; - EB_U32 twoSampleEdgeStartSamplePos_x; - EB_U32 twoSampleEdgeStartSamplePos_y; + EB_ERRORTYPE return_error = EB_ErrorNone; + + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U8 bS; + + // variables for luma componet + EB_U32 blk4x4Addr; + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U32 numVerticalLumaSampleEdges = (lcuWidth >> 3) - 1; + EB_U32 numHorizontalLumaSampleEdges = (lcuHeight >> 3) - 1; + EB_U32 num4SampleEdgesPerVerticalLumaSampleEdge = (lcuHeight >> 2) - 2; + EB_U32 num4SampleEdgesPerHorizontalLumaSampleEdge = (lcuWidth >> 2) - 2; + EB_S32 Beta; + + // variables for chroma component + EB_U32 blk2x2Addr; + EB_U32 twoSampleEdgeStartSamplePos_x; + EB_U32 twoSampleEdgeStartSamplePos_y; EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; const EB_S32 subWidthC = (colorFormat == EB_YUV444) ? 1 : 2; const EB_S32 subHeightC = (colorFormat == EB_YUV420) ? 2 : 1; @@ -2553,7 +2553,7 @@ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( const EB_S32 subHeightCMinus1 = (colorFormat == EB_YUV420) ? 1 : 0; EB_U32 chromaLcuPos_x = lcuPos_x >> subWidthCMinus1; - EB_U32 chromaLcuPos_y = lcuPos_y >> subHeightCMinus1; + EB_U32 chromaLcuPos_y = lcuPos_y >> subHeightCMinus1; EB_U32 numVerticalChromaSampleEdges = (lcuWidth >> (3 + subWidthCMinus1)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); EB_U32 numHorizontalChromaSampleEdges = (lcuHeight >> (3 + subHeightCMinus1)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); @@ -2562,263 +2562,263 @@ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( - EB_U8 curCuQp; - EB_U16 *edgeStartFilteredSamplePtr; - EB_U16 *edgeStartSampleCb; - EB_U16 *edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR10); - - - /***** luma component filtering *****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - lumaTc = lumaTc << 2; - Beta = Beta << 2; - - edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { - // edge B - fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position - fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y, - reconPictureControlSet->qpArrayStride); - - - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x + lcuPos_x, - fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; - - //CHKN - lumaTc = lumaTc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; - - // 4 sample edge DLF core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconpicture->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - } - - /***** chroma component filtering ****/ - // filter all vertical edges - for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { - for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { - twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position - twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + EB_U8 curCuQp; + EB_U16 *edgeStartFilteredSamplePtr; + EB_U16 *edgeStartSampleCb; + EB_U16 *edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(reconPictureControlSet->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR10); + + + /***** luma component filtering *****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalLumaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num4SampleEdgesPerVerticalLumaSampleEdge; ++verticalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 2; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x - 1, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + lumaTc = lumaTc << 2; + Beta = Beta << 2; + + edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalLumaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num4SampleEdgesPerHorizontalLumaSampleEdge; ++horizontalIdx) { + // edge B + fourSampleEdgeStartSamplePos_x = horizontalIdx << 2; // LCU-wise position + fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y, + reconPictureControlSet->qpArrayStride); + + + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + lcuPos_x, + fourSampleEdgeStartSamplePos_y + lcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + // CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + reconPictureControlSet->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + reconPictureControlSet->betaOffset)]; + + //CHKN + lumaTc = lumaTc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconpicture->bufferY + reconpicture->originX + reconpicture->originY * reconpicture->strideY + (fourSampleEdgeStartSamplePos_y + lcuPos_y) * reconpicture->strideY + fourSampleEdgeStartSamplePos_x + lcuPos_x; + + // 4 sample edge DLF core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconpicture->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + } + + /***** chroma component filtering ****/ + // filter all vertical edges + for (horizontalIdx = 1; horizontalIdx <= numVerticalChromaSampleEdges; ++horizontalIdx) { + for (verticalIdx = 1; verticalIdx <= num2SampleEdgesPerVerticalChromaSampleEdge; ++verticalIdx) { + twoSampleEdgeStartSamplePos_x = horizontalIdx << 3; // LCU-wise position + twoSampleEdgeStartSamplePos_y = (verticalIdx << 1) + 2; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = verticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_TRUE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - } - } - - // filter all horizontal edges - for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { - for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { - twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position - twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, - twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x - 1, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, ((EB_S32)crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_TRUE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + } + } + + // filter all horizontal edges + for (verticalIdx = 1; verticalIdx <= numHorizontalChromaSampleEdges; ++verticalIdx) { + for (horizontalIdx = 1; horizontalIdx <= num2SampleEdgesPerHorizontalChromaSampleEdge; ++horizontalIdx) { + twoSampleEdgeStartSamplePos_x = (horizontalIdx << 1) + 2; // LCU-wise position + twoSampleEdgeStartSamplePos_y = verticalIdx << 3; // LCU-wise position + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + twoSampleEdgeStartSamplePos_x >> subWidthShfitMinus1, + twoSampleEdgeStartSamplePos_y >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = horizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, - reconPictureControlSet->qpArrayStride); + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y, + reconPictureControlSet->qpArrayStride); - curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + curCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, - twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, - reconPictureControlSet->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; - neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; - - //CHKN - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconpicture->strideCb, - EB_FALSE, - cbTc, - crTc); - //chromaPCMFlagArray); - } - } - } - - return return_error; + twoSampleEdgeStartSamplePos_x + chromaLcuPos_x, + twoSampleEdgeStartSamplePos_y + chromaLcuPos_y - 1, + reconPictureControlSet->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)reconPictureControlSet->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - reconPictureControlSet->qpArrayStride; + neighbourCuQp = reconPictureControlSet->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + reconPictureControlSet->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + reconPictureControlSet->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + reconPictureControlSet->tcOffset)]; + + //CHKN + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconpicture->bufferCb + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCb + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + edgeStartSampleCr = (EB_U16*)reconpicture->bufferCr + (reconpicture->originX >> subWidthCMinus1) + (reconpicture->originY >> subHeightCMinus1) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_y + chromaLcuPos_y) * reconpicture->strideCr + (twoSampleEdgeStartSamplePos_x + chromaLcuPos_x); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconpicture->strideCb, + EB_FALSE, + cbTc, + crTc); + //chromaPCMFlagArray); + } + } + } + + return return_error; } @@ -2826,1163 +2826,1163 @@ EB_ERRORTYPE LCUInternalAreaDLFCore16bit( is used to apply the deblocking filter on the LCU boundary */ void LCUBoundaryDLFCore( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. - EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. - EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. + EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. + EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - // luma variable - EB_U32 edgeABlk4x4Addr; - EB_U32 edgeBBlk4x4Addr; - EB_U32 edgeCBlk4x4Addr; - EB_U32 edgeDBlk4x4Addr; - EB_U8 bSLumaEdgeA; - EB_U8 bSLumaEdgeB; - EB_U8 bSLumaEdgeC; - EB_U8 bSLumaEdgeD; - EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; - EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; - - // chroma variable - EB_U32 edgeAUpperBlk2x2Addr; - EB_U32 edgeALowerBlk2x2Addr; - EB_U32 edgeBLeftBlk2x2Addr; - EB_U32 edgeBRightBlk2x2Addr; - EB_U32 edgeCUpperBlk2x2Addr; - EB_U32 edgeCLowerBlk2x2Addr; - EB_U32 edgeDLeftBlk2x2Addr; - EB_U32 edgeDRightBlk2x2Addr; - EB_U8 bSChromaEdgeA[2]; - EB_U8 bSChromaEdgeB[2]; - EB_U8 bSChromaEdgeC[2]; - EB_U8 bSChromaEdgeD[2]; - EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; + // luma variable + EB_U32 edgeABlk4x4Addr; + EB_U32 edgeBBlk4x4Addr; + EB_U32 edgeCBlk4x4Addr; + EB_U32 edgeDBlk4x4Addr; + EB_U8 bSLumaEdgeA; + EB_U8 bSLumaEdgeB; + EB_U8 bSLumaEdgeC; + EB_U8 bSLumaEdgeD; + EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; + EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; + + // chroma variable + EB_U32 edgeAUpperBlk2x2Addr; + EB_U32 edgeALowerBlk2x2Addr; + EB_U32 edgeBLeftBlk2x2Addr; + EB_U32 edgeBRightBlk2x2Addr; + EB_U32 edgeCUpperBlk2x2Addr; + EB_U32 edgeCLowerBlk2x2Addr; + EB_U32 edgeDLeftBlk2x2Addr; + EB_U32 edgeDRightBlk2x2Addr; + EB_U8 bSChromaEdgeA[2]; + EB_U8 bSChromaEdgeB[2]; + EB_U8 bSChromaEdgeC[2]; + EB_U8 bSChromaEdgeD[2]; + EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; EB_U32 chromaLcuPos_x = lcuPos_x >> (colorFormat==EB_YUV444?0:1); EB_U32 chromaLcuPos_y = lcuPos_y >> (colorFormat==EB_YUV420?1:0); - EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); - EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); - EB_U32 horizontalIdx; - EB_U32 verticalIdx; + EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); + EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); + EB_U32 horizontalIdx; + EB_U32 verticalIdx; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; - EB_U32 chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); - EB_U32 chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + EB_U32 chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); + EB_U32 chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - - CHECK_REPORT_ERROR( - ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_DLF_ERROR8); - - /***** luma component filtering *****/ - // filter the top-left corner 8x8 luma block - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 luma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - (horizontalIdx << 3) - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore( - reconpicture, - reconpicture->strideY, - lcuPos_x + (horizontalIdx << 3), - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 luma block column - for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - (verticalIdx << 3) - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y + (verticalIdx << 3), - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - /***** chroma components filtering *****/ - // filter the top-left corner 8x8 chroma block - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 2 >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 chroma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((horizontalIdx << 3) - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((horizontalIdx << 3) - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - 0, - logMaxLcuSizeIn4x4blk); - - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - horizontalIdx << (3 - subWidthShfitMinus1), - 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((horizontalIdx << 3) + 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x + (horizontalIdx << 3), - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 chroma block column - for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - ((verticalIdx << 3) - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - ((verticalIdx << 3) - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 4) >> subWidthShfitMinus1, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (chromaLcuSizeX - 2) >> subWidthShfitMinus1, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - ((verticalIdx << 3) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 2 >> subWidthShfitMinus1, - verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y + (verticalIdx << 3), - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - return; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + CHECK_REPORT_ERROR( + ((lcuWidth & 7) == 0 && (lcuHeight & 7) == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_DLF_ERROR8); + + /***** luma component filtering *****/ + // filter the top-left corner 8x8 luma block + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 luma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + (horizontalIdx << 3) - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore( + reconpicture, + reconpicture->strideY, + lcuPos_x + (horizontalIdx << 3), + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 luma block column + for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + (verticalIdx << 3) - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y + (verticalIdx << 3), + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + /***** chroma components filtering *****/ + // filter the top-left corner 8x8 chroma block + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + (chromaLcuSizeY - 4) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + (chromaLcuSizeY - 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 4) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 2) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + 2 >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 2 >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 chroma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + (chromaLcuSizeY - 4) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + (chromaLcuSizeY - 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((horizontalIdx << 3) - 4) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((horizontalIdx << 3) - 2) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + 0, + logMaxLcuSizeIn4x4blk); + + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + horizontalIdx << (3 - subWidthShfitMinus1), + 2 >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((horizontalIdx << 3) + 2) >> subWidthShfitMinus1, + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x + (horizontalIdx << 3), + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 chroma block column + for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + ((verticalIdx << 3) - 4) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + ((verticalIdx << 3) - 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 4) >> subWidthShfitMinus1, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (chromaLcuSizeX - 2) >> subWidthShfitMinus1, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + ((verticalIdx << 3) + 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 2 >> subWidthShfitMinus1, + verticalIdx << (3 - subHeightShfitMinus1), + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y + (verticalIdx << 3), + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + return; } void LCUBoundaryDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. - EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. - EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. - EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconpicture, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + EB_U8 *lcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array. + EB_U8 *lcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array. + EB_U8 *topLcuVerticalEdgeBSArray, //input parameter, the pointer to the vertical edge BS array of the top neighbour LCU. + EB_U8 *leftLcuHorizontalEdgeBSArray, //input parameter, the pointer to the horizontal edge BS array of the left neighbour LCU. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - // luma variable - EB_U32 edgeABlk4x4Addr; - EB_U32 edgeBBlk4x4Addr; - EB_U32 edgeCBlk4x4Addr; - EB_U32 edgeDBlk4x4Addr; - EB_U8 bSLumaEdgeA; - EB_U8 bSLumaEdgeB; - EB_U8 bSLumaEdgeC; - EB_U8 bSLumaEdgeD; - EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; - EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; - - // chroma variable - EB_U32 edgeAUpperBlk2x2Addr; - EB_U32 edgeALowerBlk2x2Addr; - EB_U32 edgeBLeftBlk2x2Addr; - EB_U32 edgeBRightBlk2x2Addr; - EB_U32 edgeCUpperBlk2x2Addr; - EB_U32 edgeCLowerBlk2x2Addr; - EB_U32 edgeDLeftBlk2x2Addr; - EB_U32 edgeDRightBlk2x2Addr; - EB_U8 bSChromaEdgeA[2]; - EB_U8 bSChromaEdgeB[2]; - EB_U8 bSChromaEdgeC[2]; - EB_U8 bSChromaEdgeD[2]; - - EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; + // luma variable + EB_U32 edgeABlk4x4Addr; + EB_U32 edgeBBlk4x4Addr; + EB_U32 edgeCBlk4x4Addr; + EB_U32 edgeDBlk4x4Addr; + EB_U8 bSLumaEdgeA; + EB_U8 bSLumaEdgeB; + EB_U8 bSLumaEdgeC; + EB_U8 bSLumaEdgeD; + EB_U32 num8x8LumaBlkInTop8x8LumablkRowMinus1 = (lcuWidth >> 3) - 1; + EB_U32 num8x8LumaBlkInLeft8x8LumablkColumnMinus1 = (lcuHeight >> 3) - 1; + + // chroma variable + EB_U32 edgeAUpperBlk2x2Addr; + EB_U32 edgeALowerBlk2x2Addr; + EB_U32 edgeBLeftBlk2x2Addr; + EB_U32 edgeBRightBlk2x2Addr; + EB_U32 edgeCUpperBlk2x2Addr; + EB_U32 edgeCLowerBlk2x2Addr; + EB_U32 edgeDLeftBlk2x2Addr; + EB_U32 edgeDRightBlk2x2Addr; + EB_U8 bSChromaEdgeA[2]; + EB_U8 bSChromaEdgeB[2]; + EB_U8 bSChromaEdgeC[2]; + EB_U8 bSChromaEdgeD[2]; + + EB_COLOR_FORMAT colorFormat = reconpicture->colorFormat; EB_U32 chromaLcuPos_x = lcuPos_x >> (colorFormat==EB_YUV444?0:1); EB_U32 chromaLcuPos_y = lcuPos_y >> (colorFormat==EB_YUV420?1:0); - EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); - EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); + EB_U32 num8x8ChromaBlkInTop8x8ChromablkRowMinus1 = (lcuWidth >> (colorFormat==EB_YUV444?3:4)) - (colorFormat==EB_YUV444?1:((lcuWidth & 15) == 0)); + EB_U32 num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1 = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) - (colorFormat==EB_YUV420?((lcuHeight & 15) == 0):1); - EB_U32 horizontalIdx; - EB_U32 verticalIdx; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); + EB_U32 horizontalIdx; + EB_U32 verticalIdx; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MAX_LCU_SIZE >> 2); - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 lcuSize = sequenceControlSetPtr->lcuSize; EB_U32 chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); EB_U32 chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - /***** luma component filtering *****/ - // filter the top-left corner 8x8 luma block - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 luma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - lcuSize - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - (horizontalIdx << 3) - 4, - 0, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - horizontalIdx << 3, - 0, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideY, - lcuPos_x + (horizontalIdx << 3), - lcuPos_y, - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 luma block column - for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { - edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - (verticalIdx << 3) - 4, - logMaxLcuSizeIn4x4blk); - - edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - lcuSize - 4, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( - 0, - verticalIdx << 3, - logMaxLcuSizeIn4x4blk); - - bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; - bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; - bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; - bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; - - // luma 8x8 block DLF core - Luma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideY, - lcuPos_x, - lcuPos_y + (verticalIdx << 3), - bSLumaEdgeA, - bSLumaEdgeB, - bSLumaEdgeC, - bSLumaEdgeD, - pictureControlSetPtr); - } - - /***** chroma components filtering *****/ - // filter the top-left corner 8x8 chroma block - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + /***** luma component filtering *****/ + // filter the top-left corner 8x8 luma block + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 luma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8LumaBlkInTop8x8LumablkRowMinus1; ++horizontalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + lcuSize - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + (horizontalIdx << 3) - 4, + 0, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + horizontalIdx << 3, + 0, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideY, + lcuPos_x + (horizontalIdx << 3), + lcuPos_y, + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 luma block column + for (verticalIdx = 1; verticalIdx <= num8x8LumaBlkInLeft8x8LumablkColumnMinus1; ++verticalIdx) { + edgeABlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + (verticalIdx << 3) - 4, + logMaxLcuSizeIn4x4blk); + + edgeBBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + lcuSize - 4, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + edgeCBlk4x4Addr = edgeDBlk4x4Addr = GET_LUMA_4X4BLK_ADDR( + 0, + verticalIdx << 3, + logMaxLcuSizeIn4x4blk); + + bSLumaEdgeA = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeABlk4x4Addr)]; + bSLumaEdgeB = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBBlk4x4Addr)]; + bSLumaEdgeC = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCBlk4x4Addr)]; + bSLumaEdgeD = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDBlk4x4Addr)]; + + // luma 8x8 block DLF core + Luma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideY, + lcuPos_x, + lcuPos_y + (verticalIdx << 3), + bSLumaEdgeA, + bSLumaEdgeB, + bSLumaEdgeC, + bSLumaEdgeD, + pictureControlSetPtr); + } + + /***** chroma components filtering *****/ + // filter the top-left corner 8x8 chroma block + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); + 0, + logMaxLcuSizeIn4x4blk); - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, - 0, - logMaxLcuSizeIn4x4blk); + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + 0, + logMaxLcuSizeIn4x4blk); - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( 2 >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - - // filter the top 8x8 chroma block row - for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + + // filter the top 8x8 chroma block row + for (horizontalIdx = 1; horizontalIdx <= num8x8ChromaBlkInTop8x8ChromablkRowMinus1; ++horizontalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), (chromaLcuSizeY - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), (chromaLcuSizeY - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((horizontalIdx << 3) - 4) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((horizontalIdx << 3) - 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); + 0, + logMaxLcuSizeIn4x4blk); - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), - 0, - logMaxLcuSizeIn4x4blk); + 0, + logMaxLcuSizeIn4x4blk); - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( horizontalIdx << (3 - subWidthShfitMinus1), 2 >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((horizontalIdx << 3) + 2) >> subWidthShfitMinus1, - 0, - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : - topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x + (horizontalIdx << 3), - chromaLcuPos_y, - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - // filter the left 8x8 chroma block column - for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { - edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + 0, + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = topLcuVerticalEdgeBSArray == EB_NULL ? 0 : + topLcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x + (horizontalIdx << 3), + chromaLcuPos_y, + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + // filter the left 8x8 chroma block column + for (verticalIdx = 1; verticalIdx <= num8x8ChromaBlkInLeft8x8ChromablkColumnMinus1; ++verticalIdx) { + edgeAUpperBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, ((verticalIdx << 3) - 4) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + logMaxLcuSizeIn4x4blk); + edgeALowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, ((verticalIdx << 3) - 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeBLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 4) >> subWidthShfitMinus1, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + logMaxLcuSizeIn4x4blk); + edgeBRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (chromaLcuSizeX - 2) >> subWidthShfitMinus1, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + edgeCUpperBlk2x2Addr = edgeDLeftBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - 0, + edgeCLowerBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + 0, ((verticalIdx << 3) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); + logMaxLcuSizeIn4x4blk); - edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + edgeDRightBlk2x2Addr = GET_CHROMA_4X4BLK_ADDR( 2 >> subWidthShfitMinus1, verticalIdx << (3 - subHeightShfitMinus1), - logMaxLcuSizeIn4x4blk); - - bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; - bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; - bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; - bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : - leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; - bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; - bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; - bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; - bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; - - chroma8x8blkDLFCore16bit( - reconpicture, - reconpicture->strideCb, - chromaLcuPos_x, - chromaLcuPos_y + (verticalIdx << 3), - bSChromaEdgeA, - bSChromaEdgeB, - bSChromaEdgeC, - bSChromaEdgeD, - pictureControlSetPtr); - } - - return; + logMaxLcuSizeIn4x4blk); + + bSChromaEdgeA[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeAUpperBlk2x2Addr)]; + bSChromaEdgeA[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeALowerBlk2x2Addr)]; + bSChromaEdgeB[0] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBLeftBlk2x2Addr)]; + bSChromaEdgeB[1] = leftLcuHorizontalEdgeBSArray == EB_NULL ? 0 : + leftLcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeBRightBlk2x2Addr)]; + bSChromaEdgeC[0] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCUpperBlk2x2Addr)]; + bSChromaEdgeC[1] = lcuVerticalEdgeBSArray[BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(edgeCLowerBlk2x2Addr)]; + bSChromaEdgeD[0] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDLeftBlk2x2Addr)]; + bSChromaEdgeD[1] = lcuHorizontalEdgeBSArray[BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(edgeDRightBlk2x2Addr)]; + + chroma8x8blkDLFCore16bit( + reconpicture, + reconpicture->strideCb, + chromaLcuPos_x, + chromaLcuPos_y + (verticalIdx << 3), + bSChromaEdgeA, + bSChromaEdgeB, + bSChromaEdgeC, + bSChromaEdgeD, + pictureControlSetPtr); + } + + return; } /** LCUPictureEdgeDLFCore() is used to apply the deblocking filter on the LCU boundary */ void LCUPictureEdgeDLFCore( - EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuIdx, - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuIdx, + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); - - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U32 num4SampleHorizontalEdges; - EB_U32 num4SampleVerticalEdges; - EB_U32 blk4x4Addr; - EB_U32 blk2x2Addr; - EB_U32 pictureWidthInLcu; - //EB_U32 pictureHeightInLcu; - EB_U32 tileWidthInPxl; - EB_U32 tileHeightInPxl; - EB_U32 tileWidthEndInLcu; - EB_U32 tileHeightEndInLcu; - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U8 bS; - EB_U32 lcuSize; - EB_U32 chromaLcuSizeX; - EB_U32 chromaLcuSizeY; - EB_U8 curCuQp; - EB_BYTE edgeStartFilteredSamplePtr; - EB_BYTE edgeStartSampleCb; - EB_BYTE edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 Beta; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); + + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U32 num4SampleHorizontalEdges; + EB_U32 num4SampleVerticalEdges; + EB_U32 blk4x4Addr; + EB_U32 blk2x2Addr; + EB_U32 pictureWidthInLcu; + //EB_U32 pictureHeightInLcu; + EB_U32 tileWidthInPxl; + EB_U32 tileHeightInPxl; + EB_U32 tileWidthEndInLcu; + EB_U32 tileHeightEndInLcu; + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U8 bS; + EB_U32 lcuSize; + EB_U32 chromaLcuSizeX; + EB_U32 chromaLcuSizeY; + EB_U8 curCuQp; + EB_BYTE edgeStartFilteredSamplePtr; + EB_BYTE edgeStartSampleCb; + EB_BYTE edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 Beta; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //tileWidthEndInLcu = (lcuPtr->tileEndX + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //tileHeightEndInLcu = (lcuPtr->tileEndY + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; - tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; + pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //tileWidthEndInLcu = (lcuPtr->tileEndX + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //tileHeightEndInLcu = (lcuPtr->tileEndY + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; + tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; tileWidthInPxl = lcuPtr->tileInfoPtr->tilePxlEndX - lcuPtr->tileInfoPtr->tilePxlOriginX; - tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; - lcuSize = sequenceControlSet->lcuSize; - chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); - chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); + tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; + lcuSize = sequenceControlSet->lcuSize; + chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); + chromaLcuSizeY = lcuSize >> (colorFormat==EB_YUV420?1:0); const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { - /***** picture right-most 4 sample horizontal edges filtering *****/ - // luma component filtering - num4SampleHorizontalEdges = (lcuHeight >> 3); - fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - // edge B - fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position - //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample luma edge filter core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { - num4SampleHorizontalEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) + (((lcuHeight >> (colorFormat==EB_YUV420?1:0)) & (colorFormat==EB_YUV420?7:15)) != 0); - fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location - //for(verticalIdx = 1; verticalIdx <= num4SampleHorizontalEdges; ++verticalIdx) { - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - fourSampleEdgeStartSamplePos_y = (lcuPos_y >> (colorFormat==EB_YUV420?1:0)) + (verticalIdx << 3); // Picture wise location - - // left 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, - (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { + /***** picture right-most 4 sample horizontal edges filtering *****/ + // luma component filtering + num4SampleHorizontalEdges = (lcuHeight >> 3); + fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + // edge B + fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position + //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample luma edge filter core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { + num4SampleHorizontalEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) + (((lcuHeight >> (colorFormat==EB_YUV420?1:0)) & (colorFormat==EB_YUV420?7:15)) != 0); + fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location + //for(verticalIdx = 1; verticalIdx <= num4SampleHorizontalEdges; ++verticalIdx) { + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + fourSampleEdgeStartSamplePos_y = (lcuPos_y >> (colorFormat==EB_YUV420?1:0)) + (verticalIdx << 3); // Picture wise location + + // left 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, + (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - - } - - // right 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - ((fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) + 2) >> subWidthShfitMinus1, - (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + + } + + // right 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + ((fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) + 2) >> subWidthShfitMinus1, + (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - } - } - } - } - - if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { - /***** picture bottom 4 sample vertical edges filtering *****/ - // luma component filtering - num4SampleVerticalEdges = (lcuWidth >> 3); - fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position - lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample edge luma filter core - Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { - num4SampleVerticalEdges = (lcuWidth >> (3+(colorFormat==EB_YUV444?0:1))) + (((lcuWidth >> (colorFormat==EB_YUV444?0:1)) & (colorFormat==EB_YUV444?15:7)) != 0); - - fourSampleEdgeStartSamplePos_y = sequenceControlSet->chromaHeight - 4; // Picture wise location - fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { - fourSampleEdgeStartSamplePos_x = (lcuPos_x >> (colorFormat==EB_YUV444?0:1)) + (horizontalIdx << 3); // Picture wise location - lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize - (colorFormat==EB_YUV420?1:0))) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize - (colorFormat==EB_YUV444?0:1))); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - - // Upper 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, - (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + } + } + } + } + + if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { + /***** picture bottom 4 sample vertical edges filtering *****/ + // luma component filtering + num4SampleVerticalEdges = (lcuWidth >> 3); + fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position + lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + edgeStartFilteredSamplePtr = reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample edge luma filter core + Luma4SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { + num4SampleVerticalEdges = (lcuWidth >> (3+(colorFormat==EB_YUV444?0:1))) + (((lcuWidth >> (colorFormat==EB_YUV444?0:1)) & (colorFormat==EB_YUV444?15:7)) != 0); + + fourSampleEdgeStartSamplePos_y = sequenceControlSet->chromaHeight - 4; // Picture wise location + fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + fourSampleEdgeStartSamplePos_x = (lcuPos_x >> (colorFormat==EB_YUV444?0:1)) + (horizontalIdx << 3); // Picture wise location + lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize - (colorFormat==EB_YUV420?1:0))) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize - (colorFormat==EB_YUV444?0:1))); + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + + // Upper 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, + (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - - // Lower 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( - (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, - ((fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + + // Lower 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, + ((fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) + 2) >> subHeightShfitMinus1, + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - - Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - } - } - } - return; + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + edgeStartSampleCb = reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + + Chroma2SampleEdgeDLFCore_Table[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + } + } + } + return; } /** LCUPictureEdgeDLFCore() is used to apply the deblocking filter on the LCU boundary */ void LCUPictureEdgeDLFCore16bit( - EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. - EB_U32 lcuIdx, - EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. - EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. - EB_U32 lcuWidth, //input parameter, the LCU width. - EB_U32 lcuHeight, //input parameter, the LCU height. - PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. + EbPictureBufferDesc_t *reconPic, //input parameter, the pointer to the reconstructed picture. + EB_U32 lcuIdx, + EB_U32 lcuPos_x, //input parameter, the picture-wise horizontal location of the LCU. + EB_U32 lcuPos_y, //input parameter, the picture-wise vertical location of the LCU. + EB_U32 lcuWidth, //input parameter, the LCU width. + EB_U32 lcuHeight, //input parameter, the LCU height. + PictureControlSet_t *pictureControlSetPtr) //input parameter, picture control set. { - const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; - const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); - const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); - - - EB_U32 verticalIdx; - EB_U32 horizontalIdx; - EB_U32 num4SampleHorizontalEdges; - EB_U32 num4SampleVerticalEdges; - EB_U32 blk4x4Addr; - EB_U32 blk2x2Addr; - EB_U32 pictureWidthInLcu; - //EB_U32 pictureHeightInLcu; - - EB_U32 tileWidthInPxl; - EB_U32 tileHeightInPxl; - EB_U32 tileWidthEndInLcu; - EB_U32 tileHeightEndInLcu; - - EB_U32 fourSampleEdgeStartSamplePos_x; - EB_U32 fourSampleEdgeStartSamplePos_y; - EB_U8 bS; - EB_U32 lcuSize; + const EB_U32 MaxLcuSizeIn4x4blk = MAX_LCU_SIZE >> 2; + const EB_U32 logMaxLcuSizeIn4x4blk = Log2f(MaxLcuSizeIn4x4blk); + const EB_U32 logMaxLcuSize = Log2f(MAX_LCU_SIZE); + + + EB_U32 verticalIdx; + EB_U32 horizontalIdx; + EB_U32 num4SampleHorizontalEdges; + EB_U32 num4SampleVerticalEdges; + EB_U32 blk4x4Addr; + EB_U32 blk2x2Addr; + EB_U32 pictureWidthInLcu; + //EB_U32 pictureHeightInLcu; + + EB_U32 tileWidthInPxl; + EB_U32 tileHeightInPxl; + EB_U32 tileWidthEndInLcu; + EB_U32 tileHeightEndInLcu; + + EB_U32 fourSampleEdgeStartSamplePos_x; + EB_U32 fourSampleEdgeStartSamplePos_y; + EB_U8 bS; + EB_U32 lcuSize; EB_U32 chromaLcuSizeX; EB_U32 chromaLcuSizeY; - EB_U8 curCuQp; - EB_U16 *edgeStartFilteredSamplePtr; - EB_U16 *edgeStartSampleCb; - EB_U16 *edgeStartSampleCr; - EB_U8 neighbourCuQp; - EB_U8 Qp; - EB_S32 Beta; - EB_S32 lumaTc; - //EB_BOOL lumaPCMFlagArray[2]; - //EB_BOOL chromaPCMFlagArray[2]; - EB_S32 CUqpIndex; - EB_U8 cbQp; - EB_U8 crQp; - EB_U8 cbTc; - EB_U8 crTc; + EB_U8 curCuQp; + EB_U16 *edgeStartFilteredSamplePtr; + EB_U16 *edgeStartSampleCb; + EB_U16 *edgeStartSampleCr; + EB_U8 neighbourCuQp; + EB_U8 Qp; + EB_S32 Beta; + EB_S32 lumaTc; + //EB_BOOL lumaPCMFlagArray[2]; + //EB_BOOL chromaPCMFlagArray[2]; + EB_S32 CUqpIndex; + EB_U8 cbQp; + EB_U8 crQp; + EB_U8 cbTc; + EB_U8 crTc; EB_COLOR_FORMAT colorFormat = reconPic->colorFormat; const EB_S32 subWidthC = colorFormat==EB_YUV444?1:2; const EB_S32 subHeightC = colorFormat==EB_YUV420?2:1; const EB_S32 subWidthCMinus1 = colorFormat==EB_YUV444?0:1; const EB_S32 subHeightCMinus1 = colorFormat==EB_YUV420?1:0; - SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + SequenceControlSet_t *sequenceControlSet = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; - tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; - tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; + pictureWidthInLcu = (sequenceControlSet->lumaWidth + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + //pictureHeightInLcu = (sequenceControlSet->lumaHeight + sequenceControlSet->lcuSize - 1) / sequenceControlSet->lcuSize; + tileWidthEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndX; + tileHeightEndInLcu = lcuPtr->tileInfoPtr->tileLcuEndY; tileWidthInPxl = lcuPtr->tileInfoPtr->tilePxlEndX - lcuPtr->tileInfoPtr->tilePxlOriginX; - tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; + tileHeightInPxl = lcuPtr->tileInfoPtr->tilePxlEndY - lcuPtr->tileInfoPtr->tilePxlOriginY; lcuSize = sequenceControlSet->lcuSize; chromaLcuSizeX = lcuSize >> (colorFormat==EB_YUV444?0:1); @@ -3990,359 +3990,359 @@ void LCUPictureEdgeDLFCore16bit( const EB_U32 subWidthShfitMinus1 = colorFormat==EB_YUV444?1:0; const EB_U32 subHeightShfitMinus1 = colorFormat==EB_YUV420?0:1; - if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { - /***** picture right-most 4 sample horizontal edges filtering *****/ - // luma component filtering - num4SampleHorizontalEdges = (lcuHeight >> 3); - fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position - - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - // edge B - //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // picture-wise position - fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position - //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - 1; - - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - - lumaTc = lumaTc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample luma edge filter core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_FALSE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { - //num4SampleHorizontalEdges = (sequenceControlSet->chromaHeight >> 3) + ((sequenceControlSet->chromaHeight & 7) != 0) - 1; + if (lcuPos_x >> lcuPtr->sizeLog2 == tileWidthEndInLcu - 1) { + /***** picture right-most 4 sample horizontal edges filtering *****/ + // luma component filtering + num4SampleHorizontalEdges = (lcuHeight >> 3); + fourSampleEdgeStartSamplePos_x = lcuPtr->tileInfoPtr->tilePxlEndX - 4; // picutre-wise position + + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + // edge B + //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // picture-wise position + fourSampleEdgeStartSamplePos_y = lcuPos_y + (verticalIdx << 3); // picture-wise position + //lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - 1; + + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + + lumaTc = lumaTc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample luma edge filter core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_FALSE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileWidthInPxl >> subWidthCMinus1) & 7) == 0) { + //num4SampleHorizontalEdges = (sequenceControlSet->chromaHeight >> 3) + ((sequenceControlSet->chromaHeight & 7) != 0) - 1; num4SampleHorizontalEdges = (lcuHeight >> (colorFormat==EB_YUV420?4:3)) + (((lcuHeight >> (colorFormat==EB_YUV420?1:0)) & (colorFormat==EB_YUV420?7:15)) != 0); - fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location - for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { - //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // Picture wise location + fourSampleEdgeStartSamplePos_x = (lcuPtr->tileInfoPtr->tilePxlEndX >> subWidthCMinus1) - 4; // Tile wise location + for (verticalIdx = (lcuPos_y == lcuPtr->tileInfoPtr->tilePxlOriginY); verticalIdx < num4SampleHorizontalEdges; ++verticalIdx) { + //fourSampleEdgeStartSamplePos_y = verticalIdx << 3; // Picture wise location fourSampleEdgeStartSamplePos_y = (lcuPos_y >> (colorFormat==EB_YUV420?1:0)) + (verticalIdx << 3); // Picture wise location - //lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize-1)) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize-1)); - //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + //lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize-1)) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize-1)); + //lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - // left 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + // left 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - - } - - // right 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + + } + + // right 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( ((fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) + 2) >> subWidthShfitMinus1, (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->horizontalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_HORIZONTAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x + 2, - fourSampleEdgeStartSamplePos_y - 1, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); - edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_FALSE, - cbTc, - crTc); - } - } - } - } - - if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { - /***** picture bottom 4 sample vertical edges filtering *****/ - // luma component filtering - num4SampleVerticalEdges = (lcuWidth >> 3); - fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { - // edge A - fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position - lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - blk4x4Addr = GET_LUMA_4X4BLK_ADDR( - fourSampleEdgeStartSamplePos_x & (lcuSize - 1), - fourSampleEdgeStartSamplePos_y & (lcuSize - 1), - logMaxLcuSizeIn4x4blk); - //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; - - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; - if (bS > 0) { - /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. - */ - - // Qp for the current CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - - - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - - // Qp for the neighboring CU - CUqpIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - Qp = (curCuQp + neighbourCuQp + 1) >> 1; - lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; - Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; - - lumaTc = lumaTc << 2; - Beta = Beta << 2; - edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; - - // 4 sample edge luma filter core - lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartFilteredSamplePtr, - reconPic->strideY, - EB_TRUE, - lumaTc, - Beta); - } - } - - // chroma component filtering - if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { + fourSampleEdgeStartSamplePos_x + 2, + fourSampleEdgeStartSamplePos_y - 1, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = ((EB_U16*)reconPic->bufferCb) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + (fourSampleEdgeStartSamplePos_x + 2); + edgeStartSampleCr = ((EB_U16*)reconPic->bufferCr) + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + (fourSampleEdgeStartSamplePos_x + 2); + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_FALSE, + cbTc, + crTc); + } + } + } + } + + if (lcuPos_y >> lcuPtr->sizeLog2 == tileHeightEndInLcu - 1) { + /***** picture bottom 4 sample vertical edges filtering *****/ + // luma component filtering + num4SampleVerticalEdges = (lcuWidth >> 3); + fourSampleEdgeStartSamplePos_y = lcuPtr->tileInfoPtr->tilePxlEndY - 4; // picture-wise position + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + // edge A + fourSampleEdgeStartSamplePos_x = lcuPos_x + (horizontalIdx << 3); // picuture-wise position + lcuIdx = (fourSampleEdgeStartSamplePos_y >> logMaxLcuSize) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> logMaxLcuSize); + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + blk4x4Addr = GET_LUMA_4X4BLK_ADDR( + fourSampleEdgeStartSamplePos_x & (lcuSize - 1), + fourSampleEdgeStartSamplePos_y & (lcuSize - 1), + logMaxLcuSizeIn4x4blk); + //neighbourBlk4x4Addr = blk4x4Addr - MaxLcuSizeIn4x4blk; + + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk4x4Addr)]; + if (bS > 0) { + /** *Note - The PCMFlagArray initiallisation should be completely changed when we have PCM coding. + */ + + // Qp for the current CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + + + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + + // Qp for the neighboring CU + CUqpIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + Qp = (curCuQp + neighbourCuQp + 1) >> 1; + lumaTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, Qp + ((bS > 1) << 1) + pictureControlSetPtr->tcOffset)]; + Beta = BetaTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE, Qp + pictureControlSetPtr->betaOffset)]; + + lumaTc = lumaTc << 2; + Beta = Beta << 2; + edgeStartFilteredSamplePtr = (EB_U16*)reconPic->bufferY + reconPic->originX + reconPic->originY * reconPic->strideY + fourSampleEdgeStartSamplePos_y * reconPic->strideY + fourSampleEdgeStartSamplePos_x; + + // 4 sample edge luma filter core + lumaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartFilteredSamplePtr, + reconPic->strideY, + EB_TRUE, + lumaTc, + Beta); + } + } + + // chroma component filtering + if (((tileHeightInPxl>> subHeightCMinus1) & 7) == 0) { num4SampleVerticalEdges = (lcuWidth >> (3+(colorFormat==EB_YUV444?0:1))) + (((lcuWidth >> (colorFormat==EB_YUV444?0:1)) & (colorFormat==EB_YUV444?15:7)) != 0); - //fourSampleEdgeStartSamplePos_y = (lcuPtr->tileEndY >> subHeightCMinus1) - 4; // Tile wise location - fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location - for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { + //fourSampleEdgeStartSamplePos_y = (lcuPtr->tileEndY >> subHeightCMinus1) - 4; // Tile wise location + fourSampleEdgeStartSamplePos_y = (lcuPtr->tileInfoPtr->tilePxlEndY >> subHeightCMinus1) - 4; // Tile wise location + for (horizontalIdx = (lcuPos_x == lcuPtr->tileInfoPtr->tilePxlOriginX); horizontalIdx < num4SampleVerticalEdges; ++horizontalIdx) { fourSampleEdgeStartSamplePos_x = (lcuPos_x >> (colorFormat==EB_YUV444?0:1)) + (horizontalIdx << 3); // Picture wise location lcuIdx = (fourSampleEdgeStartSamplePos_y >> (logMaxLcuSize - (colorFormat==EB_YUV420?1:0))) * pictureWidthInLcu + (fourSampleEdgeStartSamplePos_x >> (logMaxLcuSize - (colorFormat==EB_YUV444?0:1))); - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIdx]; - // Upper 2 sample edge - blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( + // Upper 2 sample edge + blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, (fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - - // Lower 2 sample edge + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + fourSampleEdgeStartSamplePos_y * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + fourSampleEdgeStartSamplePos_y * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + + // Lower 2 sample edge blk2x2Addr = GET_CHROMA_4X4BLK_ADDR( (fourSampleEdgeStartSamplePos_x & (chromaLcuSizeX - 1)) >> subWidthShfitMinus1, ((fourSampleEdgeStartSamplePos_y & (chromaLcuSizeY - 1)) + 2) >> subHeightShfitMinus1, - logMaxLcuSizeIn4x4blk); - bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; + logMaxLcuSizeIn4x4blk); + bS = pictureControlSetPtr->verticalEdgeBSArray[lcuIdx][BLK4X4_ADDR_TO_VERTICAL_EDGE_BS_ARRAY_IDX(blk2x2Addr)]; - if (bS > 1) { - // Qp for the current CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + if (bS > 1) { + // Qp for the current CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); + fourSampleEdgeStartSamplePos_x, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); - curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + curCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - // Qp for the neighboring CU - CUqpIndex = - CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + // Qp for the neighboring CU + CUqpIndex = + CHROMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( subWidthC, subHeightC, - fourSampleEdgeStartSamplePos_x - 1, - fourSampleEdgeStartSamplePos_y + 2, - pictureControlSetPtr->qpArrayStride); - //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; - neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; - cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); - crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); - //chromaQp = MapChromaQp(Qp); - cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; - crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; - - cbTc = cbTc << 2; - crTc = crTc << 2; - edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; - edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; - - chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( - edgeStartSampleCb, - edgeStartSampleCr, - reconPic->strideCb, - EB_TRUE, - cbTc, - crTc); - } - } - } - } - - return; + fourSampleEdgeStartSamplePos_x - 1, + fourSampleEdgeStartSamplePos_y + 2, + pictureControlSetPtr->qpArrayStride); + //CUqpIndex = ((CUqpIndex - (EB_S32)pictureControlSetPtr->qpArrayStride) < 0) ? CUqpIndex : CUqpIndex - pictureControlSetPtr->qpArrayStride; + neighbourCuQp = pictureControlSetPtr->qpArray[CUqpIndex]; + cbQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->cbQpOffset), colorFormat>=EB_YUV422); + crQp = convertToChromaQp((EB_S32)(((curCuQp + neighbourCuQp + 1) >> 1) + pictureControlSetPtr->crQpOffset), colorFormat>=EB_YUV422); + //chromaQp = MapChromaQp(Qp); + cbTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (cbQp + 2) + pictureControlSetPtr->tcOffset)]; + crTc = TcTable_8x8[CLIP3EQ(MIN_QP_VALUE, MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET, (crQp + 2) + pictureControlSetPtr->tcOffset)]; + + cbTc = cbTc << 2; + crTc = crTc << 2; + edgeStartSampleCb = (EB_U16*)reconPic->bufferCb + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCb + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCb + fourSampleEdgeStartSamplePos_x; + edgeStartSampleCr = (EB_U16*)reconPic->bufferCr + (reconPic->originX >> subWidthCMinus1) + (reconPic->originY >> subHeightCMinus1) * reconPic->strideCr + (fourSampleEdgeStartSamplePos_y + 2) * reconPic->strideCr + fourSampleEdgeStartSamplePos_x; + + chromaDlf_funcPtrArray16bit[!!(ASM_TYPES & PREAVX2_MASK)]( + edgeStartSampleCb, + edgeStartSampleCr, + reconPic->strideCb, + EB_TRUE, + cbTc, + crTc); + } + } + } + } + + return; } diff --git a/Source/Lib/Codec/EbDeblockingFilter.h b/Source/Lib/Codec/EbDeblockingFilter.h index 9ef357ada..65d53392e 100644 --- a/Source/Lib/Codec/EbDeblockingFilter.h +++ b/Source/Lib/Codec/EbDeblockingFilter.h @@ -38,16 +38,16 @@ extern "C" { #define MAX_QP_VALUE_PLUS_INTRA_TC_OFFSET 53 -#define BETA_OFFSET_VALUE 12 // range -12 to 12 +#define BETA_OFFSET_VALUE 12 // range -12 to 12 -#define TC_OFFSET_VALUE 12//12 // range -12 to 12 +#define TC_OFFSET_VALUE 12//12 // range -12 to 12 void SetQpArrayBasedOnCU( - PictureControlSet_t *pictureControlSetPtr, //input parameter - EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU - EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU - EB_U32 cuSizeInMinCuSize, //input parameter - EB_U32 cuQp) ; //input parameter, Qp of the CU + PictureControlSet_t *pictureControlSetPtr, //input parameter + EB_U32 cuPos_x, //input parameter, sample-based horizontal picture-wise locatin of the CU + EB_U32 cuPos_y, //input parameter, sample-based vertical picture-wise locatin of the CU + EB_U32 cuSizeInMinCuSize, //input parameter + EB_U32 cuQp) ; //input parameter, Qp of the CU extern void entropySetQpArrayBasedOnCU( PictureControlSet_t *pictureControlSetPtr, @@ -64,7 +64,7 @@ extern EB_U8 CalculateBSForPUBoundary( PredictionUnit_t *neighbourPuPtr, EB_MODETYPE puCodingMode, EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, + EB_BOOL isVerticalEdge, PictureControlSet_t *pictureControlSetPtr, SequenceControlSet_t *sequenceControlSetPtr); @@ -104,7 +104,7 @@ extern EB_U8 Intra4x4CalculateBSForPUBoundary( PredictionUnit_t *neighbourPuPtr, EB_MODETYPE puCodingMode, EB_MODETYPE neighbourPuCodingMode, - EB_BOOL isVerticalEdge, + EB_BOOL isVerticalEdge, EB_BOOL isVerticalPuBoundaryAlsoTuBoundary, EB_BOOL isHorizontalPuBoundaryAlsoTuBoundary, PictureControlSet_t *pictureControlSetPtr, @@ -131,7 +131,7 @@ extern void Intra4x4SetBSArrayBasedOnPUBoundary( PredictionUnit_t *puPtr, CodingUnit_t *cuPtr, const CodedUnitStats_t *cuStatsPtr, - EB_U32 puOriginX, + EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, @@ -145,7 +145,7 @@ extern void Intra4x4SetBSArrayBasedOnPUBoundary( extern EB_ERRORTYPE LCUInternalAreaDLFCore( - EbPictureBufferDesc_t *reconpicture, + EbPictureBufferDesc_t *reconpicture, EB_U32 lcuPosx, EB_U32 lcuPosy, EB_U32 lcuWidth, @@ -155,7 +155,7 @@ extern EB_ERRORTYPE LCUInternalAreaDLFCore( PictureControlSet_t *reconPictureControlSet); extern EB_ERRORTYPE LCUInternalAreaDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, + EbPictureBufferDesc_t *reconpicture, EB_U32 lcuPosx, EB_U32 lcuPosy, EB_U32 lcuWidth, @@ -165,46 +165,46 @@ extern EB_ERRORTYPE LCUInternalAreaDLFCore16bit( PictureControlSet_t *reconPictureControlSet); extern void LCUBoundaryDLFCore( - EbPictureBufferDesc_t *reconpicture, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - EB_U8 *lcuVerticalEdgeBSArray, - EB_U8 *lcuHorizontalEdgeBSArray, - EB_U8 *topLcuVerticalEdgeBSArray, - EB_U8 *leftLcuHorizontalEdgeBSArray, + EbPictureBufferDesc_t *reconpicture, + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + EB_U8 *lcuVerticalEdgeBSArray, + EB_U8 *lcuHorizontalEdgeBSArray, + EB_U8 *topLcuVerticalEdgeBSArray, + EB_U8 *leftLcuHorizontalEdgeBSArray, PictureControlSet_t *pictureControlSetPtr); extern void LCUBoundaryDLFCore16bit( - EbPictureBufferDesc_t *reconpicture, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - EB_U8 *lcuVerticalEdgeBSArray, - EB_U8 *lcuHorizontalEdgeBSArray, - EB_U8 *topLcuVerticalEdgeBSArray, - EB_U8 *leftLcuHorizontalEdgeBSArray, + EbPictureBufferDesc_t *reconpicture, + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + EB_U8 *lcuVerticalEdgeBSArray, + EB_U8 *lcuHorizontalEdgeBSArray, + EB_U8 *topLcuVerticalEdgeBSArray, + EB_U8 *leftLcuHorizontalEdgeBSArray, PictureControlSet_t *pictureControlSetPtr); extern void LCUPictureEdgeDLFCore( - EbPictureBufferDesc_t *reconPic, + EbPictureBufferDesc_t *reconPic, EB_U32 lcuIdx, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + PictureControlSet_t *pictureControlSetPtr); extern void LCUPictureEdgeDLFCore16bit( - EbPictureBufferDesc_t *reconPic, + EbPictureBufferDesc_t *reconPic, EB_U32 lcuIdx, - EB_U32 lcuPos_x, - EB_U32 lcuPos_y, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 lcuPos_x, + EB_U32 lcuPos_y, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + PictureControlSet_t *pictureControlSetPtr); /*************************************** * Function Types @@ -225,8 +225,8 @@ typedef void(*EB_CHROMA2SAMPLEDGEDLF_FUNC)( EB_U8 crTc); typedef void(*EB_CHROMADLF_TYPE_16BIT)( - EB_U16 *edgeStartSampleCb, - EB_U16 *edgeStartSampleCr, + EB_U16 *edgeStartSampleCb, + EB_U16 *edgeStartSampleCr, EB_U32 reconChromaPicStride, EB_BOOL isVerticalEdge, EB_U8 cbTc, @@ -243,8 +243,8 @@ typedef void(*EB_LUMADLF_TYPE_16BIT)( * Function Ptr Types ***************************************/ static EB_LUMA4SAMPLEDGEDLF_FUNC FUNC_TABLE Luma4SampleEdgeDLFCore_Table[EB_ASM_TYPE_TOTAL] = -{ - // C_DEFAULT +{ + // C_DEFAULT Luma4SampleEdgeDLFCore, // AVX2 Luma4SampleEdgeDLFCore_SSSE3, diff --git a/Source/Lib/Codec/EbDefinitions.h b/Source/Lib/Codec/EbDefinitions.h index adf38d530..ccde184fd 100644 --- a/Source/Lib/Codec/EbDefinitions.h +++ b/Source/Lib/Codec/EbDefinitions.h @@ -77,7 +77,7 @@ extern "C" { #error OS not supported #endif -#ifdef _MSC_VER +#ifdef _MSC_VER #define FORCE_INLINE __forceinline #pragma warning( disable : 4068 ) // unknown pragma #else @@ -88,17 +88,17 @@ extern "C" { #endif #endif -#define INPUT_SIZE_576p_TH 0x90000 // 0.58 Million -#define INPUT_SIZE_1080i_TH 0xB71B0 // 0.75 Million -#define INPUT_SIZE_1080p_TH 0x1AB3F0 // 1.75 Million -#define INPUT_SIZE_4K_TH 0x29F630 // 2.75 Million -#define INPUT_SIZE_8K_TH 0xB71B00 // 12 Million +#define INPUT_SIZE_576p_TH 0x90000 // 0.58 Million +#define INPUT_SIZE_1080i_TH 0xB71B0 // 0.75 Million +#define INPUT_SIZE_1080p_TH 0x1AB3F0 // 1.75 Million +#define INPUT_SIZE_4K_TH 0x29F630 // 2.75 Million +#define INPUT_SIZE_8K_TH 0xB71B00 // 12 Million #define EB_INPUT_RESOLUTION EB_U8 -#define INPUT_SIZE_576p_RANGE_OR_LOWER 0 -#define INPUT_SIZE_1080i_RANGE 1 -#define INPUT_SIZE_1080p_RANGE 2 -#define INPUT_SIZE_4K_RANGE 3 +#define INPUT_SIZE_576p_RANGE_OR_LOWER 0 +#define INPUT_SIZE_1080i_RANGE 1 +#define INPUT_SIZE_1080p_RANGE 2 +#define INPUT_SIZE_4K_RANGE 3 /** The EB_GOP type is used to describe the hierarchical coding structure of Groups of Pictures (GOP) units. @@ -115,45 +115,45 @@ Groups of Pictures (GOP) units. // All other compilers should support the stdint.h C99 standard types. #ifdef _MSC_VER - /** EB_U8 is an 8 bit unsigned quantity that is byte aligned */ - typedef unsigned __int8 EB_U8; - /** EB_U16 is an 16 bit unsigned quantity that is byte aligned */ - typedef unsigned __int16 EB_U16; - /** EB_U32 is an 32 bit unsigned quantity that is byte aligned */ - typedef unsigned __int32 EB_U32; - /** EB_U64 is an 64 bit unsigned quantity that is byte aligned */ - typedef unsigned __int64 EB_U64; - - /** EB_S8 is an 8 bit signed quantity that is byte aligned */ - typedef signed __int8 EB_S8; - /** EB_S16 is an 16 bit signed quantity that is byte aligned */ - typedef signed __int16 EB_S16; - /** EB_S32 is an 32 bit signed quantity that is byte aligned */ - typedef signed __int32 EB_S32; - /** EB_S64 is an 64 bit signed quantity that is byte aligned */ - typedef signed __int64 EB_S64; + /** EB_U8 is an 8 bit unsigned quantity that is byte aligned */ + typedef unsigned __int8 EB_U8; + /** EB_U16 is an 16 bit unsigned quantity that is byte aligned */ + typedef unsigned __int16 EB_U16; + /** EB_U32 is an 32 bit unsigned quantity that is byte aligned */ + typedef unsigned __int32 EB_U32; + /** EB_U64 is an 64 bit unsigned quantity that is byte aligned */ + typedef unsigned __int64 EB_U64; + + /** EB_S8 is an 8 bit signed quantity that is byte aligned */ + typedef signed __int8 EB_S8; + /** EB_S16 is an 16 bit signed quantity that is byte aligned */ + typedef signed __int16 EB_S16; + /** EB_S32 is an 32 bit signed quantity that is byte aligned */ + typedef signed __int32 EB_S32; + /** EB_S64 is an 64 bit signed quantity that is byte aligned */ + typedef signed __int64 EB_S64; #else #include - /** EB_U8 is an 8 bit unsigned quantity that is byte aligned */ - typedef uint8_t EB_U8; - /** EB_U16 is an 16 bit unsigned quantity that is byte aligned */ - typedef uint16_t EB_U16; - /** EB_U32 is an 32 bit unsigned quantity that is byte aligned */ - typedef uint32_t EB_U32; - /** EB_U64 is an 64 bit unsigned quantity that is byte aligned */ - typedef uint64_t EB_U64; - - /** EB_S8 is an 8 bit signed quantity that is byte aligned */ - typedef int8_t EB_S8; - /** EB_S16 is an 16 bit signed quantity that is byte aligned */ - typedef int16_t EB_S16; - /** EB_S32 is an 32 bit signed quantity that is byte aligned */ - typedef int32_t EB_S32; - /** EB_S64 is an 64 bit signed quantity that is byte aligned */ - typedef int64_t EB_S64; + /** EB_U8 is an 8 bit unsigned quantity that is byte aligned */ + typedef uint8_t EB_U8; + /** EB_U16 is an 16 bit unsigned quantity that is byte aligned */ + typedef uint16_t EB_U16; + /** EB_U32 is an 32 bit unsigned quantity that is byte aligned */ + typedef uint32_t EB_U32; + /** EB_U64 is an 64 bit unsigned quantity that is byte aligned */ + typedef uint64_t EB_U64; + + /** EB_S8 is an 8 bit signed quantity that is byte aligned */ + typedef int8_t EB_S8; + /** EB_S16 is an 16 bit signed quantity that is byte aligned */ + typedef int16_t EB_S16; + /** EB_S32 is an 32 bit signed quantity that is byte aligned */ + typedef int32_t EB_S32; + /** EB_S64 is an 64 bit signed quantity that is byte aligned */ + typedef int64_t EB_S64; #endif // _WIN32 typedef enum EB_ASM { @@ -186,11 +186,11 @@ typedef EB_U8 * EB_BYTE; /** The EB_BITDEPTH type is used to describe the bitdepth of video data. */ typedef enum EB_BITDEPTH { - EB_8BIT = 8, - EB_10BIT = 10, - EB_12BIT = 12, - EB_14BIT = 14, - EB_16BIT = 16 + EB_8BIT = 8, + EB_10BIT = 10, + EB_12BIT = 12, + EB_14BIT = 14, + EB_16BIT = 16 } EB_BITDEPTH; typedef enum EB_RDOQ_PMCORE_TYPE { @@ -201,11 +201,11 @@ typedef enum EB_RDOQ_PMCORE_TYPE { } EB_RDOQ_PMCORE_TYPE; typedef enum EbPtrType{ - EB_N_PTR = 0, // malloc'd pointer - EB_A_PTR = 1, // malloc'd pointer aligned - EB_MUTEX = 2, // mutex - EB_SEMAPHORE = 3, // semaphore - EB_THREAD = 4 // thread handle + EB_N_PTR = 0, // malloc'd pointer + EB_A_PTR = 1, // malloc'd pointer aligned + EB_MUTEX = 2, // mutex + EB_SEMAPHORE = 3, // semaphore + EB_THREAD = 4 // thread handle }EbPtrType; /** The EB_PTR type is intended to be used to pass pointers to and from the svt @@ -223,8 +223,8 @@ typedef void * EB_PTR; typedef struct EbMemoryMapEntry { - EB_PTR ptr; // points to a memory pointer - EbPtrType ptrType; // pointer type + EB_PTR ptr; // points to a memory pointer + EbPtrType ptrType; // pointer type } EbMemoryMapEntry; typedef struct EB_PARAM_PORTDEFINITIONTYPE { @@ -322,10 +322,10 @@ FORCE_INLINE void eb_memcpy(void *dstPtr, void *srcPtr, size_t size) } #define EB_MEMCPY(dst, src, size) \ - eb_memcpy(dst, src, size) + eb_memcpy(dst, src, size) #define EB_MEMSET(dst, val, count) \ - memset(dst, val, count) + memset(dst, val, count) // Used to hide GCC warnings for unused function tables #ifdef __GNUC__ @@ -342,7 +342,7 @@ FORCE_INLINE void eb_memcpy(void *dstPtr, void *srcPtr, size_t size) #define EB_TYPE_PIC_STRUCT 5 // It is a requirement (for the application) that if pictureStruct is present for 1 picture it shall be present for every picture -#define Log2f EbHevcLog2f_SSE2 +#define Log2f EbHevcLog2f_SSE2 extern EB_U32 Log2f(EB_U32 x); @@ -535,16 +535,16 @@ extern EB_U32 libMutexCount; pointer = (type) _aligned_malloc(nElements,ALVALUE); \ if (pointer == (type)EB_NULL) { \ return EB_ErrorInsufficientResources; \ - } \ - else { \ + } \ + else { \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -555,17 +555,17 @@ extern EB_U32 libMutexCount; #define EB_ALLIGN_MALLOC(type, pointer, nElements, pointerClass) \ if (posix_memalign((void**)(&(pointer)), ALVALUE, nElements) != 0) { \ return EB_ErrorInsufficientResources; \ - } \ - else { \ + } \ + else { \ pointer = (type) pointer; \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -602,16 +602,16 @@ extern EB_U32 libMutexCount; pointer = (type) malloc(nElements); \ if (pointer == (type)EB_NULL) { \ return EB_ErrorInsufficientResources; \ - } \ - else { \ + } \ + else { \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -626,12 +626,12 @@ extern EB_U32 libMutexCount; else { \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (count % 8 == 0) { \ - *totalLibMemory += (count); \ - } \ - else { \ - *totalLibMemory += ((count) + (8 - ((count) % 8))); \ - } \ + if (count % 8 == 0) { \ + *totalLibMemory += (count); \ + } \ + else { \ + *totalLibMemory += ((count) + (8 - ((count) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -646,12 +646,12 @@ extern EB_U32 libMutexCount; else { \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -666,12 +666,12 @@ extern EB_U32 libMutexCount; else { \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -874,10 +874,10 @@ typedef enum EB_SEI { #define EB_INPUT_CLASS EB_U8 -#define INPUT_CLASS_C 0 -#define INPUT_CLASS_B 1 -#define INPUT_CLASS_TO_REMOVE 2 -#define INPUT_CLASS_A 3 +#define INPUT_CLASS_C 0 +#define INPUT_CLASS_B 1 +#define INPUT_CLASS_TO_REMOVE 2 +#define INPUT_CLASS_A 3 //***Profile, tier, level*** @@ -1087,8 +1087,8 @@ typedef enum EB_SEI { #define MIN_NEG_16BIT_NUM -32768 #define QUANT_OFFSET_I 171 #define QUANT_OFFSET_P 85 -#define LOW_LCU_VARIANCE 10 -#define MEDIUM_LCU_VARIANCE 50 +#define LOW_LCU_VARIANCE 10 +#define MEDIUM_LCU_VARIANCE 50 //HRD constants #define BR_SHIFT 6 @@ -1177,7 +1177,7 @@ typedef enum EB_SEI { #define BI_OFFSET2D2_10BIT 0 // Noise detection -#define NOISE_VARIANCE_TH 390 +#define NOISE_VARIANCE_TH 390 @@ -1196,34 +1196,34 @@ typedef enum EB_SEI { #define PIC_NOISE_CLASS_10 11 //Extreme Noise // Intrinisc -#define INTRINSIC_SSE2 1 +#define INTRINSIC_SSE2 1 // Enhance background macros for decimated 64x64 -#define BEA_CLASS_0_0_DEC_TH 16 * 16 // 16x16 block size * 1 -#define BEA_CLASS_0_DEC_TH 16 * 16 * 2 // 16x16 block size * 2 -#define BEA_CLASS_1_DEC_TH 16 * 16 * 4 // 16x16 block size * 4 -#define BEA_CLASS_2_DEC_TH 16 * 16 * 8 // 16x16 block size * 8 +#define BEA_CLASS_0_0_DEC_TH 16 * 16 // 16x16 block size * 1 +#define BEA_CLASS_0_DEC_TH 16 * 16 * 2 // 16x16 block size * 2 +#define BEA_CLASS_1_DEC_TH 16 * 16 * 4 // 16x16 block size * 4 +#define BEA_CLASS_2_DEC_TH 16 * 16 * 8 // 16x16 block size * 8 // Enhance background macros -#define BEA_CLASS_0_0_TH 8 * 8 // 8x8 block size * 1 +#define BEA_CLASS_0_0_TH 8 * 8 // 8x8 block size * 1 -#define BEA_CLASS_0_TH 8 * 8 * 2 // 8x8 block size * 2 -#define BEA_CLASS_1_TH 8 * 8 * 4 // 8x8 block size * 4 -#define BEA_CLASS_2_TH 8 * 8 * 8 // 8x8 block size * 8 +#define BEA_CLASS_0_TH 8 * 8 * 2 // 8x8 block size * 2 +#define BEA_CLASS_1_TH 8 * 8 * 4 // 8x8 block size * 4 +#define BEA_CLASS_2_TH 8 * 8 * 8 // 8x8 block size * 8 #define UNCOVERED_AREA_ZZ_TH 4 * 4 * 14 -#define BEA_CLASS_0_ZZ_COST 0 -#define BEA_CLASS_0_1_ZZ_COST 3 +#define BEA_CLASS_0_ZZ_COST 0 +#define BEA_CLASS_0_1_ZZ_COST 3 -#define BEA_CLASS_1_ZZ_COST 10 -#define BEA_CLASS_2_ZZ_COST 20 -#define BEA_CLASS_3_ZZ_COST 30 -#define INVALID_ZZ_COST (EB_U8) ~0 +#define BEA_CLASS_1_ZZ_COST 10 +#define BEA_CLASS_2_ZZ_COST 20 +#define BEA_CLASS_3_ZZ_COST 30 +#define INVALID_ZZ_COST (EB_U8) ~0 #define PM_NON_MOVING_INDEX_TH 23 -#define QP_OFFSET_LCU_SCORE_0 0 -#define QP_OFFSET_LCU_SCORE_1 50 -#define QP_OFFSET_LCU_SCORE_2 100 +#define QP_OFFSET_LCU_SCORE_0 0 +#define QP_OFFSET_LCU_SCORE_1 50 +#define QP_OFFSET_LCU_SCORE_2 100 #define UNCOVERED_AREA_ZZ_COST_TH 8 #define BEA_MIN_DELTA_QP_T00 1 #define BEA_MIN_DELTA_QP_T0 3 @@ -1236,51 +1236,51 @@ typedef enum EB_SEI { #define BEA_MAX_DELTA_QP 1 -#define FAILING_MOTION_DELTA_QP -5 -#define FAILING_MOTION_VAR_THRSLHD 50 +#define FAILING_MOTION_DELTA_QP -5 +#define FAILING_MOTION_VAR_THRSLHD 50 static const EB_U8 INTRA_AREA_TH_CLASS_1[MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { // [Highest Temporal Layer] [Temporal Layer Index] { 20 }, { 30, 20 }, { 40, 30, 20 }, - { 50, 40, 30, 20 }, - { 50, 40, 30, 20, 10 }, - { 50, 40, 30, 20, 10, 10 } + { 50, 40, 30, 20 }, + { 50, 40, 30, 20, 10 }, + { 50, 40, 30, 20, 10, 10 } }; // Picture split into regions for analysis (SCD, Dynamic GOP) -#define CLASS_SUB_0_REGION_SPLIT_PER_WIDTH 1 -#define CLASS_SUB_0_REGION_SPLIT_PER_HEIGHT 1 +#define CLASS_SUB_0_REGION_SPLIT_PER_WIDTH 1 +#define CLASS_SUB_0_REGION_SPLIT_PER_HEIGHT 1 -#define CLASS_1_REGION_SPLIT_PER_WIDTH 2 -#define CLASS_1_REGION_SPLIT_PER_HEIGHT 2 +#define CLASS_1_REGION_SPLIT_PER_WIDTH 2 +#define CLASS_1_REGION_SPLIT_PER_HEIGHT 2 -#define HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_WIDTH 4 -#define HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_HEIGHT 4 +#define HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_WIDTH 4 +#define HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_HEIGHT 4 // Dynamic GOP activity TH - to tune -#define DYNAMIC_GOP_SUB_1080P_L6_VS_L5_COST_TH 11 -#define DYNAMIC_GOP_SUB_1080P_L5_VS_L4_COST_TH 19 -#define DYNAMIC_GOP_SUB_1080P_L4_VS_L3_COST_TH 30 // No L4_VS_L3 - 25 is the TH after 1st round of tuning +#define DYNAMIC_GOP_SUB_1080P_L6_VS_L5_COST_TH 11 +#define DYNAMIC_GOP_SUB_1080P_L5_VS_L4_COST_TH 19 +#define DYNAMIC_GOP_SUB_1080P_L4_VS_L3_COST_TH 30 // No L4_VS_L3 - 25 is the TH after 1st round of tuning -#define DYNAMIC_GOP_ABOVE_1080P_L6_VS_L5_COST_TH 15//25//5// -#define DYNAMIC_GOP_ABOVE_1080P_L5_VS_L4_COST_TH 25//28//9// -#define DYNAMIC_GOP_ABOVE_1080P_L4_VS_L3_COST_TH 30 // No L4_VS_L3 - 28 is the TH after 1st round of tuning +#define DYNAMIC_GOP_ABOVE_1080P_L6_VS_L5_COST_TH 15//25//5// +#define DYNAMIC_GOP_ABOVE_1080P_L5_VS_L4_COST_TH 25//28//9// +#define DYNAMIC_GOP_ABOVE_1080P_L4_VS_L3_COST_TH 30 // No L4_VS_L3 - 28 is the TH after 1st round of tuning #define DYNAMIC_GOP_SUB_480P_L6_VS_L5_COST_TH 9 -#define GRADUAL_LUMINOSITY_CHANGE_TH 3 -#define FADED_LCU_PERCENTAGE_TH 10 -#define FADED_PICTURES_TH 15 -#define CLASS_SUB_0_PICTURE_ACTIVITY_REGIONS_TH 1 -#define CLASS_1_SIZE_PICTURE_ACTIVITY_REGIONS_TH 2 -#define HIGHER_THAN_CLASS_1_PICTURE_ACTIVITY_REGIONS_TH 8 +#define GRADUAL_LUMINOSITY_CHANGE_TH 3 +#define FADED_LCU_PERCENTAGE_TH 10 +#define FADED_PICTURES_TH 15 +#define CLASS_SUB_0_PICTURE_ACTIVITY_REGIONS_TH 1 +#define CLASS_1_SIZE_PICTURE_ACTIVITY_REGIONS_TH 2 +#define HIGHER_THAN_CLASS_1_PICTURE_ACTIVITY_REGIONS_TH 8 -#define IS_COMPLEX_LCU_VARIANCE_TH 100 -#define IS_COMPLEX_LCU_FLAT_VARIANCE_TH 10 -#define IS_COMPLEX_LCU_VARIANCE_DEVIATION_TH 13 -#define IS_COMPLEX_LCU_ZZ_SAD_FACTOR_TH 25 +#define IS_COMPLEX_LCU_VARIANCE_TH 100 +#define IS_COMPLEX_LCU_FLAT_VARIANCE_TH 10 +#define IS_COMPLEX_LCU_VARIANCE_DEVIATION_TH 13 +#define IS_COMPLEX_LCU_ZZ_SAD_FACTOR_TH 25 // The EB_AURA_STATUS type is used to describe the aura status #define EB_AURA_STATUS EB_U8 @@ -1291,18 +1291,18 @@ static const EB_U8 INTRA_AREA_TH_CLASS_1[MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LA #define INVALID_AURA_STATUS 128 // Aura detection definitions -#define AURA_4K_DISTORTION_TH 25 -#define AURA_4K_DISTORTION_TH_6L 20 +#define AURA_4K_DISTORTION_TH 25 +#define AURA_4K_DISTORTION_TH_6L 20 static const EB_S32 GLOBAL_MOTION_THRESHOLD[MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { // [Highest Temporal Layer] [Temporal Layer Index] - { 2 }, - { 4, 2 }, - { 8, 4, 2 }, - { 16, 8, 4, 2 }, - { 32, 16, 8, 4, 2 }, // Derived by analogy from 4-layer settings - { 64, 32, 16, 8, 4, 2 } + { 2 }, + { 4, 2 }, + { 8, 4, 2 }, + { 16, 8, 4, 2 }, + { 32, 16, 8, 4, 2 }, // Derived by analogy from 4-layer settings + { 64, 32, 16, 8, 4, 2 } }; @@ -1313,25 +1313,25 @@ static const EB_S32 GLOBAL_MOTION_THRESHOLD[MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL #define INVALID_PRED_ERROR_CLASS 128 #define EB_SCD_MODE EB_U8 -#define SCD_MODE_0 0 // SCD OFF -#define SCD_MODE_1 1 // Light SCD (histograms generation on the 1/16 decimated input) -#define SCD_MODE_2 2 // Full SCD +#define SCD_MODE_0 0 // SCD OFF +#define SCD_MODE_1 1 // Light SCD (histograms generation on the 1/16 decimated input) +#define SCD_MODE_2 2 // Full SCD #define EB_NOISE_DETECT_MODE EB_U8 -#define NOISE_DETECT_HALF_PRECISION 0 // Use Half-pel decimated input to detect noise -#define NOISE_DETECT_QUARTER_PRECISION 1 // Use Quarter-pel decimated input to detect noise -#define NOISE_DETECT_FULL_PRECISION 2 // Use Full-pel decimated input to detect noise +#define NOISE_DETECT_HALF_PRECISION 0 // Use Half-pel decimated input to detect noise +#define NOISE_DETECT_QUARTER_PRECISION 1 // Use Quarter-pel decimated input to detect noise +#define NOISE_DETECT_FULL_PRECISION 2 // Use Full-pel decimated input to detect noise #define EB_PM_MODE EB_U8 -#define PM_MODE_0 1 // 2-stage PM 4K -#define PM_MODE_1 2 // 2-stage PM Sub 4K +#define PM_MODE_0 1 // 2-stage PM 4K +#define PM_MODE_1 2 // 2-stage PM Sub 4K #define EB_ZZ_SAD_MODE EB_U8 -#define ZZ_SAD_MODE_0 0 // ZZ SAD on Decimated resolution -#define ZZ_SAD_MODE_1 1 // ZZ SAD on Full resolution +#define ZZ_SAD_MODE_0 0 // ZZ SAD on Decimated resolution +#define ZZ_SAD_MODE_1 1 // ZZ SAD on Full resolution #define EB_PF_MODE EB_U8 #define PF_OFF 0 @@ -1363,13 +1363,13 @@ typedef enum EB_SAO_MODE { } EB_SAO_MODE; typedef enum EB_CU_16x16_MODE { - CU_16x16_MODE_0 = 0, // Perform OIS, Full_Search, Fractional_Search & Bipred for CU_16x16 - CU_16x16_MODE_1 = 1 // Perform OIS and only Full_Search for CU_16x16 + CU_16x16_MODE_0 = 0, // Perform OIS, Full_Search, Fractional_Search & Bipred for CU_16x16 + CU_16x16_MODE_1 = 1 // Perform OIS and only Full_Search for CU_16x16 } EB_CU_16x16_MODE; typedef enum EB_CU_8x8_MODE { - CU_8x8_MODE_0 = 0, // Perform OIS, Full_Search, Fractional_Search & Bipred for CU_8x8 - CU_8x8_MODE_1 = 1 // Do not perform OIS @ P/B Slices and only Full_Search for CU_8x8 + CU_8x8_MODE_0 = 0, // Perform OIS, Full_Search, Fractional_Search & Bipred for CU_8x8 + CU_8x8_MODE_1 = 1 // Do not perform OIS @ P/B Slices and only Full_Search for CU_8x8 } EB_CU_8x8_MODE; typedef enum EB_PICTURE_DEPTH_MODE { @@ -1418,11 +1418,11 @@ typedef enum EB_ADP_REFINEMENT_MODE { typedef enum EB_MD_STAGE { - MDC_STAGE = 0, - BDP_PILLAR_STAGE = 1, - BDP_64X64_32X32_REF_STAGE = 2, - BDP_16X16_8X8_REF_STAGE = 3, - BDP_MVMERGE_STAGE = 4 + MDC_STAGE = 0, + BDP_PILLAR_STAGE = 1, + BDP_64X64_32X32_REF_STAGE = 2, + BDP_16X16_8X8_REF_STAGE = 3, + BDP_MVMERGE_STAGE = 4 } EB_MD_STAGE; @@ -1435,204 +1435,204 @@ typedef enum EB_MD_STAGE { static const EB_S32 HME_LEVEL_0_SEARCH_AREA_MULTIPLIER_X[MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { // [Highest Temporal Layer] [Temporal Layer Index] - { 100 }, - { 100, 100 }, - { 100, 100, 100 }, - { 200, 140, 100, 70 }, - { 350, 200, 100, 100, 100 }, - { 525, 350, 200, 100, 100, 100 } + { 100 }, + { 100, 100 }, + { 100, 100, 100 }, + { 200, 140, 100, 70 }, + { 350, 200, 100, 100, 100 }, + { 525, 350, 200, 100, 100, 100 } }; static const EB_S32 HME_LEVEL_0_SEARCH_AREA_MULTIPLIER_Y[MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { // [Highest Temporal Layer] [Temporal Layer Index] - { 100 }, - { 100, 100 }, - { 100, 100, 100 }, - { 200, 140, 100, 70 }, - { 350, 200, 100, 100, 100 }, - { 525, 350, 200, 100, 100, 100 } + { 100 }, + { 100, 100 }, + { 100, 100, 100 }, + { 200, 140, 100, 70 }, + { 350, 200, 100, 100, 100 }, + { 525, 350, 200, 100, 100, 100 } }; typedef enum RASTER_SCAN_CU_INDEX { - // 2Nx2N [85 partitions] - RASTER_SCAN_CU_INDEX_64x64 = 0, - RASTER_SCAN_CU_INDEX_32x32_0 = 1, - RASTER_SCAN_CU_INDEX_32x32_1 = 2, - RASTER_SCAN_CU_INDEX_32x32_2 = 3, - RASTER_SCAN_CU_INDEX_32x32_3 = 4, - RASTER_SCAN_CU_INDEX_16x16_0 = 5, - RASTER_SCAN_CU_INDEX_16x16_1 = 6, - RASTER_SCAN_CU_INDEX_16x16_2 = 7, - RASTER_SCAN_CU_INDEX_16x16_3 = 8, - RASTER_SCAN_CU_INDEX_16x16_4 = 9, - RASTER_SCAN_CU_INDEX_16x16_5 = 10, - RASTER_SCAN_CU_INDEX_16x16_6 = 11, - RASTER_SCAN_CU_INDEX_16x16_7 = 12, - RASTER_SCAN_CU_INDEX_16x16_8 = 13, - RASTER_SCAN_CU_INDEX_16x16_9 = 14, - RASTER_SCAN_CU_INDEX_16x16_10 = 15, - RASTER_SCAN_CU_INDEX_16x16_11 = 16, - RASTER_SCAN_CU_INDEX_16x16_12 = 17, - RASTER_SCAN_CU_INDEX_16x16_13 = 18, - RASTER_SCAN_CU_INDEX_16x16_14 = 19, - RASTER_SCAN_CU_INDEX_16x16_15 = 20, - RASTER_SCAN_CU_INDEX_8x8_0 = 21, - RASTER_SCAN_CU_INDEX_8x8_1 = 22, - RASTER_SCAN_CU_INDEX_8x8_2 = 23, - RASTER_SCAN_CU_INDEX_8x8_3 = 24, - RASTER_SCAN_CU_INDEX_8x8_4 = 25, - RASTER_SCAN_CU_INDEX_8x8_5 = 26, - RASTER_SCAN_CU_INDEX_8x8_6 = 27, - RASTER_SCAN_CU_INDEX_8x8_7 = 28, - RASTER_SCAN_CU_INDEX_8x8_8 = 29, - RASTER_SCAN_CU_INDEX_8x8_9 = 30, - RASTER_SCAN_CU_INDEX_8x8_10 = 31, - RASTER_SCAN_CU_INDEX_8x8_11 = 32, - RASTER_SCAN_CU_INDEX_8x8_12 = 33, - RASTER_SCAN_CU_INDEX_8x8_13 = 34, - RASTER_SCAN_CU_INDEX_8x8_14 = 35, - RASTER_SCAN_CU_INDEX_8x8_15 = 36, - RASTER_SCAN_CU_INDEX_8x8_16 = 37, - RASTER_SCAN_CU_INDEX_8x8_17 = 38, - RASTER_SCAN_CU_INDEX_8x8_18 = 39, - RASTER_SCAN_CU_INDEX_8x8_19 = 40, - RASTER_SCAN_CU_INDEX_8x8_20 = 41, - RASTER_SCAN_CU_INDEX_8x8_21 = 42, - RASTER_SCAN_CU_INDEX_8x8_22 = 43, - RASTER_SCAN_CU_INDEX_8x8_23 = 44, - RASTER_SCAN_CU_INDEX_8x8_24 = 45, - RASTER_SCAN_CU_INDEX_8x8_25 = 46, - RASTER_SCAN_CU_INDEX_8x8_26 = 47, - RASTER_SCAN_CU_INDEX_8x8_27 = 48, - RASTER_SCAN_CU_INDEX_8x8_28 = 49, - RASTER_SCAN_CU_INDEX_8x8_29 = 50, - RASTER_SCAN_CU_INDEX_8x8_30 = 51, - RASTER_SCAN_CU_INDEX_8x8_31 = 52, - RASTER_SCAN_CU_INDEX_8x8_32 = 53, - RASTER_SCAN_CU_INDEX_8x8_33 = 54, - RASTER_SCAN_CU_INDEX_8x8_34 = 55, - RASTER_SCAN_CU_INDEX_8x8_35 = 56, - RASTER_SCAN_CU_INDEX_8x8_36 = 57, - RASTER_SCAN_CU_INDEX_8x8_37 = 58, - RASTER_SCAN_CU_INDEX_8x8_38 = 59, - RASTER_SCAN_CU_INDEX_8x8_39 = 60, - RASTER_SCAN_CU_INDEX_8x8_40 = 61, - RASTER_SCAN_CU_INDEX_8x8_41 = 62, - RASTER_SCAN_CU_INDEX_8x8_42 = 63, - RASTER_SCAN_CU_INDEX_8x8_43 = 64, - RASTER_SCAN_CU_INDEX_8x8_44 = 65, - RASTER_SCAN_CU_INDEX_8x8_45 = 66, - RASTER_SCAN_CU_INDEX_8x8_46 = 67, - RASTER_SCAN_CU_INDEX_8x8_47 = 68, - RASTER_SCAN_CU_INDEX_8x8_48 = 69, - RASTER_SCAN_CU_INDEX_8x8_49 = 70, - RASTER_SCAN_CU_INDEX_8x8_50 = 71, - RASTER_SCAN_CU_INDEX_8x8_51 = 72, - RASTER_SCAN_CU_INDEX_8x8_52 = 73, - RASTER_SCAN_CU_INDEX_8x8_53 = 74, - RASTER_SCAN_CU_INDEX_8x8_54 = 75, - RASTER_SCAN_CU_INDEX_8x8_55 = 76, - RASTER_SCAN_CU_INDEX_8x8_56 = 77, - RASTER_SCAN_CU_INDEX_8x8_57 = 78, - RASTER_SCAN_CU_INDEX_8x8_58 = 79, - RASTER_SCAN_CU_INDEX_8x8_59 = 80, - RASTER_SCAN_CU_INDEX_8x8_60 = 81, - RASTER_SCAN_CU_INDEX_8x8_61 = 82, - RASTER_SCAN_CU_INDEX_8x8_62 = 83, - RASTER_SCAN_CU_INDEX_8x8_63 = 84 + // 2Nx2N [85 partitions] + RASTER_SCAN_CU_INDEX_64x64 = 0, + RASTER_SCAN_CU_INDEX_32x32_0 = 1, + RASTER_SCAN_CU_INDEX_32x32_1 = 2, + RASTER_SCAN_CU_INDEX_32x32_2 = 3, + RASTER_SCAN_CU_INDEX_32x32_3 = 4, + RASTER_SCAN_CU_INDEX_16x16_0 = 5, + RASTER_SCAN_CU_INDEX_16x16_1 = 6, + RASTER_SCAN_CU_INDEX_16x16_2 = 7, + RASTER_SCAN_CU_INDEX_16x16_3 = 8, + RASTER_SCAN_CU_INDEX_16x16_4 = 9, + RASTER_SCAN_CU_INDEX_16x16_5 = 10, + RASTER_SCAN_CU_INDEX_16x16_6 = 11, + RASTER_SCAN_CU_INDEX_16x16_7 = 12, + RASTER_SCAN_CU_INDEX_16x16_8 = 13, + RASTER_SCAN_CU_INDEX_16x16_9 = 14, + RASTER_SCAN_CU_INDEX_16x16_10 = 15, + RASTER_SCAN_CU_INDEX_16x16_11 = 16, + RASTER_SCAN_CU_INDEX_16x16_12 = 17, + RASTER_SCAN_CU_INDEX_16x16_13 = 18, + RASTER_SCAN_CU_INDEX_16x16_14 = 19, + RASTER_SCAN_CU_INDEX_16x16_15 = 20, + RASTER_SCAN_CU_INDEX_8x8_0 = 21, + RASTER_SCAN_CU_INDEX_8x8_1 = 22, + RASTER_SCAN_CU_INDEX_8x8_2 = 23, + RASTER_SCAN_CU_INDEX_8x8_3 = 24, + RASTER_SCAN_CU_INDEX_8x8_4 = 25, + RASTER_SCAN_CU_INDEX_8x8_5 = 26, + RASTER_SCAN_CU_INDEX_8x8_6 = 27, + RASTER_SCAN_CU_INDEX_8x8_7 = 28, + RASTER_SCAN_CU_INDEX_8x8_8 = 29, + RASTER_SCAN_CU_INDEX_8x8_9 = 30, + RASTER_SCAN_CU_INDEX_8x8_10 = 31, + RASTER_SCAN_CU_INDEX_8x8_11 = 32, + RASTER_SCAN_CU_INDEX_8x8_12 = 33, + RASTER_SCAN_CU_INDEX_8x8_13 = 34, + RASTER_SCAN_CU_INDEX_8x8_14 = 35, + RASTER_SCAN_CU_INDEX_8x8_15 = 36, + RASTER_SCAN_CU_INDEX_8x8_16 = 37, + RASTER_SCAN_CU_INDEX_8x8_17 = 38, + RASTER_SCAN_CU_INDEX_8x8_18 = 39, + RASTER_SCAN_CU_INDEX_8x8_19 = 40, + RASTER_SCAN_CU_INDEX_8x8_20 = 41, + RASTER_SCAN_CU_INDEX_8x8_21 = 42, + RASTER_SCAN_CU_INDEX_8x8_22 = 43, + RASTER_SCAN_CU_INDEX_8x8_23 = 44, + RASTER_SCAN_CU_INDEX_8x8_24 = 45, + RASTER_SCAN_CU_INDEX_8x8_25 = 46, + RASTER_SCAN_CU_INDEX_8x8_26 = 47, + RASTER_SCAN_CU_INDEX_8x8_27 = 48, + RASTER_SCAN_CU_INDEX_8x8_28 = 49, + RASTER_SCAN_CU_INDEX_8x8_29 = 50, + RASTER_SCAN_CU_INDEX_8x8_30 = 51, + RASTER_SCAN_CU_INDEX_8x8_31 = 52, + RASTER_SCAN_CU_INDEX_8x8_32 = 53, + RASTER_SCAN_CU_INDEX_8x8_33 = 54, + RASTER_SCAN_CU_INDEX_8x8_34 = 55, + RASTER_SCAN_CU_INDEX_8x8_35 = 56, + RASTER_SCAN_CU_INDEX_8x8_36 = 57, + RASTER_SCAN_CU_INDEX_8x8_37 = 58, + RASTER_SCAN_CU_INDEX_8x8_38 = 59, + RASTER_SCAN_CU_INDEX_8x8_39 = 60, + RASTER_SCAN_CU_INDEX_8x8_40 = 61, + RASTER_SCAN_CU_INDEX_8x8_41 = 62, + RASTER_SCAN_CU_INDEX_8x8_42 = 63, + RASTER_SCAN_CU_INDEX_8x8_43 = 64, + RASTER_SCAN_CU_INDEX_8x8_44 = 65, + RASTER_SCAN_CU_INDEX_8x8_45 = 66, + RASTER_SCAN_CU_INDEX_8x8_46 = 67, + RASTER_SCAN_CU_INDEX_8x8_47 = 68, + RASTER_SCAN_CU_INDEX_8x8_48 = 69, + RASTER_SCAN_CU_INDEX_8x8_49 = 70, + RASTER_SCAN_CU_INDEX_8x8_50 = 71, + RASTER_SCAN_CU_INDEX_8x8_51 = 72, + RASTER_SCAN_CU_INDEX_8x8_52 = 73, + RASTER_SCAN_CU_INDEX_8x8_53 = 74, + RASTER_SCAN_CU_INDEX_8x8_54 = 75, + RASTER_SCAN_CU_INDEX_8x8_55 = 76, + RASTER_SCAN_CU_INDEX_8x8_56 = 77, + RASTER_SCAN_CU_INDEX_8x8_57 = 78, + RASTER_SCAN_CU_INDEX_8x8_58 = 79, + RASTER_SCAN_CU_INDEX_8x8_59 = 80, + RASTER_SCAN_CU_INDEX_8x8_60 = 81, + RASTER_SCAN_CU_INDEX_8x8_61 = 82, + RASTER_SCAN_CU_INDEX_8x8_62 = 83, + RASTER_SCAN_CU_INDEX_8x8_63 = 84 } RASTER_SCAN_CU_INDEX; static const EB_U32 RASTER_SCAN_CU_X[CU_MAX_COUNT] = { - 0, - 0, 32, - 0, 32, - 0, 16, 32, 48, - 0, 16, 32, 48, - 0, 16, 32, 48, - 0, 16, 32, 48, - 0, 8, 16, 24, 32, 40, 48, 56, - 0, 8, 16, 24, 32, 40, 48, 56, - 0, 8, 16, 24, 32, 40, 48, 56, - 0, 8, 16, 24, 32, 40, 48, 56, - 0, 8, 16, 24, 32, 40, 48, 56, - 0, 8, 16, 24, 32, 40, 48, 56, - 0, 8, 16, 24, 32, 40, 48, 56, - 0, 8, 16, 24, 32, 40, 48, 56 + 0, + 0, 32, + 0, 32, + 0, 16, 32, 48, + 0, 16, 32, 48, + 0, 16, 32, 48, + 0, 16, 32, 48, + 0, 8, 16, 24, 32, 40, 48, 56, + 0, 8, 16, 24, 32, 40, 48, 56, + 0, 8, 16, 24, 32, 40, 48, 56, + 0, 8, 16, 24, 32, 40, 48, 56, + 0, 8, 16, 24, 32, 40, 48, 56, + 0, 8, 16, 24, 32, 40, 48, 56, + 0, 8, 16, 24, 32, 40, 48, 56, + 0, 8, 16, 24, 32, 40, 48, 56 }; static const EB_U32 RASTER_SCAN_CU_Y[CU_MAX_COUNT] = { - 0, - 0, 0, - 32, 32, - 0, 0, 0, 0, - 16, 16, 16, 16, - 32, 32, 32, 32, - 48, 48, 48, 48, - 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 8, 8, 8, 8, 8, 8, - 16, 16, 16, 16, 16, 16, 16, 16, - 24, 24, 24, 24, 24, 24, 24, 24, - 32, 32, 32, 32, 32, 32, 32, 32, - 40, 40, 40, 40, 40, 40, 40, 40, - 48, 48, 48, 48, 48, 48, 48, 48, - 56, 56, 56, 56, 56, 56, 56, 56 + 0, + 0, 0, + 32, 32, + 0, 0, 0, 0, + 16, 16, 16, 16, + 32, 32, 32, 32, + 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, + 16, 16, 16, 16, 16, 16, 16, 16, + 24, 24, 24, 24, 24, 24, 24, 24, + 32, 32, 32, 32, 32, 32, 32, 32, + 40, 40, 40, 40, 40, 40, 40, 40, + 48, 48, 48, 48, 48, 48, 48, 48, + 56, 56, 56, 56, 56, 56, 56, 56 }; static const EB_U32 RASTER_SCAN_CU_SIZE[CU_MAX_COUNT] = -{ 64, - 32, 32, - 32, 32, - 16, 16, 16, 16, - 16, 16, 16, 16, - 16, 16, 16, 16, - 16, 16, 16, 16, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8 +{ 64, + 32, 32, + 32, 32, + 16, 16, 16, 16, + 16, 16, 16, 16, + 16, 16, 16, 16, + 16, 16, 16, 16, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8 }; static const EB_U32 RASTER_SCAN_CU_DEPTH[CU_MAX_COUNT] = -{ 0, - 1, 1, - 1, 1, - 2, 2, 2, 2, - 2, 2, 2, 2, - 2, 2, 2, 2, - 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3 +{ 0, + 1, 1, + 1, 1, + 2, 2, 2, 2, + 2, 2, 2, 2, + 2, 2, 2, 2, + 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3 }; static const EB_U32 RASTER_SCAN_TO_MD_SCAN[CU_MAX_COUNT] = { - 0, - 1, 22, - 43, 64, - 2, 7, 23, 28, - 12, 17, 33, 38, - 44, 49, 65, 70, - 54, 59, 75, 80, - 3, 4, 8, 9, 24, 25, 29, 30, - 5, 6, 10, 11, 26, 27, 31, 32, - 13, 14, 18, 19, 34, 35, 39, 40, - 15, 16, 20, 21, 36, 37, 41, 42, - 45, 46, 50, 51, 66, 67, 71, 72, - 47, 48, 52, 53, 68, 69, 73, 74, - 55, 56, 60, 61, 76, 77, 81, 82, - 57, 58, 62, 63, 78, 79, 83, 84 + 0, + 1, 22, + 43, 64, + 2, 7, 23, 28, + 12, 17, 33, 38, + 44, 49, 65, 70, + 54, 59, 75, 80, + 3, 4, 8, 9, 24, 25, 29, 30, + 5, 6, 10, 11, 26, 27, 31, 32, + 13, 14, 18, 19, 34, 35, 39, 40, + 15, 16, 20, 21, 36, 37, 41, 42, + 45, 46, 50, 51, 66, 67, 71, 72, + 47, 48, 52, 53, 68, 69, 73, 74, + 55, 56, 60, 61, 76, 77, 81, 82, + 57, 58, 62, 63, 78, 79, 83, 84 }; static const EB_U32 ParentBlockIndex[85] = { 0, 0, 0, 2, 2, 2, 2, 0, 7, 7, 7, 7, 0, 12, 12, 12, 12, 0, 17, 17, 17, 17, 0, 0, @@ -1642,27 +1642,27 @@ static const EB_U32 ParentBlockIndex[85] = { 0, 0, 0, 2, 2, 2, 2, 0, 7, 7, 7, 7, static const EB_U32 MD_SCAN_TO_RASTER_SCAN[CU_MAX_COUNT] = { - 0, - 1, - 5, 21, 22, 29, 30, - 6, 23, 24, 31, 32, - 9, 37, 38, 45, 46, - 10, 39, 40, 47, 48, - 2, - 7, 25, 26, 33, 34, - 8, 27, 28, 35, 36, - 11, 41, 42, 49, 50, - 12, 43, 44, 51, 52, - 3, - 13, 53, 54, 61, 62, - 14, 55, 56, 63, 64, - 17, 69, 70, 77, 78, - 18, 71, 72, 79, 80, - 4, - 15, 57, 58, 65, 66, - 16, 59, 60, 67, 68, - 19, 73, 74, 81, 82, - 20, 75, 76, 83, 84 + 0, + 1, + 5, 21, 22, 29, 30, + 6, 23, 24, 31, 32, + 9, 37, 38, 45, 46, + 10, 39, 40, 47, 48, + 2, + 7, 25, 26, 33, 34, + 8, 27, 28, 35, 36, + 11, 41, 42, 49, 50, + 12, 43, 44, 51, 52, + 3, + 13, 53, 54, 61, 62, + 14, 55, 56, 63, 64, + 17, 69, 70, 77, 78, + 18, 71, 72, 79, 80, + 4, + 15, 57, 58, 65, 66, + 16, 59, 60, 67, 68, + 19, 73, 74, 81, 82, + 20, 75, 76, 83, 84 }; static const EB_U32 RASTER_SCAN_CU_PARENT_INDEX[CU_MAX_COUNT] = @@ -1779,77 +1779,77 @@ static const EB_U32 MD_SCAN_TO_OIS_32x32_SCAN[CU_MAX_COUNT] = *******************************************************************************/ // M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 static const EB_U8 EnableHmeLevel0FlagOq[5][MAX_SUPPORTED_MODES] = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_576p_RANGE_OR_LOWER - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_720P_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080i_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080p_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_4K_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_576p_RANGE_OR_LOWER + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_720P_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080i_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080p_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_4K_RANGE }; static const EB_U16 HmeLevel0TotalSearchAreaWidthOq[5][MAX_SUPPORTED_MODES] = { - { 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32 }, - { 64, 64, 64, 64, 64, 64, 64, 48, 48, 48, 48, 48 }, - { 96, 96, 96, 96, 96, 96, 96, 64, 64, 48, 48, 48 }, - { 96, 96, 96, 96, 96, 96, 96, 64, 64, 48, 48, 48 }, - { 128, 128, 128, 128, 64, 64, 64, 64, 64, 64, 64, 64 } + { 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32 }, + { 64, 64, 64, 64, 64, 64, 64, 48, 48, 48, 48, 48 }, + { 96, 96, 96, 96, 96, 96, 96, 64, 64, 48, 48, 48 }, + { 96, 96, 96, 96, 96, 96, 96, 64, 64, 48, 48, 48 }, + { 128, 128, 128, 128, 64, 64, 64, 64, 64, 64, 64, 64 } }; static const EB_U16 HmeLevel0SearchAreaInWidthArrayLeftOq[5][MAX_SUPPORTED_MODES] = { - { 24, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 16 }, - { 32, 32, 32, 32, 32, 32, 32, 24, 24, 24, 24, 24 }, - { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, - { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, - { 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32 } + { 24, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 16 }, + { 32, 32, 32, 32, 32, 32, 32, 24, 24, 24, 24, 24 }, + { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, + { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, + { 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32 } }; static const EB_U16 HmeLevel0SearchAreaInWidthArrayRightOq[5][MAX_SUPPORTED_MODES] = { - { 24, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 16 }, - { 32, 32, 32, 32, 32, 32, 32, 24, 24, 24, 24, 24 }, - { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, - { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, - { 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32 } + { 24, 24, 24, 24, 24, 24, 24, 24, 24, 16, 16, 16 }, + { 32, 32, 32, 32, 32, 32, 32, 24, 24, 24, 24, 24 }, + { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, + { 48, 48, 48, 48, 48, 48, 48, 32, 32, 24, 24, 24 }, + { 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32 } }; static const EB_U16 HmeLevel0TotalSearchAreaHeightOq[5][MAX_SUPPORTED_MODES] = { - { 40, 40, 40, 40, 40, 32, 32, 32, 32, 24, 24, 24 }, - { 48, 48, 48, 48, 48, 40, 40, 40, 40, 32, 32, 32 }, - { 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32 }, - { 48, 48, 48, 48, 48, 48, 48, 48, 48, 40, 40, 40 }, - { 80, 80, 80, 80, 32, 32, 32, 32, 32, 32, 32, 32 } + { 40, 40, 40, 40, 40, 32, 32, 32, 32, 24, 24, 24 }, + { 48, 48, 48, 48, 48, 40, 40, 40, 40, 32, 32, 32 }, + { 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32 }, + { 48, 48, 48, 48, 48, 48, 48, 48, 48, 40, 40, 40 }, + { 80, 80, 80, 80, 32, 32, 32, 32, 32, 32, 32, 32 } }; static const EB_U16 HmeLevel0SearchAreaInHeightArrayTopOq[5][MAX_SUPPORTED_MODES] = { - { 20, 20, 20, 20, 20, 16, 16, 16, 16, 12, 12, 12 }, - { 24, 24, 24, 24, 24, 20, 20, 20, 20, 16, 16, 16 }, - { 24, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16 }, - { 24, 24, 24, 24, 24, 24, 24, 24, 24, 20, 20, 20 }, - { 40, 40, 40, 40, 16, 16, 16, 16, 16, 16, 16, 16 } + { 20, 20, 20, 20, 20, 16, 16, 16, 16, 12, 12, 12 }, + { 24, 24, 24, 24, 24, 20, 20, 20, 20, 16, 16, 16 }, + { 24, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16 }, + { 24, 24, 24, 24, 24, 24, 24, 24, 24, 20, 20, 20 }, + { 40, 40, 40, 40, 16, 16, 16, 16, 16, 16, 16, 16 } }; static const EB_U16 HmeLevel0SearchAreaInHeightArrayBottomOq[5][MAX_SUPPORTED_MODES] = { - { 20, 20, 20, 20, 20, 16, 16, 16, 16, 12, 12, 12 }, - { 24, 24, 24, 24, 24, 20, 20, 20, 20, 16, 16, 16 }, - { 24, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16 }, - { 24, 24, 24, 24, 24, 24, 24, 24, 24, 20, 20, 20 }, - { 40, 40, 40, 40, 16, 16, 16, 16, 16, 16, 16, 16 } + { 20, 20, 20, 20, 20, 16, 16, 16, 16, 12, 12, 12 }, + { 24, 24, 24, 24, 24, 20, 20, 20, 20, 16, 16, 16 }, + { 24, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16 }, + { 24, 24, 24, 24, 24, 24, 24, 24, 24, 20, 20, 20 }, + { 40, 40, 40, 40, 16, 16, 16, 16, 16, 16, 16, 16 } }; // HME LEVEL 1 // M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 static const EB_U8 EnableHmeLevel1FlagOq[5][MAX_SUPPORTED_MODES] = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_576p_RANGE_OR_LOWER - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_720P_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080i_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080p_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 } // INPUT_SIZE_4K_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_576p_RANGE_OR_LOWER + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_720P_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080i_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // INPUT_SIZE_1080p_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 } // INPUT_SIZE_4K_RANGE }; static const EB_U16 HmeLevel1SearchAreaInWidthArrayLeftOq[5][MAX_SUPPORTED_MODES] = { - { 16, 16, 16, 16, 8, 8, 8, 8, 8, 4, 4, 4 }, - { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, - { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, - { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, - { 16, 16, 16, 16, 4, 4, 4, 4, 0, 0, 0, 0 } + { 16, 16, 16, 16, 8, 8, 8, 8, 8, 4, 4, 4 }, + { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, + { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, + { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, + { 16, 16, 16, 16, 4, 4, 4, 4, 0, 0, 0, 0 } }; static const EB_U16 HmeLevel1SearchAreaInWidthArrayRightOq[5][MAX_SUPPORTED_MODES] = { - { 16, 16, 16, 16, 8, 8, 8, 8, 8, 4, 4, 4 }, - { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, - { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, - { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, + { 16, 16, 16, 16, 8, 8, 8, 8, 8, 4, 4, 4 }, + { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, + { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, + { 16, 16, 16, 16, 8, 8, 8, 4, 4, 4, 4, 4 }, { 16, 16, 16, 16, 4, 4, 4, 4, 0, 0, 0, 0 } }; static const EB_U16 HmeLevel1SearchAreaInHeightArrayTopOq[5][MAX_SUPPORTED_MODES] = { @@ -1869,55 +1869,55 @@ static const EB_U16 HmeLevel1SearchAreaInHeightArrayBottomOq[5][MAX_SUPPORTED_MO // HME LEVEL 2 // M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 static const EB_U8 EnableHmeLevel2FlagOq[5][MAX_SUPPORTED_MODES] = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, // INPUT_SIZE_576p_RANGE_OR_LOWER - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // INPUT_SIZE_720P_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // INPUT_SIZE_1080i_RANGE - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // INPUT_SIZE_1080p_RANGE - { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 } // INPUT_SIZE_4K_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, // INPUT_SIZE_576p_RANGE_OR_LOWER + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // INPUT_SIZE_720P_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // INPUT_SIZE_1080i_RANGE + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // INPUT_SIZE_1080p_RANGE + { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 } // INPUT_SIZE_4K_RANGE }; static const EB_U16 HmeLevel2SearchAreaInWidthArrayLeftOq[5][MAX_SUPPORTED_MODES] = { - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, - { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, + { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } }; static const EB_U16 HmeLevel2SearchAreaInWidthArrayRightOq[5][MAX_SUPPORTED_MODES] = { - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, - { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 0, 0, 0 }, + { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } }; static const EB_U16 HmeLevel2SearchAreaInHeightArrayTopOq[5][MAX_SUPPORTED_MODES] = { - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 2, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 2, 2, 2, 2, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, - { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 2, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 2, 2, 2, 2, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, + { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } }; static const EB_U16 HmeLevel2SearchAreaInHeightArrayBottomOq[5][MAX_SUPPORTED_MODES] = { - { 8, 8, 8, 8, 4, 4, 4, 4, 4, 2, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 2, 2, 2, 2, 0, 0, 0 }, - { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, - { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } + { 8, 8, 8, 8, 4, 4, 4, 4, 4, 2, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 2, 2, 2, 2, 0, 0, 0 }, + { 8, 8, 8, 8, 4, 4, 4, 2, 2, 0, 0, 0 }, + { 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0 } }; static const EB_U8 SearchAreaWidthOq[5][MAX_SUPPORTED_MODES] = { - { 64, 64, 64, 64, 16, 16, 16, 16, 16, 16, 8, 8 }, - { 64, 64, 64, 64, 16, 16, 16, 16, 16, 8, 8, 8 }, - { 64, 64, 64, 64, 16, 16, 16, 16, 16, 8, 8, 8 }, - { 64, 64, 64, 64, 16, 16, 16, 16, 16, 8, 8, 8 }, - { 64, 64, 64, 64, 16, 16, 16, 16, 8, 8, 8, 8 } + { 64, 64, 64, 64, 16, 16, 16, 16, 16, 16, 8, 8 }, + { 64, 64, 64, 64, 16, 16, 16, 16, 16, 8, 8, 8 }, + { 64, 64, 64, 64, 16, 16, 16, 16, 16, 8, 8, 8 }, + { 64, 64, 64, 64, 16, 16, 16, 16, 16, 8, 8, 8 }, + { 64, 64, 64, 64, 16, 16, 16, 16, 8, 8, 8, 8 } }; static const EB_U8 SearchAreaHeightOq[5][MAX_SUPPORTED_MODES] = { - { 64, 64, 64, 64, 16, 9, 9, 9, 9, 7, 7, 7 }, - { 64, 64, 64, 64, 16, 13, 13, 9, 9, 7, 7, 7 }, - { 64, 64, 64, 64, 16, 9, 9, 7, 7, 7, 7, 7 }, - { 64, 64, 64, 64, 16, 13, 13, 9, 9, 7, 7, 7 }, - { 64, 64, 64, 64, 9, 9, 9, 9, 7, 7, 7, 5 } + { 64, 64, 64, 64, 16, 9, 9, 9, 9, 7, 7, 7 }, + { 64, 64, 64, 64, 16, 13, 13, 9, 9, 7, 7, 7 }, + { 64, 64, 64, 64, 16, 9, 9, 7, 7, 7, 7, 7 }, + { 64, 64, 64, 64, 16, 13, 13, 9, 9, 7, 7, 7 }, + { 64, 64, 64, 64, 9, 9, 9, 9, 7, 7, 7, 5 } }; #define MAX_SUPPORTED_SEGMENTS 7 diff --git a/Source/Lib/Codec/EbEncDecProcess.c b/Source/Lib/Codec/EbEncDecProcess.c index 9ab344e5d..1abf5b5c3 100644 --- a/Source/Lib/Codec/EbEncDecProcess.c +++ b/Source/Lib/Codec/EbEncDecProcess.c @@ -1366,7 +1366,7 @@ static void ResetEncDec( contextPtr->qp = pictureControlSetPtr->pictureQp; // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - EB_U8 qpScaled = CLIP3(MIN_QP_VALUE, MAX_CHROMA_MAP_QP_VALUE, (EB_S32)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + EB_U8 qpScaled = CLIP3(MIN_QP_VALUE, MAX_CHROMA_MAP_QP_VALUE, (EB_S32)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); contextPtr->chromaQp = (EB_U8)MapChromaQp(qpScaled); // Lambda Assignement @@ -1455,7 +1455,7 @@ static void EncDecConfigureLcu( } // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); contextPtr->chromaQp = MapChromaQp(qpScaled); /* Note(CHKN) : when Qp modulation varies QP on a sub-LCU(CU) basis, Lamda has to change based on Cu->QP , and then this code has to move inside the CU loop in MD */ @@ -1982,20 +1982,20 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( EB_ERRORTYPE return_error = EB_ErrorNone; // Set MD Open Loop Flag - if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->intraMdOpenLoopFlag = EB_FALSE; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->mdContext->intraMdOpenLoopFlag = pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE ? EB_FALSE : EB_TRUE; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - contextPtr->mdContext->intraMdOpenLoopFlag = pictureControlSetPtr->temporalLayerIndex == 0 ? EB_FALSE : EB_TRUE; - } - else { - contextPtr->mdContext->intraMdOpenLoopFlag = pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE ? EB_FALSE : EB_TRUE; - } - } + if (pictureControlSetPtr->encMode <= ENC_MODE_2) { + contextPtr->mdContext->intraMdOpenLoopFlag = EB_FALSE; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + contextPtr->mdContext->intraMdOpenLoopFlag = pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE ? EB_FALSE : EB_TRUE; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + contextPtr->mdContext->intraMdOpenLoopFlag = pictureControlSetPtr->temporalLayerIndex == 0 ? EB_FALSE : EB_TRUE; + } + else { + contextPtr->mdContext->intraMdOpenLoopFlag = pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE ? EB_FALSE : EB_TRUE; + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_10) { contextPtr->mdContext->intraMdOpenLoopFlag = pictureControlSetPtr->temporalLayerIndex == 0 ? EB_FALSE : EB_TRUE; } @@ -2007,36 +2007,36 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 1 : Enhanced I_PICTURE, Default (OIS) otherwise // 2 : 35 modes if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->intraInjectionMethod = 2; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_9) { - contextPtr->mdContext->intraInjectionMethod = 1; - } + contextPtr->mdContext->intraInjectionMethod = 2; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_9) { + contextPtr->mdContext->intraInjectionMethod = 1; + } else { contextPtr->mdContext->intraInjectionMethod = 0; } // Derive Spatial SSE Flag - if (pictureControlSetPtr->sliceType == EB_I_PICTURE && contextPtr->mdContext->intraMdOpenLoopFlag == EB_FALSE && pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->spatialSseFullLoop = EB_TRUE; - } - else { - contextPtr->mdContext->spatialSseFullLoop = EB_FALSE; - } + if (pictureControlSetPtr->sliceType == EB_I_PICTURE && contextPtr->mdContext->intraMdOpenLoopFlag == EB_FALSE && pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_2) { + contextPtr->mdContext->spatialSseFullLoop = EB_TRUE; + } + else { + contextPtr->mdContext->spatialSseFullLoop = EB_FALSE; + } // Set Allow EncDec Mismatch Flag - if (pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_6) { - contextPtr->allowEncDecMismatch = EB_FALSE; - } + if (pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_6) { + contextPtr->allowEncDecMismatch = EB_FALSE; + } else if (pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - contextPtr->allowEncDecMismatch = (pictureControlSetPtr->temporalLayerIndex > 0) ? - EB_TRUE : - EB_FALSE; - } - else { - contextPtr->allowEncDecMismatch = EB_FALSE; - } + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + contextPtr->allowEncDecMismatch = (pictureControlSetPtr->temporalLayerIndex > 0) ? + EB_TRUE : + EB_FALSE; + } + else { + contextPtr->allowEncDecMismatch = EB_FALSE; + } } else { contextPtr->allowEncDecMismatch = (pictureControlSetPtr->temporalLayerIndex > 0) ? @@ -2053,33 +2053,33 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 5: Full vs. Best Swicth Method 3: chromaCond0 // If INTRA Close Loop, then the switch modes (2,3,4,5) are not supported as reference samples for Chroma compensation will be a mix of source samples and reconstructed samplesoop - if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->mdContext->chromaLevel = 0; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution >= INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->chromaLevel = 1; - } - else if (pictureControlSetPtr->temporalLayerIndex == 0) { - contextPtr->mdContext->chromaLevel = 0; - } - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - if (contextPtr->mdContext->intraMdOpenLoopFlag) { - contextPtr->mdContext->chromaLevel = 4; - } - else { - contextPtr->mdContext->chromaLevel = 0; - } - } - else { - contextPtr->mdContext->chromaLevel = 1; - } - } - else { - contextPtr->mdContext->chromaLevel = 0; - } - } + if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + contextPtr->mdContext->chromaLevel = 0; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution >= INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->chromaLevel = 1; + } + else if (pictureControlSetPtr->temporalLayerIndex == 0) { + contextPtr->mdContext->chromaLevel = 0; + } + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + if (contextPtr->mdContext->intraMdOpenLoopFlag) { + contextPtr->mdContext->chromaLevel = 4; + } + else { + contextPtr->mdContext->chromaLevel = 0; + } + } + else { + contextPtr->mdContext->chromaLevel = 1; + } + } + else { + contextPtr->mdContext->chromaLevel = 0; + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_10) { if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { contextPtr->mdContext->chromaLevel = 1; @@ -2105,37 +2105,37 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // Set Coeff Cabac Update Flag if (pictureControlSetPtr->encMode <= ENC_MODE_9) { - contextPtr->mdContext->coeffCabacUpdate = ((pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL85_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL84_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_OPEN_LOOP_DEPTH_MODE) && contextPtr->mdContext->chromaLevel == 0) ? - EB_TRUE : - EB_FALSE; - } + contextPtr->mdContext->coeffCabacUpdate = ((pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL85_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL84_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_OPEN_LOOP_DEPTH_MODE) && contextPtr->mdContext->chromaLevel == 0) ? + EB_TRUE : + EB_FALSE; + } else { contextPtr->mdContext->coeffCabacUpdate = EB_FALSE; } // Set INTRA8x8 Restriction @ P/B Slices - if (pictureControlSetPtr->encMode <= ENC_MODE_3) { - contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_4) { - if (sequenceControlSetPtr->inputResolution >= INPUT_SIZE_4K_RANGE) { - contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_TRUE; - } - else { - contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; - } - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_5) { - contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_3) { + contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_4) { + if (sequenceControlSetPtr->inputResolution >= INPUT_SIZE_4K_RANGE) { + contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_TRUE; + } + else { + contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; + } + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_5) { + contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; + } else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (sequenceControlSetPtr->inputResolution >= INPUT_SIZE_4K_RANGE) { - contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_TRUE; - } - else { - contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; - } - } + if (sequenceControlSetPtr->inputResolution >= INPUT_SIZE_4K_RANGE) { + contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_TRUE; + } + else { + contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_FALSE; + } + } else { contextPtr->mdContext->intra8x8RestrictionInterSlice = EB_TRUE; } @@ -2157,12 +2157,12 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( } // Set Fast-Loop Method - if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->singleFastLoopFlag = EB_TRUE; - } - else { - contextPtr->mdContext->singleFastLoopFlag = EB_FALSE; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_2) { + contextPtr->mdContext->singleFastLoopFlag = EB_TRUE; + } + else { + contextPtr->mdContext->singleFastLoopFlag = EB_FALSE; + } // Set AMVP Injection Flag if (pictureControlSetPtr->encMode <= ENC_MODE_1) { @@ -2181,26 +2181,26 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( } // Set Bipred 3x3 Injection Flag - if (pictureControlSetPtr->encMode <= ENC_MODE_1) { - contextPtr->mdContext->bipred3x3Injection = EB_TRUE; - } - else { - contextPtr->mdContext->bipred3x3Injection = EB_FALSE; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_1) { + contextPtr->mdContext->bipred3x3Injection = EB_TRUE; + } + else { + contextPtr->mdContext->bipred3x3Injection = EB_FALSE; + } // Set RDOQ/PM_CORE Flag - contextPtr->mdContext->rdoqPmCoreMethod = (pictureControlSetPtr->ParentPcsPtr->encMode == ENC_MODE_0) ? - EB_RDOQ : - (pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_4) ? - EB_PMCORE : - EB_NO_RDOQ; + contextPtr->mdContext->rdoqPmCoreMethod = (pictureControlSetPtr->ParentPcsPtr->encMode == ENC_MODE_0) ? + EB_RDOQ : + (pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_4) ? + EB_PMCORE : + EB_NO_RDOQ; // Set PM Method (active only when brr is ON) contextPtr->pmMethod = 0; // Set Fast EL Flag contextPtr->fastEl = (pictureControlSetPtr->encMode <= ENC_MODE_10) ? EB_FALSE : EB_TRUE; - contextPtr->yBitsThsld = (pictureControlSetPtr->encMode <= ENC_MODE_10) ? YBITS_THSHLD_1(0) : YBITS_THSHLD_1(12); + contextPtr->yBitsThsld = (pictureControlSetPtr->encMode <= ENC_MODE_10) ? YBITS_THSHLD_1(0) : YBITS_THSHLD_1(12); // Set SAO Mode contextPtr->saoMode = (pictureControlSetPtr->ParentPcsPtr->encMode <= ENC_MODE_10) ? 1 : 0; @@ -2219,9 +2219,9 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( } // Set Limit INTRA Flag - if (pictureControlSetPtr->encMode <= ENC_MODE_4) { - contextPtr->mdContext->limitIntra = EB_FALSE; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_4) { + contextPtr->mdContext->limitIntra = EB_FALSE; + } else { if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_FALSE) { contextPtr->mdContext->limitIntra = EB_TRUE; @@ -2239,29 +2239,29 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( if (pictureControlSetPtr->encMode <= ENC_MODE_4) { contextPtr->mdContext->mpmLevel = 0; } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->mdContext->mpmLevel = 2; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->mpmLevel = 1; - } - else { - contextPtr->mdContext->mpmLevel = 2; - } - } - else { - contextPtr->mdContext->mpmLevel = 2; - } - } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + contextPtr->mdContext->mpmLevel = 2; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->mpmLevel = 1; + } + else { + contextPtr->mdContext->mpmLevel = 2; + } + } + else { + contextPtr->mdContext->mpmLevel = 2; + } + } else { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->mpmLevel = 1; - } - else { - contextPtr->mdContext->mpmLevel = 2; - } + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->mpmLevel = 1; + } + else { + contextPtr->mdContext->mpmLevel = 2; + } } // Set PF @ MD Level @@ -2270,40 +2270,40 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 1 N2 // 2 M2 if 8x8 or 16x16 or Detector, N4 otherwise // 3 M2 if 8x8, N4 otherwise - if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->mdContext->pfMdLevel = 0; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->pfMdLevel = 0; - } - else { - contextPtr->mdContext->pfMdLevel = 1; - } - } - else { - contextPtr->mdContext->pfMdLevel = 0; - } - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_8) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->temporalLayerIndex == 0) { - contextPtr->mdContext->pfMdLevel = 0; - } - else { - contextPtr->mdContext->pfMdLevel = 1; - } - } - else { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->pfMdLevel = 0; - } - else { - contextPtr->mdContext->pfMdLevel = 1; - } - } - } + if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + contextPtr->mdContext->pfMdLevel = 0; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->pfMdLevel = 0; + } + else { + contextPtr->mdContext->pfMdLevel = 1; + } + } + else { + contextPtr->mdContext->pfMdLevel = 0; + } + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_8) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->temporalLayerIndex == 0) { + contextPtr->mdContext->pfMdLevel = 0; + } + else { + contextPtr->mdContext->pfMdLevel = 1; + } + } + else { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->pfMdLevel = 0; + } + else { + contextPtr->mdContext->pfMdLevel = 1; + } + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_10) { if (pictureControlSetPtr->temporalLayerIndex == 0) { contextPtr->mdContext->pfMdLevel = 0; @@ -2328,46 +2328,46 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 0 INLINE if not BDP, refinment otherwise // 1 REFINMENT // 2 OFF - if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->intra4x4Level = 0; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_2) { + contextPtr->mdContext->intra4x4Level = 0; + } else { contextPtr->mdContext->intra4x4Level = 2; } // Set INTRA4x4 NFL - if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->intra4x4Nfl = 4; - } - else { - contextPtr->mdContext->intra4x4Nfl = 2; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_2) { + contextPtr->mdContext->intra4x4Nfl = 4; + } + else { + contextPtr->mdContext->intra4x4Nfl = 2; + } // Set INTRA4x4 Injection // 0: 35 mdoes // 1: up to 4: DC, Best INTR8x8, +3, -0 - if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->intra4x4IntraInjection = 0; - } - else { - contextPtr->mdContext->intra4x4IntraInjection = 1; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_2) { + contextPtr->mdContext->intra4x4IntraInjection = 0; + } + else { + contextPtr->mdContext->intra4x4IntraInjection = 1; + } // NMM Level MD Settings // 0 5 // 1 3 if 32x32, 2 otherwise // 2 2 if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->mdContext->nmmLevelMd = 0; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - contextPtr->mdContext->nmmLevelMd = 1; - } - else { - contextPtr->mdContext->nmmLevelMd = 0; - } - } + contextPtr->mdContext->nmmLevelMd = 0; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + contextPtr->mdContext->nmmLevelMd = 1; + } + else { + contextPtr->mdContext->nmmLevelMd = 0; + } + } else { contextPtr->mdContext->nmmLevelMd = 1; } @@ -2379,39 +2379,39 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 3 3 if 32x32, 2 otherwise // 4 2 if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->mdContext->nmmLevelBdp = 0; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - contextPtr->mdContext->nmmLevelBdp = 3; - } - else { - contextPtr->mdContext->nmmLevelBdp = 0; - } - } + contextPtr->mdContext->nmmLevelBdp = 0; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + contextPtr->mdContext->nmmLevelBdp = 3; + } + else { + contextPtr->mdContext->nmmLevelBdp = 0; + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_8) { - if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER) { - contextPtr->mdContext->nmmLevelBdp = 0; - } - else if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) { - contextPtr->mdContext->nmmLevelBdp = 1; - } - else { - contextPtr->mdContext->nmmLevelBdp = 2; - } - } - else { - contextPtr->mdContext->nmmLevelBdp = 3; - } + if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER) { + contextPtr->mdContext->nmmLevelBdp = 0; + } + else if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) { + contextPtr->mdContext->nmmLevelBdp = 1; + } + else { + contextPtr->mdContext->nmmLevelBdp = 2; + } + } + else { + contextPtr->mdContext->nmmLevelBdp = 3; + } } else { - if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) { - contextPtr->mdContext->nmmLevelBdp = 1; - } - else { - contextPtr->mdContext->nmmLevelBdp = 2; - } + if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) { + contextPtr->mdContext->nmmLevelBdp = 1; + } + else { + contextPtr->mdContext->nmmLevelBdp = 2; + } } // NFL Level MD Settings @@ -2424,60 +2424,60 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 6 1 if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->nflLevelMd = 0; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelMd = 0; - } - else { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMd = 1; - } - else { - contextPtr->mdContext->nflLevelMd = 2; - } - } - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelMd = 1; - } - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMd = 4; - } - else { - contextPtr->mdContext->nflLevelMd = 5; - } - } - else { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelMd = 0; - } - else { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMd = 1; - } - else { - contextPtr->mdContext->nflLevelMd = 2; - } - } - } - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_9) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelMd = 1; - } - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMd = 4; - } - else { - contextPtr->mdContext->nflLevelMd = 5; - } + contextPtr->mdContext->nflLevelMd = 0; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelMd = 0; + } + else { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMd = 1; + } + else { + contextPtr->mdContext->nflLevelMd = 2; + } + } + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelMd = 1; + } + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMd = 4; + } + else { + contextPtr->mdContext->nflLevelMd = 5; + } + } + else { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelMd = 0; + } + else { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMd = 1; + } + else { + contextPtr->mdContext->nflLevelMd = 2; + } + } + } + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_9) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelMd = 1; + } + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMd = 4; + } + else { + contextPtr->mdContext->nflLevelMd = 5; + } } else { - contextPtr->mdContext->nflLevelMd = 6; + contextPtr->mdContext->nflLevelMd = 6; } // NFL Level Pillar/8x8 Refinement Settings @@ -2492,60 +2492,60 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 8 2 if 64x64 or 332x32, 1 otherwise // 9 1 if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->nflLevelPillar8x8ref = 0; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelPillar8x8ref = 0; - } - else { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelPillar8x8ref = 4; - } - else { - contextPtr->mdContext->nflLevelPillar8x8ref = 5; - } - } - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelPillar8x8ref = 4; - } - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelPillar8x8ref = 7; - } - else { - contextPtr->mdContext->nflLevelPillar8x8ref = 8; - } - } - else { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelPillar8x8ref = 0; - } - else { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelPillar8x8ref = 4; - } - else { - contextPtr->mdContext->nflLevelPillar8x8ref = 5; - } - } - } - } + contextPtr->mdContext->nflLevelPillar8x8ref = 0; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelPillar8x8ref = 0; + } + else { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelPillar8x8ref = 4; + } + else { + contextPtr->mdContext->nflLevelPillar8x8ref = 5; + } + } + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelPillar8x8ref = 4; + } + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelPillar8x8ref = 7; + } + else { + contextPtr->mdContext->nflLevelPillar8x8ref = 8; + } + } + else { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelPillar8x8ref = 0; + } + else { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelPillar8x8ref = 4; + } + else { + contextPtr->mdContext->nflLevelPillar8x8ref = 5; + } + } + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_9) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelPillar8x8ref = 4; - } - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelPillar8x8ref = 7; - } - else { - contextPtr->mdContext->nflLevelPillar8x8ref = 8; - } + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelPillar8x8ref = 4; + } + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelPillar8x8ref = 7; + } + else { + contextPtr->mdContext->nflLevelPillar8x8ref = 8; + } } else { - contextPtr->mdContext->nflLevelPillar8x8ref = 9; + contextPtr->mdContext->nflLevelPillar8x8ref = 9; } @@ -2560,54 +2560,54 @@ static EB_ERRORTYPE SignalDerivationEncDecKernelOq( // 7 2 if 64x64 or 332x32, 1 otherwise // 8 1 if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 0; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 0; - } - else { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 3; - } - else { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 4; - } - } - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 6; - } - else { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 7; - } - } - else { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 0; - } - else { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 3; - } - else { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 4; - } - } - } - } + contextPtr->mdContext->nflLevelMvMerge64x64ref = 0; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 0; + } + else { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 3; + } + else { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 4; + } + } + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 6; + } + else { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 7; + } + } + else { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 0; + } + else { + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 3; + } + else { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 4; + } + } + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_9) { - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 6; - } - else { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 7; - } + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 6; + } + else { + contextPtr->mdContext->nflLevelMvMerge64x64ref = 7; + } } else { - contextPtr->mdContext->nflLevelMvMerge64x64ref = 8; + contextPtr->mdContext->nflLevelMvMerge64x64ref = 8; } @@ -2835,7 +2835,7 @@ void* EncDecKernel(void *inputPtr) lcuOriginX = (xLcuIndex+tileGroupLcuStartX) << lcuSizeLog2; lcuOriginY = (yLcuIndex+tileGroupLcuStartY) << lcuSizeLog2; //printf("Process lcu (%d, %d), lcuIndex %d, segmentIndex %d\n", lcuOriginX, lcuOriginY, lcuIndex, segmentIndex); - + if (sequenceControlSetPtr->staticConfig.segmentOvEnabled && pictureControlSetPtr->ParentPcsPtr->segmentOvArray != NULL) { SegmentOverride_t* segmentOvPtr = pictureControlSetPtr->ParentPcsPtr->segmentOvArray; if ((segmentOvPtr[lcuIndex].ovFlags & EB_DENSITY_QP_OV) && (segmentOvPtr[lcuIndex].ovFlags & EB_QP_OV_DIRECT)) { diff --git a/Source/Lib/Codec/EbEncDecProcess.h b/Source/Lib/Codec/EbEncDecProcess.h index 45d5377ba..a1a5747a4 100644 --- a/Source/Lib/Codec/EbEncDecProcess.h +++ b/Source/Lib/Codec/EbEncDecProcess.h @@ -27,13 +27,13 @@ extern "C" { #define PM_STRIDE 4 typedef struct EbPMCand_s { - - EB_S16 trCoeff[4 * 4]; - EB_S16 quCoeff[4 * 4]; - EB_S16 iqCoeff[4 * 4]; - EB_U8 maskingLevel; - EB_U64 cost; - EB_U32 nzCoeff; + + EB_S16 trCoeff[4 * 4]; + EB_S16 quCoeff[4 * 4]; + EB_S16 iqCoeff[4 * 4]; + EB_U8 maskingLevel; + EB_U64 cost; + EB_U32 nzCoeff; } EbPMCand_t; @@ -45,107 +45,107 @@ typedef struct EbPMCand_s typedef struct EncDecContext_s { EbFifo_t *modeDecisionInputFifoPtr; - EbFifo_t *encDecOutputFifoPtr; - EbFifo_t *encDecFeedbackFifoPtr; - EbFifo_t *pictureDemuxOutputFifoPtr; // to picture-manager + EbFifo_t *encDecOutputFifoPtr; + EbFifo_t *encDecFeedbackFifoPtr; + EbFifo_t *pictureDemuxOutputFifoPtr; // to picture-manager - EB_S16 *transformInnerArrayPtr; - MdRateEstimationContext_t *mdRateEstimationPtr; - SaoStats_t *saoStats; + EB_S16 *transformInnerArrayPtr; + MdRateEstimationContext_t *mdRateEstimationPtr; + SaoStats_t *saoStats; ModeDecisionContext_t *mdContext; - // Lambda - EB_U8 qp; - EB_U8 chromaQp; - EB_U32 fastLambda; - EB_U32 fullLambda; - EB_U32 fastChromaLambda; - EB_U32 fullChromaLambda; - EB_U32 fullChromaLambdaSao; + // Lambda + EB_U8 qp; + EB_U8 chromaQp; + EB_U32 fastLambda; + EB_U32 fullLambda; + EB_U32 fastChromaLambda; + EB_U32 fullChromaLambda; + EB_U32 fullChromaLambdaSao; - // TMVP - EbReferenceObject_t *referenceObjectWritePtr; + // TMVP + EbReferenceObject_t *referenceObjectWritePtr; // MCP Context - MotionCompensationPredictionContext_t *mcpContext; + MotionCompensationPredictionContext_t *mcpContext; // Intra Reference Samples - IntraReferenceSamples_t *intraRefPtr; - IntraReference16bitSamples_t *intraRefPtr16; //We need a different buffer for ENC pass then the MD one. - + IntraReferenceSamples_t *intraRefPtr; + IntraReference16bitSamples_t *intraRefPtr16; //We need a different buffer for ENC pass then the MD one. + - // Coding Unit Workspace--------------------------- - EbPictureBufferDesc_t *residualBuffer; - EbPictureBufferDesc_t *transformBuffer; + // Coding Unit Workspace--------------------------- + EbPictureBufferDesc_t *residualBuffer; + EbPictureBufferDesc_t *transformBuffer; EbPictureBufferDesc_t *inputSamples; - EbPictureBufferDesc_t *inputSample16bitBuffer; + EbPictureBufferDesc_t *inputSample16bitBuffer; - // Context Variables--------------------------------- - CodingUnit_t *cuPtr; - const CodedUnitStats_t *cuStats; + // Context Variables--------------------------------- + CodingUnit_t *cuPtr; + const CodedUnitStats_t *cuStats; EB_U16 cuOriginX; // within the picture - EB_U16 cuOriginY; // within the picture + EB_U16 cuOriginY; // within the picture - EB_U8 lcuSize; + EB_U8 lcuSize; EB_U32 lcuIndex; - EB_U16 cuChromaOriginX; - EB_U16 cuChromaOriginY; + EB_U16 cuChromaOriginX; + EB_U16 cuChromaOriginY; - MvUnit_t mvUnit; - EB_U8 amvpCandidateCountRefList0; - EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_U8 amvpCandidateCountRefList1; - EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; + MvUnit_t mvUnit; + EB_U8 amvpCandidateCountRefList0; + EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_U8 amvpCandidateCountRefList1; + EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_U8 tuItr; - EB_BOOL is16bit; //enable 10 bit encode in CL + EB_U8 tuItr; + EB_BOOL is16bit; //enable 10 bit encode in CL EB_COLOR_FORMAT colorFormat; - // SAO application - EB_U8 *saoUpBuffer[2]; - EB_U8 *saoLeftBuffer[2]; - EB_U16 *saoUpBuffer16[2]; - EB_U16 *saoLeftBuffer16[2]; + // SAO application + EB_U8 *saoUpBuffer[2]; + EB_U8 *saoLeftBuffer[2]; + EB_U16 *saoUpBuffer16[2]; + EB_U16 *saoLeftBuffer16[2]; - EB_U64 totIntraCodedArea; + EB_U64 totIntraCodedArea; EB_U32 codedLcuCount; - EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% - EB_U8 cleanSparseCeoffPfEncDec; - EB_U8 pmpMaskingLevelEncDec; - EB_U8 forceCbfFlag; + EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% + EB_U8 cleanSparseCeoffPfEncDec; + EB_U8 pmpMaskingLevelEncDec; + EB_U8 forceCbfFlag; + + EB_BOOL skipQpmFlag; - EB_BOOL skipQpmFlag; - - EB_S16 minDeltaQpWeight; - EB_S16 maxDeltaQpWeight; - EB_S8 minDeltaQp[4]; - EB_S8 maxDeltaQp[4]; - EB_S8 nonMovingDeltaQp; + EB_S16 minDeltaQpWeight; + EB_S16 maxDeltaQpWeight; + EB_S8 minDeltaQp[4]; + EB_S8 maxDeltaQp[4]; + EB_S8 nonMovingDeltaQp; - EB_BOOL grassEnhancementFlag; - EB_BOOL backgorundEnhancement; - EB_U8 qpmQp; + EB_BOOL grassEnhancementFlag; + EB_BOOL backgorundEnhancement; + EB_U8 qpmQp; EB_TRANS_COEFF_SHAPE transCoeffShapeLuma; EB_TRANS_COEFF_SHAPE transCoeffShapeChroma; - - EbPMCand_t pmCandBuffer[5]; + + EbPMCand_t pmCandBuffer[5]; // Multi-modes signal(s) EB_BOOL allowEncDecMismatch; EB_BOOL fastEl; - EB_U32 yBitsThsld; + EB_U32 yBitsThsld; EB_U8 saoMode; - EB_PM_MODE pmMode; // agressive vs. conservative - EB_BOOL pmMethod; // 1-stgae vs. 2-stage + EB_PM_MODE pmMode; // agressive vs. conservative + EB_BOOL pmMethod; // 1-stgae vs. 2-stage EB_U16 encDecTileIndex; //// @@ -164,9 +164,9 @@ extern EB_ERRORTYPE EncDecContextCtor( EB_COLOR_FORMAT colorFormat); - + extern void* EncDecKernel(void *inputPtr); #ifdef __cplusplus } -#endif +#endif #endif // EbEncDecProcess_h diff --git a/Source/Lib/Codec/EbEncDecResults.c b/Source/Lib/Codec/EbEncDecResults.c index 0b1875c36..91be6b2a9 100644 --- a/Source/Lib/Codec/EbEncDecResults.c +++ b/Source/Lib/Codec/EbEncDecResults.c @@ -13,7 +13,7 @@ EB_ERRORTYPE EncDecResultsCtor( { EncDecResults_t *contextPtr; EB_MALLOC(EncDecResults_t*, contextPtr, sizeof(EncDecResults_t), EB_N_PTR); - + *objectDblPtr = (EB_PTR) contextPtr; (void) objectInitDataPtr; diff --git a/Source/Lib/Codec/EbEncDecResults.h b/Source/Lib/Codec/EbEncDecResults.h index 5c5ba8556..5da427bab 100644 --- a/Source/Lib/Codec/EbEncDecResults.h +++ b/Source/Lib/Codec/EbEncDecResults.h @@ -14,7 +14,7 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct EncDecResults_s +typedef struct EncDecResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; EB_U32 completedLcuRowIndexStart; @@ -32,7 +32,7 @@ typedef struct EncDecResultsInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EncDecResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); diff --git a/Source/Lib/Codec/EbEncDecSegments.c b/Source/Lib/Codec/EbEncDecSegments.c index 8be6a34f2..53815e8b1 100644 --- a/Source/Lib/Codec/EbEncDecSegments.c +++ b/Source/Lib/Codec/EbEncDecSegments.c @@ -18,7 +18,7 @@ EB_ERRORTYPE EncDecSegmentsCtor( EB_U32 rowIndex; EncDecSegments_t *segmentsPtr; EB_MALLOC(EncDecSegments_t*, segmentsPtr, sizeof(EncDecSegments_t), EB_N_PTR); - + *segmentsDblPtr = segmentsPtr; segmentsPtr->segmentMaxRowCount = segmentRowCount; @@ -29,17 +29,17 @@ EB_ERRORTYPE EncDecSegmentsCtor( EB_MALLOC(EB_U16*, segmentsPtr->xStartArray, sizeof(EB_U16) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); EB_MALLOC(EB_U16*, segmentsPtr->yStartArray, sizeof(EB_U16) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); - + EB_MALLOC(EB_U16*, segmentsPtr->validLcuCountArray, sizeof(EB_U16) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); - + // Dependency map EB_MALLOC(EB_U8*, segmentsPtr->depMap.dependencyMap, sizeof(EB_U8) * segmentsPtr->segmentMaxTotalCount, EB_N_PTR); - + EB_CREATEMUTEX(EB_HANDLE, segmentsPtr->depMap.updateMutex, sizeof(EB_HANDLE), EB_MUTEX); - + // Segment rows EB_MALLOC(EncDecSegSegmentRow_t*, segmentsPtr->rowArray, sizeof(EncDecSegSegmentRow_t) * segmentsPtr->segmentMaxRowCount, EB_N_PTR) - + for(rowIndex=0; rowIndex < segmentsPtr->segmentMaxRowCount; ++rowIndex) { EB_CREATEMUTEX(EB_HANDLE, segmentsPtr->rowArray[rowIndex].assignmentMutex, sizeof(EB_HANDLE), EB_MUTEX); } @@ -86,12 +86,12 @@ void EncDecSegmentsInit( //++segmentsPtr->inputMap.inputDependencyMap[segmentIndex]; ++segmentsPtr->validLcuCountArray[segmentIndex]; - segmentsPtr->xStartArray[segmentIndex] = (segmentsPtr->xStartArray[segmentIndex] == (EB_U16) -1) ? - (EB_U16) x : + segmentsPtr->xStartArray[segmentIndex] = (segmentsPtr->xStartArray[segmentIndex] == (EB_U16) -1) ? + (EB_U16) x : segmentsPtr->xStartArray[segmentIndex]; - segmentsPtr->yStartArray[segmentIndex] = (segmentsPtr->yStartArray[segmentIndex] == (EB_U16) -1) ? - (EB_U16) y : - segmentsPtr->yStartArray[segmentIndex]; + segmentsPtr->yStartArray[segmentIndex] = (segmentsPtr->yStartArray[segmentIndex] == (EB_U16) -1) ? + (EB_U16) y : + segmentsPtr->yStartArray[segmentIndex]; } } diff --git a/Source/Lib/Codec/EbEncDecSegments.h b/Source/Lib/Codec/EbEncDecSegments.h index 627591fc1..4bb88d388 100644 --- a/Source/Lib/Codec/EbEncDecSegments.h +++ b/Source/Lib/Codec/EbEncDecSegments.h @@ -37,14 +37,14 @@ extern "C" { **************************************/ typedef struct { EB_U8 *dependencyMap; - EB_HANDLE updateMutex; + EB_HANDLE updateMutex; } EncDecSegDependencyMap_t; typedef struct { EB_U16 startingSegIndex; EB_U16 endingSegIndex; EB_U16 currentSegIndex; - EB_HANDLE assignmentMutex; + EB_HANDLE assignmentMutex; } EncDecSegSegmentRow_t; /************************************** @@ -64,7 +64,7 @@ typedef struct EB_U32 segmentTotalCount; EB_U32 lcuBandCount; EB_U32 lcuRowCount; - + EB_U32 segmentMaxBandCount; EB_U32 segmentMaxRowCount; EB_U32 segmentMaxTotalCount; diff --git a/Source/Lib/Codec/EbEncDecTasks.c b/Source/Lib/Codec/EbEncDecTasks.c index 2b0d1eb43..2bebd8283 100644 --- a/Source/Lib/Codec/EbEncDecTasks.c +++ b/Source/Lib/Codec/EbEncDecTasks.c @@ -14,7 +14,7 @@ EB_ERRORTYPE EncDecTasksCtor( { EncDecTasks_t *contextPtr; EB_MALLOC(EncDecTasks_t*, contextPtr, sizeof(EncDecTasks_t), EB_N_PTR); - + *objectDblPtr = (EB_PTR) contextPtr; (void) objectInitDataPtr; diff --git a/Source/Lib/Codec/EbEncDecTasks.h b/Source/Lib/Codec/EbEncDecTasks.h index b8d5db74b..1b22fd9ca 100644 --- a/Source/Lib/Codec/EbEncDecTasks.h +++ b/Source/Lib/Codec/EbEncDecTasks.h @@ -18,7 +18,7 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct EncDecTasks_s +typedef struct EncDecTasks_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; EB_U32 inputType; @@ -36,7 +36,7 @@ typedef struct EncDecTasksInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EncDecTasksCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); diff --git a/Source/Lib/Codec/EbEncHandle.c b/Source/Lib/Codec/EbEncHandle.c index 3ca232ad4..6e1736bd1 100644 --- a/Source/Lib/Codec/EbEncHandle.c +++ b/Source/Lib/Codec/EbEncHandle.c @@ -277,7 +277,7 @@ static EB_S32 CanUseIntelAVX512() // Using bit-fields, the fastest function will always be selected based on the available functions in the function arrays EB_U32 EbHevcGetCpuAsmType() { - EB_U32 asmType = 0; + EB_U32 asmType = 0; if (CanUseIntelAVX512() == 1) #ifdef NON_AVX512_SUPPORT @@ -292,7 +292,7 @@ EB_U32 EbHevcGetCpuAsmType() else{ asmType = 1; // bit-field } - return asmType; + return asmType; } //Get Number of logical processors @@ -302,7 +302,7 @@ EB_U32 EbHevcGetNumProcessors() { GetSystemInfo(&sysinfo); return numGroups == 1 ? sysinfo.dwNumberOfProcessors : sysinfo.dwNumberOfProcessors << 1; #else - return sysconf(_SC_NPROCESSORS_ONLN); + return sysconf(_SC_NPROCESSORS_ONLN); #endif } /***************************************** @@ -467,7 +467,7 @@ static EB_ERRORTYPE EbEncHandleCtor( } encHandlePtr->memoryMap = (EbMemoryMapEntry*) malloc(sizeof(EbMemoryMapEntry) * MAX_NUM_PTR); encHandlePtr->memoryMapIndex = 0; - encHandlePtr->totalLibMemory = sizeof(EbEncHandle_t) + sizeof(EbMemoryMapEntry) * MAX_NUM_PTR; + encHandlePtr->totalLibMemory = sizeof(EbEncHandle_t) + sizeof(EbMemoryMapEntry) * MAX_NUM_PTR; // Save Memory Map Pointers totalLibMemory = &encHandlePtr->totalLibMemory; @@ -516,7 +516,7 @@ static EB_ERRORTYPE EbEncHandleCtor( encHandlePtr->pictureDecisionThreadHandle = (EB_HANDLE) EB_NULL; encHandlePtr->motionEstimationThreadHandleArray = (EB_HANDLE*) EB_NULL; encHandlePtr->initialRateControlThreadHandle = (EB_HANDLE) EB_NULL; - encHandlePtr->sourceBasedOperationsThreadHandleArray = (EB_HANDLE*)EB_NULL; + encHandlePtr->sourceBasedOperationsThreadHandleArray = (EB_HANDLE*)EB_NULL; encHandlePtr->pictureManagerThreadHandle = (EB_HANDLE) EB_NULL; encHandlePtr->rateControlThreadHandle = (EB_HANDLE) EB_NULL; encHandlePtr->modeDecisionConfigurationThreadHandleArray = (EB_HANDLE*) EB_NULL; @@ -531,7 +531,7 @@ static EB_ERRORTYPE EbEncHandleCtor( encHandlePtr->pictureDecisionContextPtr = (EB_PTR) EB_NULL; encHandlePtr->motionEstimationContextPtrArray = (EB_PTR*) EB_NULL; encHandlePtr->initialRateControlContextPtr = (EB_PTR) EB_NULL; - encHandlePtr->sourceBasedOperationsContextPtrArray = (EB_PTR*)EB_NULL; + encHandlePtr->sourceBasedOperationsContextPtrArray = (EB_PTR*)EB_NULL; encHandlePtr->pictureManagerContextPtr = (EB_PTR) EB_NULL; encHandlePtr->rateControlContextPtr = (EB_PTR) EB_NULL; encHandlePtr->modeDecisionConfigurationContextPtrArray = (EB_PTR*) EB_NULL; @@ -547,7 +547,7 @@ static EB_ERRORTYPE EbEncHandleCtor( encHandlePtr->pictureAnalysisResultsResourcePtr = (EbSystemResource_t*) EB_NULL; encHandlePtr->pictureDecisionResultsResourcePtr = (EbSystemResource_t*) EB_NULL; encHandlePtr->motionEstimationResultsResourcePtr = (EbSystemResource_t*) EB_NULL; - encHandlePtr->initialRateControlResultsResourcePtr = (EbSystemResource_t*)EB_NULL; + encHandlePtr->initialRateControlResultsResourcePtr = (EbSystemResource_t*)EB_NULL; encHandlePtr->pictureDemuxResultsResourcePtr = (EbSystemResource_t*) EB_NULL; encHandlePtr->rateControlTasksResourcePtr = (EbSystemResource_t*) EB_NULL; encHandlePtr->rateControlResultsResourcePtr = (EbSystemResource_t*) EB_NULL; @@ -811,7 +811,7 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) inputData.speedControl = (EB_U8)encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->staticConfig.speedControlFlag; inputData.segmentOvEnabled = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->staticConfig.segmentOvEnabled; //inputData.tune = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->staticConfig.tune; - return_error = EbSystemResourceCtor( + return_error = EbSystemResourceCtor( &(encHandlePtr->pictureParentControlSetPoolPtrArray[instanceIndex]), encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->pictureControlSetPoolInitCount,//encHandlePtr->pictureControlSetPoolTotalCount, 1, @@ -859,10 +859,10 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) inputData.pictureWidth = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->maxInputLumaWidth; inputData.pictureHeight = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->maxInputLumaHeight; - inputData.leftPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->leftPadding; - inputData.rightPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->rightPadding; - inputData.topPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->topPadding; - inputData.botPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->botPadding; + inputData.leftPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->leftPadding; + inputData.rightPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->rightPadding; + inputData.topPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->topPadding; + inputData.botPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->botPadding; inputData.bitDepth = EB_8BIT; inputData.colorFormat = (EB_COLOR_FORMAT)encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->chromaFormatIdc; inputData.lcuSize = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize; @@ -924,10 +924,10 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) referencePictureBufferDescInitData.bitDepth = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->inputBitdepth; referencePictureBufferDescInitData.colorFormat = (EB_COLOR_FORMAT)encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->chromaFormatIdc; referencePictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; - referencePictureBufferDescInitData.leftPadding = MAX_LCU_SIZE + MCPXPaddingOffset; - referencePictureBufferDescInitData.rightPadding = MAX_LCU_SIZE + MCPXPaddingOffset; - referencePictureBufferDescInitData.topPadding = MAX_LCU_SIZE + MCPYPaddingOffset; - referencePictureBufferDescInitData.botPadding = MAX_LCU_SIZE + MCPYPaddingOffset; + referencePictureBufferDescInitData.leftPadding = MAX_LCU_SIZE + MCPXPaddingOffset; + referencePictureBufferDescInitData.rightPadding = MAX_LCU_SIZE + MCPXPaddingOffset; + referencePictureBufferDescInitData.topPadding = MAX_LCU_SIZE + MCPYPaddingOffset; + referencePictureBufferDescInitData.botPadding = MAX_LCU_SIZE + MCPYPaddingOffset; referencePictureBufferDescInitData.splitMode = EB_FALSE; if (is16bit){ @@ -974,10 +974,10 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) quarterDecimPictureBufferDescInitData.bitDepth = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->inputBitdepth; quarterDecimPictureBufferDescInitData.colorFormat = EB_YUV420; quarterDecimPictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_LUMA_MASK; - quarterDecimPictureBufferDescInitData.leftPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; - quarterDecimPictureBufferDescInitData.rightPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; - quarterDecimPictureBufferDescInitData.topPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; - quarterDecimPictureBufferDescInitData.botPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; + quarterDecimPictureBufferDescInitData.leftPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; + quarterDecimPictureBufferDescInitData.rightPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; + quarterDecimPictureBufferDescInitData.topPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; + quarterDecimPictureBufferDescInitData.botPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 1; quarterDecimPictureBufferDescInitData.splitMode = EB_FALSE; sixteenthDecimPictureBufferDescInitData.maxWidth = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->maxInputLumaWidth >> 2; @@ -985,10 +985,10 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) sixteenthDecimPictureBufferDescInitData.bitDepth = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->inputBitdepth; sixteenthDecimPictureBufferDescInitData.colorFormat = EB_YUV420; sixteenthDecimPictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_LUMA_MASK; - sixteenthDecimPictureBufferDescInitData.leftPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; - sixteenthDecimPictureBufferDescInitData.rightPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; - sixteenthDecimPictureBufferDescInitData.topPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; - sixteenthDecimPictureBufferDescInitData.botPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; + sixteenthDecimPictureBufferDescInitData.leftPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; + sixteenthDecimPictureBufferDescInitData.rightPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; + sixteenthDecimPictureBufferDescInitData.topPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; + sixteenthDecimPictureBufferDescInitData.botPadding = encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->sequenceControlSetPtr->lcuSize >> 2; sixteenthDecimPictureBufferDescInitData.splitMode = EB_FALSE; EbPaReferenceObjectDescInitDataStructure.referencePictureDescInitData = referencePictureBufferDescInitData; @@ -1007,9 +1007,9 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) EB_FALSE, EbPaReferenceObjectCtor, &(EbPaReferenceObjectDescInitDataStructure)); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; - } + } // Set the SequenceControlSet Picture Pool Fifo Ptrs encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->encodeContextPtr->referencePicturePoolFifoPtr = (encHandlePtr->referencePicturePoolProducerFifoPtrDblArray[instanceIndex])[0]; @@ -1092,7 +1092,7 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) ResourceCoordinationResultCtor, &resourceCoordinationResultInitData); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } @@ -1131,7 +1131,7 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) EB_TRUE, PictureDecisionResultCtor, &pictureDecisionResultInitData); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } @@ -1150,30 +1150,30 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) EB_TRUE, MotionEstimationResultsCtor, &motionEstimationResultInitData); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } - // Initial Rate Control Results - { - InitialRateControlResultInitData_t initialRateControlResultInitData; + // Initial Rate Control Results + { + InitialRateControlResultInitData_t initialRateControlResultInitData; - return_error = EbSystemResourceCtor( - &encHandlePtr->initialRateControlResultsResourcePtr, - encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->initialRateControlFifoInitCount, - EB_InitialRateControlProcessInitCount, - encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->sourceBasedOperationsProcessInitCount, - &encHandlePtr->initialRateControlResultsProducerFifoPtrArray, - &encHandlePtr->initialRateControlResultsConsumerFifoPtrArray, - EB_TRUE, - InitialRateControlResultsCtor, - &initialRateControlResultInitData); + return_error = EbSystemResourceCtor( + &encHandlePtr->initialRateControlResultsResourcePtr, + encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->initialRateControlFifoInitCount, + EB_InitialRateControlProcessInitCount, + encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->sourceBasedOperationsProcessInitCount, + &encHandlePtr->initialRateControlResultsProducerFifoPtrArray, + &encHandlePtr->initialRateControlResultsConsumerFifoPtrArray, + EB_TRUE, + InitialRateControlResultsCtor, + &initialRateControlResultInitData); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + } // Picture Demux Results { @@ -1189,7 +1189,7 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) EB_TRUE, PictureResultsCtor, &pictureResultInitData); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } @@ -1342,12 +1342,12 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) // Output Buffer Fifo Ptrs for(instanceIndex=0; instanceIndex < encHandlePtr->encodeInstanceTotalCount; ++instanceIndex) { - encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->encodeContextPtr->streamOutputFifoPtr = (encHandlePtr->outputStreamBufferProducerFifoPtrDblArray[instanceIndex])[0]; + encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->encodeContextPtr->streamOutputFifoPtr = (encHandlePtr->outputStreamBufferProducerFifoPtrDblArray[instanceIndex])[0]; if (encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->staticConfig.reconEnabled) { encHandlePtr->sequenceControlSetInstanceArray[instanceIndex]->encodeContextPtr->reconOutputFifoPtr = (encHandlePtr->outputReconBufferProducerFifoPtrDblArray[instanceIndex])[0]; } - } + } /************************************ * Contexts @@ -1371,23 +1371,23 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) // Picture Analysis Context EB_MALLOC(EB_PTR*, encHandlePtr->pictureAnalysisContextPtrArray, sizeof(EB_PTR) * encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->pictureAnalysisProcessInitCount, EB_N_PTR); - for(processIndex=0; processIndex < encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->pictureAnalysisProcessInitCount; ++processIndex) { + for(processIndex=0; processIndex < encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->pictureAnalysisProcessInitCount; ++processIndex) { - EbPictureBufferDescInitData_t pictureBufferDescConf; - pictureBufferDescConf.maxWidth = encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->maxInputLumaWidth; - pictureBufferDescConf.maxHeight = encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->maxInputLumaHeight; - pictureBufferDescConf.bitDepth = EB_8BIT; + EbPictureBufferDescInitData_t pictureBufferDescConf; + pictureBufferDescConf.maxWidth = encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->maxInputLumaWidth; + pictureBufferDescConf.maxHeight = encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->maxInputLumaHeight; + pictureBufferDescConf.bitDepth = EB_8BIT; pictureBufferDescConf.colorFormat = (EB_COLOR_FORMAT)encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->chromaFormatIdc; - pictureBufferDescConf.bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; - pictureBufferDescConf.leftPadding = 0; - pictureBufferDescConf.rightPadding = 0; - pictureBufferDescConf.topPadding = 0; - pictureBufferDescConf.botPadding = 0; - pictureBufferDescConf.splitMode = EB_FALSE; - - return_error = PictureAnalysisContextCtor( - &pictureBufferDescConf, - EB_TRUE, + pictureBufferDescConf.bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; + pictureBufferDescConf.leftPadding = 0; + pictureBufferDescConf.rightPadding = 0; + pictureBufferDescConf.topPadding = 0; + pictureBufferDescConf.botPadding = 0; + pictureBufferDescConf.splitMode = EB_FALSE; + + return_error = PictureAnalysisContextCtor( + &pictureBufferDescConf, + EB_TRUE, (PictureAnalysisContext_t**) &encHandlePtr->pictureAnalysisContextPtrArray[processIndex], encHandlePtr->resourceCoordinationResultsConsumerFifoPtrArray[processIndex], encHandlePtr->pictureAnalysisResultsProducerFifoPtrArray[processIndex], @@ -1395,9 +1395,9 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) ((encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->maxInputLumaHeight + MAX_LCU_SIZE - 1) / MAX_LCU_SIZE)); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; - } + } } // Picture Decision Context @@ -1408,9 +1408,9 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) (PictureDecisionContext_t**) &encHandlePtr->pictureDecisionContextPtr, encHandlePtr->pictureAnalysisResultsConsumerFifoPtrArray[0], encHandlePtr->pictureDecisionResultsProducerFifoPtrArray[0]); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; - } + } } // Motion Analysis Context @@ -1418,10 +1418,10 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) for(processIndex=0; processIndex < encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->motionEstimationProcessInitCount; ++processIndex) { - return_error = MotionEstimationContextCtor( - (MotionEstimationContext_t**) &encHandlePtr->motionEstimationContextPtrArray[processIndex], - encHandlePtr->pictureDecisionResultsConsumerFifoPtrArray[processIndex], - encHandlePtr->motionEstimationResultsProducerFifoPtrArray[processIndex]); + return_error = MotionEstimationContextCtor( + (MotionEstimationContext_t**) &encHandlePtr->motionEstimationContextPtrArray[processIndex], + encHandlePtr->pictureDecisionResultsConsumerFifoPtrArray[processIndex], + encHandlePtr->motionEstimationResultsProducerFifoPtrArray[processIndex]); if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; @@ -1437,7 +1437,7 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) return EB_ErrorInsufficientResources; } - // Source Based Operations Context + // Source Based Operations Context EB_MALLOC(EB_PTR*, encHandlePtr->sourceBasedOperationsContextPtrArray, sizeof(EB_PTR) * encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->sourceBasedOperationsProcessInitCount, EB_N_PTR); for (processIndex = 0; processIndex < encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->sourceBasedOperationsProcessInitCount; ++processIndex) { @@ -1445,10 +1445,10 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) (SourceBasedOperationsContext_t**)&encHandlePtr->sourceBasedOperationsContextPtrArray[processIndex], encHandlePtr->initialRateControlResultsConsumerFifoPtrArray[processIndex], encHandlePtr->pictureDemuxResultsProducerFifoPtrArray[processIndex]); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + } // Picture Manager Context @@ -1471,9 +1471,9 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) } - // Mode Decision Configuration Contexts + // Mode Decision Configuration Contexts { - // Mode Decision Configuration Contexts + // Mode Decision Configuration Contexts EB_MALLOC(EB_PTR*, encHandlePtr->modeDecisionConfigurationContextPtrArray, sizeof(EB_PTR) * encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->modeDecisionConfigurationProcessInitCount, EB_N_PTR); for(processIndex=0; processIndex < encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->modeDecisionConfigurationProcessInitCount; ++processIndex) { @@ -1586,11 +1586,11 @@ EB_API EB_ERRORTYPE EbInitEncoder(EB_COMPONENTTYPE *h265EncComponent) // Initial Rate Control EB_CREATETHREAD(EB_HANDLE, encHandlePtr->initialRateControlThreadHandle, sizeof(EB_HANDLE), EB_THREAD, InitialRateControlKernel, encHandlePtr->initialRateControlContextPtr); - // Source Based Oprations + // Source Based Oprations EB_MALLOC(EB_HANDLE*, encHandlePtr->sourceBasedOperationsThreadHandleArray, sizeof(EB_HANDLE) * encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->sourceBasedOperationsProcessInitCount, EB_N_PTR); for (processIndex = 0; processIndex < encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->sourceBasedOperationsProcessInitCount; ++processIndex) { - EB_CREATETHREAD(EB_HANDLE, encHandlePtr->sourceBasedOperationsThreadHandleArray[processIndex], sizeof(EB_HANDLE), EB_THREAD, SourceBasedOperationsKernel, encHandlePtr->sourceBasedOperationsContextPtrArray[processIndex]); + EB_CREATETHREAD(EB_HANDLE, encHandlePtr->sourceBasedOperationsThreadHandleArray[processIndex], sizeof(EB_HANDLE), EB_THREAD, SourceBasedOperationsKernel, encHandlePtr->sourceBasedOperationsContextPtrArray[processIndex]); } // Picture Manager @@ -1663,9 +1663,9 @@ EB_API EB_ERRORTYPE EbDeinitEncoder(EB_COMPONENTTYPE *h265EncComponent) EB_SEND_END_OBJ(encHandlePtr->encDecTasksProducerFifoPtrArray, encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->encDecProcessInitCount) EB_SEND_END_OBJ(encHandlePtr->encDecResultsProducerFifoPtrArray, encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->entropyCodingProcessInitCount) EB_SEND_END_OBJ(encHandlePtr->entropyCodingResultsProducerFifoPtrArray, EB_PacketizationProcessInitCount) - EB_SEND_END_OBJ(encHandlePtr->unpackTasksProducerFifoPtrArray, encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->unpackProcessInitCount) + EB_SEND_END_OBJ(encHandlePtr->unpackTasksProducerFifoPtrArray, encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->unpackProcessInitCount) EB_SEND_END_OBJ(encHandlePtr->unpackSyncProducerFifoPtrArray, encHandlePtr->sequenceControlSetInstanceArray[0]->sequenceControlSetPtr->unpackProcessInitCount) - + if (encHandlePtr->memoryMapIndex){ // Loop through the ptr table and free all malloc'd pointers per channel @@ -2266,9 +2266,9 @@ void EbHevcSetParamBasedOnInput( sequenceControlSetPtr, sequenceControlSetPtr->lumaWidth*sequenceControlSetPtr->lumaHeight); - sequenceControlSetPtr->pictureWidthInLcu = (EB_U8)((sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize); - sequenceControlSetPtr->pictureHeightInLcu = (EB_U8)((sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize); - sequenceControlSetPtr->lcuTotalCount = sequenceControlSetPtr->pictureWidthInLcu * sequenceControlSetPtr->pictureHeightInLcu; + sequenceControlSetPtr->pictureWidthInLcu = (EB_U8)((sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize); + sequenceControlSetPtr->pictureHeightInLcu = (EB_U8)((sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize); + sequenceControlSetPtr->lcuTotalCount = sequenceControlSetPtr->pictureWidthInLcu * sequenceControlSetPtr->pictureHeightInLcu; } @@ -2390,7 +2390,7 @@ void EbHevcCopyApiFromApp( static int VerifyHmeDimention(unsigned int index,unsigned int HmeLevel0SearchAreaInWidth, EB_U32 NumberHmeSearchRegionInWidth[EB_HME_SEARCH_AREA_ROW_MAX_COUNT], unsigned int numberHmeSearchRegionInWidth ) { - int return_error = 0; + int return_error = 0; EB_U32 i; EB_U32 totalSearchWidth = 0; @@ -2401,7 +2401,7 @@ static int VerifyHmeDimention(unsigned int index,unsigned int HmeLevel0SearchAre SVT_LOG("SVT [Error]: Instance %u: Invalid HME Total Search Area. \n", index); return_error = -1; return return_error; - } + } return return_error; } @@ -2427,19 +2427,19 @@ static int VerifyHmeDimentionL1L2(unsigned int index, EB_U32 NumberHmeSearchRegi static EB_ERRORTYPE VerifySettings(\ SequenceControlSet_t *sequenceControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; const char *levelIdc; unsigned int levelIdx; EB_H265_ENC_CONFIGURATION *config = &sequenceControlSetPtr->staticConfig; unsigned int channelNumber = config->channelId; - if ( config->tier > 1 ) { + if ( config->tier > 1 ) { SVT_LOG("SVT [Error]: Instance %u: Tier must be [0 - 1]\n",channelNumber+1); return_error = EB_ErrorBadParameter; - } + } - // For levels below level 4 (exclusive), only the main tier is allowed + // For levels below level 4 (exclusive), only the main tier is allowed if(config->level < 40 && config->tier != 0){ SVT_LOG("SVT [Error]: Instance %u: For levels below level 4 (exclusive), only the main tier is allowed\n",channelNumber+1); return_error = EB_ErrorBadParameter; @@ -2532,8 +2532,8 @@ static EB_ERRORTYPE VerifySettings(\ if (sequenceControlSetPtr->maxInputLumaWidth < 64) { SVT_LOG("SVT [Error]: Instance %u: Source Width must be at least 64\n",channelNumber+1); - return_error = EB_ErrorBadParameter; - } + return_error = EB_ErrorBadParameter; + } if (sequenceControlSetPtr->maxInputLumaHeight < 64) { SVT_LOG("SVT [Error]: Instance %u: Source Width must be at least 64\n", channelNumber + 1); return_error = EB_ErrorBadParameter; @@ -2766,7 +2766,7 @@ static EB_ERRORTYPE VerifySettings(\ } if (config->constrainedIntra > 1) { SVT_LOG("SVT [Error]: Instance %u: The constrained intra must be [0 - 1] \n", channelNumber + 1); - return_error = EB_ErrorBadParameter; + return_error = EB_ErrorBadParameter; } if (config->rateControlMode > 1) { SVT_LOG("SVT [Error]: Instance %u: The rate control mode must be [0 - 1] \n", channelNumber + 1); @@ -2857,27 +2857,27 @@ static EB_ERRORTYPE VerifySettings(\ } if ((config->maxCLL && !config->highDynamicRangeInput) || (config->maxFALL && !config->highDynamicRangeInput)) { - SVT_LOG("SVT [Error]: Instance %u: maxCLL or maxFALL should be used only with high dynamic range input; set highDynamicRangeInput to 1\n", channelNumber); + SVT_LOG("SVT [Error]: Instance %u: maxCLL or maxFALL should be used only with high dynamic range input; set highDynamicRangeInput to 1\n", channelNumber); return_error = EB_ErrorBadParameter; } if (config->useMasteringDisplayColorVolume && !config->highDynamicRangeInput) { - SVT_LOG("SVT [Error]: Instance %u: MasterDisplay should be used only with high dynamic range input; set highDynamicRangeInput to 1\n", channelNumber); + SVT_LOG("SVT [Error]: Instance %u: MasterDisplay should be used only with high dynamic range input; set highDynamicRangeInput to 1\n", channelNumber); return_error = EB_ErrorBadParameter; } if (config->dolbyVisionProfile != 0 && config->dolbyVisionProfile != 81) { - SVT_LOG("SVT [Error]: Instance %u: Only Dolby Vision Profile 8.1 is supported \n", channelNumber); + SVT_LOG("SVT [Error]: Instance %u: Only Dolby Vision Profile 8.1 is supported \n", channelNumber); return_error = EB_ErrorBadParameter; } if (config->dolbyVisionProfile == 81 && config->encoderBitDepth != 10) { - SVT_LOG("SVT [Error]: Instance %u: Dolby Vision Profile 8.1 work only with main10 input \n", channelNumber); + SVT_LOG("SVT [Error]: Instance %u: Dolby Vision Profile 8.1 work only with main10 input \n", channelNumber); return_error = EB_ErrorBadParameter; } if (config->dolbyVisionProfile == 81 && !config->useMasteringDisplayColorVolume) { - SVT_LOG("SVT [Error]: Instance %u: Dolby Vision Profile 8.1 requires mastering display color volume information \n", channelNumber); + SVT_LOG("SVT [Error]: Instance %u: Dolby Vision Profile 8.1 requires mastering display color volume information \n", channelNumber); return_error = EB_ErrorBadParameter; } @@ -2897,13 +2897,13 @@ static EB_ERRORTYPE VerifySettings(\ SVT_LOG("SVT [Error]: Instance %u: Encoder Bit Depth shall be only 8 or 10 \n",channelNumber+1); return_error = EB_ErrorBadParameter; } - // Check if the EncoderBitDepth is conformant with the Profile constraint + // Check if the EncoderBitDepth is conformant with the Profile constraint if(config->profile == 1 && config->encoderBitDepth == 10) { SVT_LOG("SVT [Error]: Instance %u: The encoder bit depth shall be equal to 8 for Main Profile\n",channelNumber+1); return_error = EB_ErrorBadParameter; } - if (config->compressedTenBitFormat > 1) { + if (config->compressedTenBitFormat > 1) { SVT_LOG("SVT [Error]: Instance %u: Invalid Compressed Ten Bit Format shall be only [0 - 1] \n", channelNumber + 1); return_error = EB_ErrorBadParameter; } @@ -3568,8 +3568,8 @@ static EB_ERRORTYPE CopyUserSei( ************************************************/ static EB_ERRORTYPE CopyFrameBuffer( SequenceControlSet_t *sequenceControlSetPtr, - EB_U8 *dst, - EB_U8 *src, + EB_U8 *dst, + EB_U8 *src, UnPackContext_t *context_unpack) { EB_H265_ENC_CONFIGURATION *config = &sequenceControlSetPtr->staticConfig; @@ -3732,11 +3732,11 @@ static EB_ERRORTYPE CopyFrameBuffer( int nb = context_unpack->nbLumaThreads + context_unpack->nbChromaThreads*2; EbObjectWrapper_t *copyFrameBufferWrapperPtr; EB_ENC_UnPack2D_TYPE_t *unpackDataPtr; - + for (int i = 0; i< nb_luma; i++){ EbGetEmptyObject(context_unpack->copyFrameInputFifoPtr,©FrameBufferWrapperPtr); unpackDataPtr = (EB_ENC_UnPack2D_TYPE_t*)copyFrameBufferWrapperPtr->objectPtr; - unpackDataPtr->in16BitBuffer = (EB_U16*)(inputPtr->luma) + (EB_U32)(in_luma/nb_luma)*i; + unpackDataPtr->in16BitBuffer = (EB_U16*)(inputPtr->luma) + (EB_U32)(in_luma/nb_luma)*i; unpackDataPtr->inStride = (EB_U16)(inputPtr->yStride); unpackDataPtr->out8BitBuffer = inputPicturePtr->bufferY + lumaBufferOffset + (EB_U32)(out_luma/nb_luma)*i; unpackDataPtr->out8Stride = inputPicturePtr->strideY; @@ -3774,7 +3774,7 @@ static EB_ERRORTYPE CopyFrameBuffer( unpackDataPtr->height = chromaHeight/nb_chroma; EbPostFullObject(copyFrameBufferWrapperPtr); } - + EbObjectWrapper_t *unpackEndSyncWrapperPtr; for(int i = 0 ; i < nb; i++){ EbGetFullObject(context_unpack->unPackOutPutFifoPtr,&unpackEndSyncWrapperPtr); @@ -4182,10 +4182,10 @@ EB_ERRORTYPE EbOutputBufferHeaderCtor( { EB_H265_ENC_CONFIGURATION * config = (EB_H265_ENC_CONFIGURATION*)objectInitDataPtr; EB_U32 nStride = (EB_U32)(EB_OUTPUTSTREAMBUFFERSIZE_MACRO(config->sourceWidth * config->sourceHeight)); //TBC - EB_BUFFERHEADERTYPE* outBufPtr; + EB_BUFFERHEADERTYPE* outBufPtr; - EB_MALLOC(EB_BUFFERHEADERTYPE*, outBufPtr, sizeof(EB_BUFFERHEADERTYPE), EB_N_PTR); - *objectDblPtr = (EB_PTR)outBufPtr; + EB_MALLOC(EB_BUFFERHEADERTYPE*, outBufPtr, sizeof(EB_BUFFERHEADERTYPE), EB_N_PTR); + *objectDblPtr = (EB_PTR)outBufPtr; //Jing:TODO //Simple work around here, for 8K case. @@ -4195,13 +4195,13 @@ EB_ERRORTYPE EbOutputBufferHeaderCtor( nStride = 10000000; } - // Initialize Header - outBufPtr->nSize = sizeof(EB_BUFFERHEADERTYPE); + // Initialize Header + outBufPtr->nSize = sizeof(EB_BUFFERHEADERTYPE); #if !OUT_ALLOC - EB_MALLOC(EB_U8*, outBufPtr->pBuffer, nStride, EB_N_PTR); + EB_MALLOC(EB_U8*, outBufPtr->pBuffer, nStride, EB_N_PTR); #endif - outBufPtr->nAllocLen = nStride; - outBufPtr->pAppPrivate = NULL; + outBufPtr->nAllocLen = nStride; + outBufPtr->pAppPrivate = NULL; (void)objectInitDataPtr; diff --git a/Source/Lib/Codec/EbEncHandle.h b/Source/Lib/Codec/EbEncHandle.h index e501f3178..760ad1864 100644 --- a/Source/Lib/Codec/EbEncHandle.h +++ b/Source/Lib/Codec/EbEncHandle.h @@ -21,46 +21,46 @@ extern "C" { #endif /************************************** * Component Private Data - **************************************/ + **************************************/ typedef struct EbEncHandle_s { // Encode Instances & Compute Segments EB_U32 encodeInstanceTotalCount; EB_U32 *computeSegmentsTotalCountArray; - + // Config Set Counts - EB_U32 sequenceControlSetPoolTotalCount; - + EB_U32 sequenceControlSetPoolTotalCount; + // Full Results Count - EB_U32 pictureControlSetPoolTotalCount; - + EB_U32 pictureControlSetPoolTotalCount; + // Picture Buffer Counts EB_U32 reconPicturePoolTotalCount; EB_U32 coeffPicturePoolTotalCount; EB_U32 referencePicturePoolTotalCount; EB_U32 paReferencePicturPooleBufferInitCount; - + // Config Set Pool & Active Array EbSystemResource_t *sequenceControlSetPoolPtr; EbFifo_t **sequenceControlSetPoolProducerFifoPtrArray; EbSequenceControlSetInstance_t **sequenceControlSetInstanceArray; - - // Full Results + + // Full Results EbSystemResource_t **pictureControlSetPoolPtrArray; EbFifo_t ***pictureControlSetPoolProducerFifoPtrDblArray; //ParentControlSet EbSystemResource_t **pictureParentControlSetPoolPtrArray; EbFifo_t ***pictureParentControlSetPoolProducerFifoPtrDblArray; - + // Picture Buffers EbSystemResource_t **referencePicturePoolPtrArray; EbSystemResource_t **paReferencePicturePoolPtrArray; - - // Picture Buffer Producer Fifos + + // Picture Buffer Producer Fifos EbFifo_t ***referencePicturePoolProducerFifoPtrDblArray; EbFifo_t ***paReferencePicturePoolProducerFifoPtrDblArray; - + // Thread Handles EB_HANDLE resourceCoordinationThreadHandle; EB_HANDLE pictureEnhancementThreadHandle; @@ -68,7 +68,7 @@ typedef struct EbEncHandle_s EB_HANDLE pictureDecisionThreadHandle; EB_HANDLE *motionEstimationThreadHandleArray; EB_HANDLE initialRateControlThreadHandle; - EB_HANDLE *sourceBasedOperationsThreadHandleArray; + EB_HANDLE *sourceBasedOperationsThreadHandleArray; EB_HANDLE pictureManagerThreadHandle; EB_HANDLE rateControlThreadHandle; EB_HANDLE *modeDecisionConfigurationThreadHandleArray; @@ -76,7 +76,7 @@ typedef struct EbEncHandle_s EB_HANDLE *entropyCodingThreadHandleArray; EB_HANDLE packetizationThreadHandle; EB_HANDLE *unpackThreadHandleArray; - + // Contexts EB_PTR resourceCoordinationContextPtr; EB_PTR pictureEnhancementContextPtr; @@ -84,7 +84,7 @@ typedef struct EbEncHandle_s EB_PTR pictureDecisionContextPtr; EB_PTR *motionEstimationContextPtrArray; EB_PTR initialRateControlContextPtr; - EB_PTR *sourceBasedOperationsContextPtrArray; + EB_PTR *sourceBasedOperationsContextPtrArray; EB_PTR pictureManagerContextPtr; EB_PTR rateControlContextPtr; EB_PTR *modeDecisionConfigurationContextPtrArray; @@ -92,7 +92,7 @@ typedef struct EbEncHandle_s EB_PTR *entropyCodingContextPtrArray; EB_PTR packetizationContextPtr; EB_PTR *unpackContextPtr; - + // System Resource Managers EbSystemResource_t *inputBufferResourcePtr; EbSystemResource_t **outputStreamBufferResourcePtrArray; @@ -101,7 +101,7 @@ typedef struct EbEncHandle_s EbSystemResource_t *pictureAnalysisResultsResourcePtr; EbSystemResource_t *pictureDecisionResultsResourcePtr; EbSystemResource_t *motionEstimationResultsResourcePtr; - EbSystemResource_t *initialRateControlResultsResourcePtr; + EbSystemResource_t *initialRateControlResultsResourcePtr; EbSystemResource_t *pictureDemuxResultsResourcePtr; EbSystemResource_t *rateControlTasksResourcePtr; EbSystemResource_t *rateControlResultsResourcePtr; @@ -110,7 +110,7 @@ typedef struct EbEncHandle_s EbSystemResource_t *entropyCodingResultsResourcePtr; EbSystemResource_t *unpackTasksResourcePtr; EbSystemResource_t *unpackSyncResourcePtr; - + // Inter-Process Producer Fifos EbFifo_t **inputBufferProducerFifoPtrArray; EbFifo_t ***outputStreamBufferProducerFifoPtrDblArray; @@ -129,7 +129,7 @@ typedef struct EbEncHandle_s EbFifo_t **entropyCodingResultsProducerFifoPtrArray; EbFifo_t **unpackTasksProducerFifoPtrArray; EbFifo_t **unpackSyncProducerFifoPtrArray; - + // Inter-Process Consumer Fifos EbFifo_t **inputBufferConsumerFifoPtrArray; EbFifo_t ***outputStreamBufferConsumerFifoPtrDblArray; @@ -146,22 +146,22 @@ typedef struct EbEncHandle_s EbFifo_t **encDecResultsConsumerFifoPtrArray; EbFifo_t **entropyCodingResultsConsumerFifoPtrArray; EbFifo_t **unpackTasksConsumerFifoPtrArray; - EbFifo_t **unpackSyncConsumerFifoPtrArray; + EbFifo_t **unpackSyncConsumerFifoPtrArray; // Callbacks EbCallback_t **appCallbackPtrArray; - + // Input Video Ports EB_PARAM_PORTDEFINITIONTYPE **inputVideoPortPtrArray; - + // Output Bitstream Port EB_PARAM_PORTDEFINITIONTYPE **outputStreamPortPtrArray; - + // Output Recon Video Port - // *Note - Recon Video buffers will have distortion data appended to + // *Note - Recon Video buffers will have distortion data appended to // the end of the buffer. This distortion data aids in the calculation // of PSNR. // Memory Map - EbMemoryMapEntry *memoryMap; + EbMemoryMapEntry *memoryMap; EB_U32 memoryMapIndex; EB_U64 totalLibMemory; @@ -169,9 +169,9 @@ typedef struct EbEncHandle_s /************************************** * EB_BUFFERHEADERTYPE Constructor - **************************************/ + **************************************/ extern EB_ERRORTYPE EbInputBufferHeaderCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); extern EB_ERRORTYPE EbOutputBufferHeaderCtor( diff --git a/Source/Lib/Codec/EbEncodeContext.c b/Source/Lib/Codec/EbEncodeContext.c index edbab3b20..ac52e868e 100644 --- a/Source/Lib/Codec/EbEncodeContext.c +++ b/Source/Lib/Codec/EbEncodeContext.c @@ -13,64 +13,64 @@ #include "EbErrorHandling.h" EB_ERRORTYPE EncodeContextCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { EB_U32 pictureIndex; EB_ERRORTYPE return_error = EB_ErrorNone; - + EncodeContext_t *encodeContextPtr; EB_MALLOC(EncodeContext_t*, encodeContextPtr, sizeof(EncodeContext_t), EB_N_PTR); *objectDblPtr = (EB_PTR) encodeContextPtr; - + objectInitDataPtr = 0; CHECK_REPORT_ERROR( - (objectInitDataPtr == 0), - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR29); + (objectInitDataPtr == 0), + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR29); // Callback Functions encodeContextPtr->appCallbackPtr = (EbCallback_t*) EB_NULL; - + // Port Active State EB_CREATEMUTEX(EB_HANDLE, encodeContextPtr->terminatingConditionsMutex, sizeof(EB_HANDLE), EB_MUTEX); encodeContextPtr->totalNumberOfReconFrames = 0; - - + + // Output Buffer Fifos encodeContextPtr->streamOutputFifoPtr = (EbFifo_t*) EB_NULL; - + // Picture Buffer Fifos encodeContextPtr->inputPicturePoolFifoPtr = (EbFifo_t*) EB_NULL; - encodeContextPtr->referencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; - encodeContextPtr->paReferencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; - + encodeContextPtr->referencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; + encodeContextPtr->paReferencePicturePoolFifoPtr = (EbFifo_t*) EB_NULL; + // Picture Decision Reordering Queue encodeContextPtr->pictureDecisionReorderQueueHeadIndex = 0; EB_MALLOC(PictureDecisionReorderEntry_t**, encodeContextPtr->pictureDecisionReorderQueue, sizeof(PictureDecisionReorderEntry_t*) * PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { - return_error = PictureDecisionReorderEntryCtor( + return_error = PictureDecisionReorderEntryCtor( &(encodeContextPtr->pictureDecisionReorderQueue[pictureIndex]), pictureIndex); if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } - - // Picture Manager Reordering Queue - encodeContextPtr->pictureManagerReorderQueueHeadIndex = 0; - EB_MALLOC(PictureManagerReorderEntry_t**, encodeContextPtr->pictureManagerReorderQueue, sizeof(PictureManagerReorderEntry_t*) * PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - for (pictureIndex = 0; pictureIndex < PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { - return_error = PictureManagerReorderEntryCtor( - &(encodeContextPtr->pictureManagerReorderQueue[pictureIndex]), - pictureIndex); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - } + // Picture Manager Reordering Queue + encodeContextPtr->pictureManagerReorderQueueHeadIndex = 0; + EB_MALLOC(PictureManagerReorderEntry_t**, encodeContextPtr->pictureManagerReorderQueue, sizeof(PictureManagerReorderEntry_t*) * PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); + + for (pictureIndex = 0; pictureIndex < PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { + return_error = PictureManagerReorderEntryCtor( + &(encodeContextPtr->pictureManagerReorderQueue[pictureIndex]), + pictureIndex); + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + } // Picture Manager Pre-Assignment Buffer @@ -85,7 +85,7 @@ EB_ERRORTYPE EncodeContextCtor( encodeContextPtr->numberOfActivePictures = 0; EB_MALLOC(EbObjectWrapper_t**, encodeContextPtr->preAssignmentBuffer, sizeof(EbObjectWrapper_t*) * PRE_ASSIGNMENT_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < PRE_ASSIGNMENT_MAX_DEPTH; ++pictureIndex) { encodeContextPtr->preAssignmentBuffer[pictureIndex] = (EbObjectWrapper_t*) EB_NULL; } @@ -102,12 +102,12 @@ EB_ERRORTYPE EncodeContextCtor( return EB_ErrorInsufficientResources; } } - + // Picture Manager Reference Queue encodeContextPtr->referencePictureQueueHeadIndex = 0; encodeContextPtr->referencePictureQueueTailIndex = 0; EB_MALLOC(ReferenceQueueEntry_t**, encodeContextPtr->referencePictureQueue, sizeof(ReferenceQueueEntry_t*) * REFERENCE_QUEUE_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < REFERENCE_QUEUE_MAX_DEPTH; ++pictureIndex) { return_error = ReferenceQueueEntryCtor( &(encodeContextPtr->referencePictureQueue[pictureIndex])); @@ -115,25 +115,25 @@ EB_ERRORTYPE EncodeContextCtor( return EB_ErrorInsufficientResources; } } - + // Picture Decision PA Reference Queue encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex = 0; encodeContextPtr->pictureDecisionPaReferenceQueueTailIndex = 0; EB_MALLOC(PaReferenceQueueEntry_t**, encodeContextPtr->pictureDecisionPaReferenceQueue, sizeof(PaReferenceQueueEntry_t*) * PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH, EB_N_PTR); for(pictureIndex=0; pictureIndex < PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH; ++pictureIndex) { - return_error = PaReferenceQueueEntryCtor( + return_error = PaReferenceQueueEntryCtor( &(encodeContextPtr->pictureDecisionPaReferenceQueue[pictureIndex])); if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } } - + // Initial Rate Control Reordering Queue encodeContextPtr->initialRateControlReorderQueueHeadIndex = 0; EB_MALLOC(InitialRateControlReorderEntry_t**, encodeContextPtr->initialRateControlReorderQueue, sizeof(InitialRateControlReorderEntry_t*) * INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - for(pictureIndex=0; pictureIndex < INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { + for(pictureIndex=0; pictureIndex < INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { return_error = InitialRateControlReorderEntryCtor( &(encodeContextPtr->initialRateControlReorderQueue[pictureIndex]), pictureIndex); @@ -144,7 +144,7 @@ EB_ERRORTYPE EncodeContextCtor( // High level Rate Control histogram Queue encodeContextPtr->hlRateControlHistorgramQueueHeadIndex = 0; - + EB_CALLOC(HlRateControlHistogramEntry_t**, encodeContextPtr->hlRateControlHistorgramQueue, sizeof(HlRateControlHistogramEntry_t*) * HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH, 1, EB_N_PTR); for(pictureIndex=0; pictureIndex < HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH; ++pictureIndex) { @@ -161,7 +161,7 @@ EB_ERRORTYPE EncodeContextCtor( // Packetization Reordering Queue encodeContextPtr->packetizationReorderQueueHeadIndex = 0; EB_MALLOC(PacketizationReorderEntry_t**, encodeContextPtr->packetizationReorderQueue, sizeof(PacketizationReorderEntry_t*) * PACKETIZATION_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR); - + for(pictureIndex=0; pictureIndex < PACKETIZATION_REORDER_QUEUE_MAX_DEPTH; ++pictureIndex) { return_error = PacketizationReorderEntryCtor( &(encodeContextPtr->packetizationReorderQueue[pictureIndex]), @@ -170,7 +170,7 @@ EB_ERRORTYPE EncodeContextCtor( return EB_ErrorInsufficientResources; } } - + encodeContextPtr->intraPeriodPosition = 0; encodeContextPtr->predStructPosition = 0; encodeContextPtr->currentInputPoc = -1; @@ -234,12 +234,12 @@ EB_ERRORTYPE EncodeContextCtor( encodeContextPtr->maxCodedPocSelectedRefQp = 32; encodeContextPtr->sharedReferenceMutex = EbCreateMutex(); - if (encodeContextPtr->sharedReferenceMutex == (EB_HANDLE) EB_NULL){ + if (encodeContextPtr->sharedReferenceMutex == (EB_HANDLE) EB_NULL){ return EB_ErrorInsufficientResources; }else { memoryMap[*(memoryMapIndex)].ptrType = EB_MUTEX; memoryMap[(*(memoryMapIndex))++].ptr = encodeContextPtr->sharedReferenceMutex ; - *totalLibMemory += (sizeof(EB_HANDLE)); + *totalLibMemory += (sizeof(EB_HANDLE)); } diff --git a/Source/Lib/Codec/EbEncodeContext.h b/Source/Lib/Codec/EbEncodeContext.h index ec06c4111..f234edebc 100644 --- a/Source/Lib/Codec/EbEncodeContext.h +++ b/Source/Lib/Codec/EbEncodeContext.h @@ -38,13 +38,13 @@ extern "C" { #define HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH 2048 #define PACKETIZATION_REORDER_QUEUE_MAX_DEPTH 2048 -// RC Groups: They should be a power of 2, so we can replace % by &. +// RC Groups: They should be a power of 2, so we can replace % by &. // Instead of using x % y, we use x && (y-1) -#define PARALLEL_GOP_MAX_NUMBER 256 +#define PARALLEL_GOP_MAX_NUMBER 256 #define RC_GROUP_IN_GOP_MAX_NUMBER 512 #define PICTURE_IN_RC_GROUP_MAX_NUMBER 64 -typedef struct EncodeContext_s +typedef struct EncodeContext_s { // Callback Functions EbCallback_t *appCallbackPtr; @@ -55,19 +55,19 @@ typedef struct EncodeContext_s // Output Buffer Fifos EbFifo_t *streamOutputFifoPtr; EbFifo_t *reconOutputFifoPtr; - + // Picture Buffer Fifos EbFifo_t *inputPicturePoolFifoPtr; EbFifo_t *referencePicturePoolFifoPtr; EbFifo_t *paReferencePicturePoolFifoPtr; - + // Picture Decision Reorder Queue PictureDecisionReorderEntry_t **pictureDecisionReorderQueue; EB_U32 pictureDecisionReorderQueueHeadIndex; - - // Picture Manager Reorder Queue - PictureManagerReorderEntry_t **pictureManagerReorderQueue; - EB_U32 pictureManagerReorderQueueHeadIndex; + + // Picture Manager Reorder Queue + PictureManagerReorderEntry_t **pictureManagerReorderQueue; + EB_U32 pictureManagerReorderQueueHeadIndex; // Picture Manager Pre-Assignment Buffer EB_U32 preAssignmentBufferIntraCount; @@ -76,7 +76,7 @@ typedef struct EncodeContext_s EB_U32 preAssignmentBufferSceneChangeIndex; EB_U32 preAssignmentBufferEosFlag; EB_U64 decodeBaseNumber; - + EbObjectWrapper_t **preAssignmentBuffer; EB_U32 preAssignmentBufferCount; EB_U32 numberOfActivePictures; @@ -94,7 +94,7 @@ typedef struct EncodeContext_s ReferenceQueueEntry_t **referencePictureQueue; EB_U32 referencePictureQueueHeadIndex; EB_U32 referencePictureQueueTailIndex; - + // Initial Rate Control Reorder Queue InitialRateControlReorderEntry_t **initialRateControlReorderQueue; EB_U32 initialRateControlReorderQueueHeadIndex; @@ -107,7 +107,7 @@ typedef struct EncodeContext_s // Packetization Reorder Queue PacketizationReorderEntry_t **packetizationReorderQueue; EB_U32 packetizationReorderQueueHeadIndex; - + // GOP Counters EB_U32 intraPeriodPosition; // Current position in intra period EB_U32 predStructPosition; // Current position within a prediction structure @@ -119,14 +119,14 @@ typedef struct EncodeContext_s EB_U64 lastIdrPicture; // the most recently occured IDR picture (in decode order) // Sequence Termination Flags - EB_U64 terminatingPictureNumber; - EB_BOOL terminatingSequenceFlagReceived; + EB_U64 terminatingPictureNumber; + EB_BOOL terminatingSequenceFlagReceived; // Prediction Structure PredictionStructureGroup_t *predictionStructureGroupPtr; - + // Cabac Context Model Array - ContextModelEncContext_t *cabacContextModelArray; + ContextModelEncContext_t *cabacContextModelArray; // MD Rate Estimation Table MdRateEstimationContext_t *mdRateEstimationArray; @@ -142,7 +142,7 @@ typedef struct EncodeContext_s EB_S64 scFrameOut; EB_HANDLE scBufferMutex; - EB_ENC_MODE encMode; + EB_ENC_MODE encMode; // Rate Control EB_U32 availableTargetBitRate; @@ -153,15 +153,15 @@ typedef struct EncodeContext_s EB_S64 fillerBitError; EB_HANDLE bufferFillMutex; - EB_U32 previousSelectedRefQp; - EB_U64 maxCodedPoc; - EB_U32 maxCodedPocSelectedRefQp; + EB_U32 previousSelectedRefQp; + EB_U64 maxCodedPoc; + EB_U32 maxCodedPocSelectedRefQp; - // Dynamic GOP - EB_U32 previousMiniGopHierarchicalLevels; + // Dynamic GOP + EB_U32 previousMiniGopHierarchicalLevels; - EbObjectWrapper_t *previousPictureControlSetWrapperPtr; - EB_HANDLE sharedReferenceMutex; + EbObjectWrapper_t *previousPictureControlSetWrapperPtr; + EB_HANDLE sharedReferenceMutex; } EncodeContext_t; @@ -174,9 +174,9 @@ typedef struct EncodeContextInitData_s { * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EncodeContextCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbEntropyCoding.c b/Source/Lib/Codec/EbEntropyCoding.c index c05a3ebd1..d247d9ba6 100644 --- a/Source/Lib/Codec/EbEntropyCoding.c +++ b/Source/Lib/Codec/EbEntropyCoding.c @@ -31,10 +31,10 @@ enum COEFF_SCAN_TYPE { - SCAN_ZIGZAG = 0, // zigzag scan - SCAN_HOR, // first scan is horizontal - SCAN_VER, // first scan is vertical - SCAN_DIAG // up-right diagonal scan + SCAN_ZIGZAG = 0, // zigzag scan + SCAN_HOR, // first scan is horizontal + SCAN_VER, // first scan is vertical + SCAN_DIAG // up-right diagonal scan }; @@ -72,25 +72,25 @@ static EB_U32 maxTileRow[TOTAL_LEVEL_COUNT] = { 1, 1, 1, 2, 3, 5, 5, 11, 11, ************************************************/ static void BacEncContextFinish(BacEncContext_t *bacEncContextPtr) { - EB_U32 carry; + EB_U32 carry; - carry = bacEncContextPtr->intervalLowValue >> (32 - bacEncContextPtr->bitsRemainingNum); - bacEncContextPtr->intervalLowValue &= 0xffffffffu >> bacEncContextPtr->bitsRemainingNum; + carry = bacEncContextPtr->intervalLowValue >> (32 - bacEncContextPtr->bitsRemainingNum); + bacEncContextPtr->intervalLowValue &= 0xffffffffu >> bacEncContextPtr->bitsRemainingNum; if (carry > 0 || bacEncContextPtr->tempBufferedBytesNum > 0) { OutputBitstreamWriteByte(&(bacEncContextPtr->m_pcTComBitIf), (bacEncContextPtr->tempBufferedByte + carry) & 0xff); } - while (bacEncContextPtr->tempBufferedBytesNum > 1) - { - OutputBitstreamWriteByte(&(bacEncContextPtr->m_pcTComBitIf), (0xff + carry) & 0xff); + while (bacEncContextPtr->tempBufferedBytesNum > 1) + { + OutputBitstreamWriteByte(&(bacEncContextPtr->m_pcTComBitIf), (0xff + carry) & 0xff); - bacEncContextPtr->tempBufferedBytesNum--; - } + bacEncContextPtr->tempBufferedBytesNum--; + } - OutputBitstreamWrite( - &(bacEncContextPtr->m_pcTComBitIf), - bacEncContextPtr->intervalLowValue >> 8, - 24 - bacEncContextPtr->bitsRemainingNum); + OutputBitstreamWrite( + &(bacEncContextPtr->m_pcTComBitIf), + bacEncContextPtr->intervalLowValue >> 8, + 24 - bacEncContextPtr->bitsRemainingNum); } @@ -98,11 +98,11 @@ static void BacEncContextFinish(BacEncContext_t *bacEncContextPtr) * CABAC Encoder Constructor ************************************************/ void EbHevcCabacCtor( - CabacEncodeContext_t *cabacEncContextPtr) + CabacEncodeContext_t *cabacEncContextPtr) { - EB_MEMSET(cabacEncContextPtr, 0, sizeof(CabacEncodeContext_t)); + EB_MEMSET(cabacEncContextPtr, 0, sizeof(CabacEncodeContext_t)); - return; + return; } /************************************************ @@ -110,15 +110,15 @@ void EbHevcCabacCtor( ************************************************/ inline static EB_ERRORTYPE ResetBacEnc(BacEncContext_t *bacEncContextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - bacEncContextPtr->intervalLowValue = 0; - bacEncContextPtr->intervalRangeValue = 510; - bacEncContextPtr->bitsRemainingNum = 23; - bacEncContextPtr->tempBufferedBytesNum = 0; - bacEncContextPtr->tempBufferedByte = 0xff; + bacEncContextPtr->intervalLowValue = 0; + bacEncContextPtr->intervalRangeValue = 510; + bacEncContextPtr->bitsRemainingNum = 23; + bacEncContextPtr->tempBufferedBytesNum = 0; + bacEncContextPtr->tempBufferedByte = 0xff; - return return_error; + return return_error; } /********************************************************************* @@ -132,46 +132,46 @@ inline static EB_ERRORTYPE ResetBacEnc(BacEncContext_t *bacEncContextPtr) * input pointer to the prediction unit *********************************************************************/ static void EncodeSplitFlag( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 cuDepth, - EB_U32 maxCuDepth, - EB_BOOL splitFlag, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *leafDepthNeighborArray) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 cuDepth, + EB_U32 maxCuDepth, + EB_BOOL splitFlag, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *leafDepthNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - cuOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - cuOriginX); - EB_U32 leafDepthLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - leafDepthNeighborArray, - cuOriginY); - EB_U32 leafDepthTopNeighborIndex = GetNeighborArrayUnitTopIndex( - leafDepthNeighborArray, - cuOriginX); - - EB_U32 contextIndex; - - if (cuDepth < (maxCuDepth - 1)) { - - contextIndex = - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (leafDepthNeighborArray->leftArray[leafDepthLeftNeighborIndex] > cuDepth) ? 1 : 0; - contextIndex += - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (leafDepthNeighborArray->topArray[leafDepthTopNeighborIndex] > cuDepth) ? 1 : 0; - - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - splitFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.splitFlagContextModel[contextIndex])); - } - - return; + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + cuOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + cuOriginX); + EB_U32 leafDepthLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + leafDepthNeighborArray, + cuOriginY); + EB_U32 leafDepthTopNeighborIndex = GetNeighborArrayUnitTopIndex( + leafDepthNeighborArray, + cuOriginX); + + EB_U32 contextIndex; + + if (cuDepth < (maxCuDepth - 1)) { + + contextIndex = + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (leafDepthNeighborArray->leftArray[leafDepthLeftNeighborIndex] > cuDepth) ? 1 : 0; + contextIndex += + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (leafDepthNeighborArray->topArray[leafDepthTopNeighborIndex] > cuDepth) ? 1 : 0; + + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + splitFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.splitFlagContextModel[contextIndex])); + } + + return; } /********************************************************************* @@ -185,39 +185,39 @@ static void EncodeSplitFlag( * input pointer to the prediction unit *********************************************************************/ static void EncodeSkipFlag( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_BOOL skipFlag, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *skipFlagNeighborArray) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_BOOL skipFlag, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *skipFlagNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - cuOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - cuOriginX); - EB_U32 skipFlagLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - skipFlagNeighborArray, - cuOriginY); - EB_U32 skipFlagTopNeighborIndex = GetNeighborArrayUnitTopIndex( - skipFlagNeighborArray, - cuOriginX); - - EB_U32 contextIndex; - - contextIndex = - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (skipFlagNeighborArray->leftArray[skipFlagLeftNeighborIndex] == EB_TRUE) ? 1 : 0; - contextIndex += - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (skipFlagNeighborArray->topArray[skipFlagTopNeighborIndex] == EB_TRUE) ? 1 : 0; - - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - skipFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.skipFlagContextModel[contextIndex])); + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + cuOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + cuOriginX); + EB_U32 skipFlagLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + skipFlagNeighborArray, + cuOriginY); + EB_U32 skipFlagTopNeighborIndex = GetNeighborArrayUnitTopIndex( + skipFlagNeighborArray, + cuOriginX); + + EB_U32 contextIndex; + + contextIndex = + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (skipFlagNeighborArray->leftArray[skipFlagLeftNeighborIndex] == EB_TRUE) ? 1 : 0; + contextIndex += + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (skipFlagNeighborArray->topArray[skipFlagTopNeighborIndex] == EB_TRUE) ? 1 : 0; + + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + skipFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.skipFlagContextModel[contextIndex])); } @@ -232,19 +232,19 @@ static void EncodeSkipFlag( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodeMergeFlag( - CabacEncodeContext_t *cabacEncodeCtxPtr, - PredictionUnit_t *puPtr) + CabacEncodeContext_t *cabacEncodeCtxPtr, + PredictionUnit_t *puPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 mergeFlag = (puPtr->mergeFlag) ? 1 : 0; + EB_U32 mergeFlag = (puPtr->mergeFlag) ? 1 : 0; - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - mergeFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.mergeFlagContextModel[0])); + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + mergeFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.mergeFlagContextModel[0])); - return return_error; + return return_error; } /********************************************************************* @@ -258,97 +258,97 @@ EB_ERRORTYPE EncodeMergeFlag( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodeMergeIndex( - CabacEncodeContext_t *cabacEncodeCtxPtr, - PredictionUnit_t *puPtr) + CabacEncodeContext_t *cabacEncodeCtxPtr, + PredictionUnit_t *puPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 mergeIndex = puPtr->mergeIndex; + EB_U32 mergeIndex = puPtr->mergeIndex; - switch (mergeIndex){ - case 4: - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); + switch (mergeIndex){ + case 4: + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1); - break; + break; - case 3: - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); + case 3: + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0); - break; + break; - case 2: - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); + case 2: + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0); - break; + break; - case 1: - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); + case 1: + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0); - break; + break; - case 0: - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0, - &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); + case 0: + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0, + &(cabacEncodeCtxPtr->contextModelEncContext.mergeIndexContextModel[0])); - break; + break; - default: - break; + default: + break; - } + } - return return_error; + return return_error; } /********************************************************************* @@ -365,20 +365,20 @@ EB_ERRORTYPE EncodeMergeIndex( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodeMvpIndex( - CabacEncodeContext_t *cabacEncodeCtxPtr, - PredictionUnit_t *puPtr, - EB_REFLIST refList) + CabacEncodeContext_t *cabacEncodeCtxPtr, + PredictionUnit_t *puPtr, + EB_REFLIST refList) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 mvpIndex = refList == REF_LIST_0 ? puPtr->mvd[REF_LIST_0].predIdx : puPtr->mvd[REF_LIST_1].predIdx; + EB_U32 mvpIndex = refList == REF_LIST_0 ? puPtr->mvd[REF_LIST_0].predIdx : puPtr->mvd[REF_LIST_1].predIdx; - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - mvpIndex, - &(cabacEncodeCtxPtr->contextModelEncContext.mvpIndexContextModel[0])); + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + mvpIndex, + &(cabacEncodeCtxPtr->contextModelEncContext.mvpIndexContextModel[0])); - return return_error; + return return_error; } /********************************************************************* @@ -392,43 +392,43 @@ EB_ERRORTYPE EncodeMvpIndex( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodePartitionSize( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - EB_U32 tbMaxDepth) + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + EB_U32 tbMaxDepth) { - EB_ERRORTYPE return_error = EB_ErrorNone; - if (cuPtr->predictionModeFlag == INTRA_MODE) { - if (GetCodedUnitStats(cuPtr->leafIndex)->depth == (tbMaxDepth - 1)) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, // SIZE_2Nx2N - &(cabacEncodeCtxPtr->contextModelEncContext.partSizeContextModel[0])); - } - } - // only true for P-mode and 2Nx2N partition - else { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.partSizeContextModel[0])); - } - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + if (cuPtr->predictionModeFlag == INTRA_MODE) { + if (GetCodedUnitStats(cuPtr->leafIndex)->depth == (tbMaxDepth - 1)) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, // SIZE_2Nx2N + &(cabacEncodeCtxPtr->contextModelEncContext.partSizeContextModel[0])); + } + } + // only true for P-mode and 2Nx2N partition + else { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.partSizeContextModel[0])); + } + return return_error; } EB_ERRORTYPE EncodeIntra4x4PartitionSize( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - EB_U32 tbMaxDepth) + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + EB_U32 tbMaxDepth) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - if (GetCodedUnitStats(cuPtr->leafIndex)->depth == (tbMaxDepth - 1)) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0, // SIZE_NxN - &(cabacEncodeCtxPtr->contextModelEncContext.partSizeContextModel[0])); - } - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + if (GetCodedUnitStats(cuPtr->leafIndex)->depth == (tbMaxDepth - 1)) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0, // SIZE_NxN + &(cabacEncodeCtxPtr->contextModelEncContext.partSizeContextModel[0])); + } + return return_error; } /********************************************************************* @@ -442,17 +442,17 @@ EB_ERRORTYPE EncodeIntra4x4PartitionSize( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodePredictionMode( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr) + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (cuPtr->predictionModeFlag == INTER_MODE) ? 0 : 1, - &(cabacEncodeCtxPtr->contextModelEncContext.predModeContextModel[0])); + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (cuPtr->predictionModeFlag == INTER_MODE) ? 0 : 1, + &(cabacEncodeCtxPtr->contextModelEncContext.predModeContextModel[0])); - return return_error; + return return_error; } /********************************************************************* * EncodeIntraLumaModeFirstStage @@ -465,88 +465,88 @@ EB_ERRORTYPE EncodePredictionMode( * input pointer to the prediction unit *********************************************************************/ static void EncodeIntraLumaModeFirstStage( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 puOriginX, - EB_U32 puOriginY, - EB_U32 lcuSize, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 puOriginX, + EB_U32 puOriginY, + EB_U32 lcuSize, EB_U8 *intraLumaLeftMode, EB_U8 *intraLumaTopMode, EB_U32 lumaMode, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray) + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - puOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - puOriginX); - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaModeNeighborArray, - puOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaModeNeighborArray, - puOriginX); - - EB_S32 predictionIndex; - EB_U32 lumaPredictionArray[3]; - - EB_U32 leftNeighborMode = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? (EB_U32)EB_INTRA_DC : - intraLumaModeNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); - - EB_U32 topNeighborMode = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? (EB_U32)EB_INTRA_DC : - ((puOriginY & (lcuSize - 1)) == 0) ? (EB_U32)EB_INTRA_DC : - intraLumaModeNeighborArray->topArray[intraLumaModeTopNeighborIndex]); + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + puOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + puOriginX); + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaModeNeighborArray, + puOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaModeNeighborArray, + puOriginX); + + EB_S32 predictionIndex; + EB_U32 lumaPredictionArray[3]; + + EB_U32 leftNeighborMode = (EB_U32)( + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? (EB_U32)EB_INTRA_DC : + intraLumaModeNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + + EB_U32 topNeighborMode = (EB_U32)( + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? (EB_U32)EB_INTRA_DC : + ((puOriginY & (lcuSize - 1)) == 0) ? (EB_U32)EB_INTRA_DC : + intraLumaModeNeighborArray->topArray[intraLumaModeTopNeighborIndex]); *intraLumaLeftMode = (EB_U8)leftNeighborMode; *intraLumaTopMode = (EB_U8)topNeighborMode; - if (leftNeighborMode == topNeighborMode) { - - if (leftNeighborMode > 1) { // For angular modes - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - lumaPredictionArray[0] = EB_INTRA_PLANAR; - lumaPredictionArray[1] = EB_INTRA_DC; - lumaPredictionArray[2] = EB_INTRA_VERTICAL; - } - } - else { - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } - - predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : - (lumaMode == lumaPredictionArray[1]) ? 1 : - (lumaMode == lumaPredictionArray[2]) ? 2 : - -1; // luma mode is not equal to any of the predictors - - if (predictionIndex != -1) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.intraLumaContextModel[0])); - - } - else { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0, - &(cabacEncodeCtxPtr->contextModelEncContext.intraLumaContextModel[0])); - } + if (leftNeighborMode == topNeighborMode) { + + if (leftNeighborMode > 1) { // For angular modes + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + lumaPredictionArray[0] = EB_INTRA_PLANAR; + lumaPredictionArray[1] = EB_INTRA_DC; + lumaPredictionArray[2] = EB_INTRA_VERTICAL; + } + } + else { + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } + + predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : + (lumaMode == lumaPredictionArray[1]) ? 1 : + (lumaMode == lumaPredictionArray[2]) ? 2 : + -1; // luma mode is not equal to any of the predictors + + if (predictionIndex != -1) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.intraLumaContextModel[0])); + + } + else { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0, + &(cabacEncodeCtxPtr->contextModelEncContext.intraLumaContextModel[0])); + } } /********************************************************************* @@ -560,86 +560,86 @@ static void EncodeIntraLumaModeFirstStage( * input pointer to the prediction unit *********************************************************************/ static void EncodeIntraLumaModeSecondStage( - CabacEncodeContext_t *cabacEncodeCtxPtr, + CabacEncodeContext_t *cabacEncodeCtxPtr, EB_U8 leftNeighborMode, EB_U8 topNeighborMode, EB_U32 lumaMode) { - EB_S32 predictionIndex; - - EB_U32 lumaPredictionArray[3]; - - if (leftNeighborMode == topNeighborMode) { - - if (leftNeighborMode > 1) { // For angular modes - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - lumaPredictionArray[0] = EB_INTRA_PLANAR; - lumaPredictionArray[1] = EB_INTRA_DC; - lumaPredictionArray[2] = EB_INTRA_VERTICAL; - } - } - else { - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } - - predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : - (lumaMode == lumaPredictionArray[1]) ? 1 : - (lumaMode == lumaPredictionArray[2]) ? 2 : - -1; // luma mode is not equal to any of the predictors - - if (predictionIndex != -1) { - - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - predictionIndex ? 1 : 0); - - if (predictionIndex) { - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - predictionIndex - 1); - } - } - else { - - if (lumaPredictionArray[0] > lumaPredictionArray[1]) { - SWAP(lumaPredictionArray[0], lumaPredictionArray[1]); - } - - if (lumaPredictionArray[0] > lumaPredictionArray[2]) { - SWAP(lumaPredictionArray[0], lumaPredictionArray[2]); - } - - if (lumaPredictionArray[1] > lumaPredictionArray[2]) { - SWAP(lumaPredictionArray[1], lumaPredictionArray[2]); - } - - lumaMode = - (lumaMode > lumaPredictionArray[2]) ? lumaMode - 1 : - lumaMode; - lumaMode = - (lumaMode > lumaPredictionArray[1]) ? lumaMode - 1 : - lumaMode; - lumaMode = - (lumaMode > lumaPredictionArray[0]) ? lumaMode - 1 : - lumaMode; - - EncodeBypassBins( - &(cabacEncodeCtxPtr->bacEncContext), - lumaMode, - 5); - } + EB_S32 predictionIndex; + + EB_U32 lumaPredictionArray[3]; + + if (leftNeighborMode == topNeighborMode) { + + if (leftNeighborMode > 1) { // For angular modes + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + lumaPredictionArray[0] = EB_INTRA_PLANAR; + lumaPredictionArray[1] = EB_INTRA_DC; + lumaPredictionArray[2] = EB_INTRA_VERTICAL; + } + } + else { + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } + + predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : + (lumaMode == lumaPredictionArray[1]) ? 1 : + (lumaMode == lumaPredictionArray[2]) ? 2 : + -1; // luma mode is not equal to any of the predictors + + if (predictionIndex != -1) { + + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + predictionIndex ? 1 : 0); + + if (predictionIndex) { + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + predictionIndex - 1); + } + } + else { + + if (lumaPredictionArray[0] > lumaPredictionArray[1]) { + SWAP(lumaPredictionArray[0], lumaPredictionArray[1]); + } + + if (lumaPredictionArray[0] > lumaPredictionArray[2]) { + SWAP(lumaPredictionArray[0], lumaPredictionArray[2]); + } + + if (lumaPredictionArray[1] > lumaPredictionArray[2]) { + SWAP(lumaPredictionArray[1], lumaPredictionArray[2]); + } + + lumaMode = + (lumaMode > lumaPredictionArray[2]) ? lumaMode - 1 : + lumaMode; + lumaMode = + (lumaMode > lumaPredictionArray[1]) ? lumaMode - 1 : + lumaMode; + lumaMode = + (lumaMode > lumaPredictionArray[0]) ? lumaMode - 1 : + lumaMode; + + EncodeBypassBins( + &(cabacEncodeCtxPtr->bacEncContext), + lumaMode, + 5); + } } @@ -654,10 +654,10 @@ static void EncodeIntraLumaModeSecondStage( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodeIntraChromaMode( - CabacEncodeContext_t *cabacEncodeCtxPtr) + CabacEncodeContext_t *cabacEncodeCtxPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; // EB_INTRA_CHROMA_DM EncodeOneBin( @@ -665,7 +665,7 @@ EB_ERRORTYPE EncodeIntraChromaMode( 0, &(cabacEncodeCtxPtr->contextModelEncContext.intraChromaContextModel[0])); - return return_error; + return return_error; } /********************************************************************* @@ -682,34 +682,34 @@ EB_ERRORTYPE EncodeIntraChromaMode( * input count for exponential golomb code *********************************************************************/ EB_ERRORTYPE ExponentialGolombCode( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 symbol, - EB_U32 count) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 symbol, + EB_U32 count) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 bins = 0; - EB_S32 numOfBins = 0; - - while (symbol >= (EB_U32)(1 << count)) - { - bins = (bins << 1) + 1; - numOfBins++; - symbol -= 1 << count; - count++; - } - bins = (bins << 1); - numOfBins++; - - bins = (bins << count) | symbol; - numOfBins += count; - - EncodeBypassBins( - &(cabacEncodeCtxPtr->bacEncContext), - bins, - numOfBins); - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 bins = 0; + EB_S32 numOfBins = 0; + + while (symbol >= (EB_U32)(1 << count)) + { + bins = (bins << 1) + 1; + numOfBins++; + symbol -= 1 << count; + count++; + } + bins = (bins << 1); + numOfBins++; + + bins = (bins << count) | symbol; + numOfBins += count; + + EncodeBypassBins( + &(cabacEncodeCtxPtr->bacEncContext), + bins, + numOfBins); + + return return_error; } /********************************************************************* @@ -726,98 +726,98 @@ EB_ERRORTYPE ExponentialGolombCode( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodeMvd( - CabacEncodeContext_t *cabacEncodeCtxPtr, - PredictionUnit_t *puPtr, - EB_REFLIST refList) + CabacEncodeContext_t *cabacEncodeCtxPtr, + PredictionUnit_t *puPtr, + EB_REFLIST refList) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - const EB_S32 mvdX = refList == REF_LIST_0 ? puPtr->mvd[REF_LIST_0].mvdX : puPtr->mvd[REF_LIST_1].mvdX; - const EB_S32 mvdY = refList == REF_LIST_0 ? puPtr->mvd[REF_LIST_0].mvdY : puPtr->mvd[REF_LIST_1].mvdY; - - EB_U32 xSign = (0 > mvdX); - EB_U32 ySign = (0 > mvdY); - - EB_U32 absMvdX = ABS(mvdX); - EB_U32 absMvdY = ABS(mvdY); - - EB_U32 mvdXneq0 = (mvdX != 0); - EB_U32 mvdYneq0 = (mvdY != 0); - - EB_U32 absmvdXgt1 = (absMvdX > 1); - EB_U32 absmvdYgt1 = (absMvdY > 1); - - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - mvdXneq0, - &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[0])); - - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - mvdYneq0, - &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[0])); - - if (mvdXneq0){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - absmvdXgt1, - &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[1])); - } - - if (mvdYneq0) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - absmvdYgt1, - &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[1])); - } - - switch (mvdXneq0) { - case 1: - switch (absmvdXgt1) { - case 1: - ExponentialGolombCode( - cabacEncodeCtxPtr, - (EB_S32)absMvdX - 2, - 1); - case 0: - // Sign of mvdX - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - xSign); + EB_ERRORTYPE return_error = EB_ErrorNone; + + const EB_S32 mvdX = refList == REF_LIST_0 ? puPtr->mvd[REF_LIST_0].mvdX : puPtr->mvd[REF_LIST_1].mvdX; + const EB_S32 mvdY = refList == REF_LIST_0 ? puPtr->mvd[REF_LIST_0].mvdY : puPtr->mvd[REF_LIST_1].mvdY; + + EB_U32 xSign = (0 > mvdX); + EB_U32 ySign = (0 > mvdY); + + EB_U32 absMvdX = ABS(mvdX); + EB_U32 absMvdY = ABS(mvdY); + + EB_U32 mvdXneq0 = (mvdX != 0); + EB_U32 mvdYneq0 = (mvdY != 0); + + EB_U32 absmvdXgt1 = (absMvdX > 1); + EB_U32 absmvdYgt1 = (absMvdY > 1); + + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + mvdXneq0, + &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[0])); + + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + mvdYneq0, + &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[0])); + + if (mvdXneq0){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + absmvdXgt1, + &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[1])); + } + + if (mvdYneq0) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + absmvdYgt1, + &(cabacEncodeCtxPtr->contextModelEncContext.mvdContextModel[1])); + } + + switch (mvdXneq0) { + case 1: + switch (absmvdXgt1) { + case 1: + ExponentialGolombCode( + cabacEncodeCtxPtr, + (EB_S32)absMvdX - 2, + 1); + case 0: + // Sign of mvdX + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + xSign); + break; + default: + break; + } + + case 0: + break; + default: + break; + } + + switch (mvdYneq0) { + case 1: + switch (absmvdYgt1){ + case 1: + ExponentialGolombCode( + cabacEncodeCtxPtr, + (EB_S32)absMvdY - 2, + 1); + case 0: + // Sign of mvdY + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + ySign); + default: break; - default: - break; - } + } - case 0: + case 0: + default: break; - default: - break; - } - - switch (mvdYneq0) { - case 1: - switch (absmvdYgt1){ - case 1: - ExponentialGolombCode( - cabacEncodeCtxPtr, - (EB_S32)absMvdY - 2, - 1); - case 0: - // Sign of mvdY - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - ySign); - default: - break; - } - - case 0: - default: - break; - } - - return return_error; + } + + return return_error; } /********************************************************************* @@ -831,28 +831,28 @@ EB_ERRORTYPE EncodeMvd( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodePredictionDirection( - CabacEncodeContext_t *cabacEncodeCtxPtr, - PredictionUnit_t *puPtr, - CodingUnit_t *cuPtr) + CabacEncodeContext_t *cabacEncodeCtxPtr, + PredictionUnit_t *puPtr, + CodingUnit_t *cuPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 predictionDirection = puPtr->interPredDirectionIndex; - { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - predictionDirection == BI_PRED ? 1 : 0, - &(cabacEncodeCtxPtr->contextModelEncContext.interDirContextModel[GetCodedUnitStats(cuPtr->leafIndex)->depth])); - } - - if (predictionDirection != BI_PRED){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - predictionDirection, - &(cabacEncodeCtxPtr->contextModelEncContext.interDirContextModel[4])); - } - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 predictionDirection = puPtr->interPredDirectionIndex; + { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + predictionDirection == BI_PRED ? 1 : 0, + &(cabacEncodeCtxPtr->contextModelEncContext.interDirContextModel[GetCodedUnitStats(cuPtr->leafIndex)->depth])); + } + + if (predictionDirection != BI_PRED){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + predictionDirection, + &(cabacEncodeCtxPtr->contextModelEncContext.interDirContextModel[4])); + } + + return return_error; } /********************************************************************* @@ -869,26 +869,26 @@ EB_ERRORTYPE EncodePredictionDirection( * input pointer to the prediction unit *********************************************************************/ EB_ERRORTYPE EncodeReferencePictureIndex( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_REFLIST refList, - PictureControlSet_t *pictureControlSetPtr) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_REFLIST refList, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_S32 refListsCount = (refList == REF_LIST_0) ? - pictureControlSetPtr->ParentPcsPtr->refList0Count : - pictureControlSetPtr->ParentPcsPtr->refList1Count; + EB_S32 refListsCount = (refList == REF_LIST_0) ? + pictureControlSetPtr->ParentPcsPtr->refList0Count : + pictureControlSetPtr->ParentPcsPtr->refList1Count; - if (refListsCount > 1) { + if (refListsCount > 1) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0, - &(cabacEncodeCtxPtr->contextModelEncContext.refPicContextModel[0])); + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0, + &(cabacEncodeCtxPtr->contextModelEncContext.refPicContextModel[0])); - } + } - return return_error; + return return_error; } /********************************************************************* * EncodeSaoMerge @@ -904,17 +904,17 @@ EB_ERRORTYPE EncodeReferencePictureIndex( * Y, Cb, or Cr *********************************************************************/ EB_ERRORTYPE EncodeSaoMerge( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 mergeFlag) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 mergeFlag) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - mergeFlag ? 1 : 0, - &(cabacEncodeCtxPtr->contextModelEncContext.saoMergeFlagContextModel[0])); + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + mergeFlag ? 1 : 0, + &(cabacEncodeCtxPtr->contextModelEncContext.saoMergeFlagContextModel[0])); - return return_error; + return return_error; } /********************************************************************* @@ -929,29 +929,29 @@ EB_ERRORTYPE EncodeSaoMerge( * *********************************************************************/ EB_ERRORTYPE EncodeSaoType( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 saoType) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 saoType) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - if (saoType == 0) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0, - &(cabacEncodeCtxPtr->contextModelEncContext.saoTypeIndexContextModel[0])); - } - else { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.saoTypeIndexContextModel[0])); - - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (saoType <= 4) ? 1 : 0); - } - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + if (saoType == 0) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0, + &(cabacEncodeCtxPtr->contextModelEncContext.saoTypeIndexContextModel[0])); + } + else { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.saoTypeIndexContextModel[0])); + + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (saoType <= 4) ? 1 : 0); + } + + return return_error; } /********************************************************************* * EncodeOffsetTrunUnary @@ -967,34 +967,34 @@ EB_ERRORTYPE EncodeSaoType( * input maximum value of the offsets *********************************************************************/ EB_ERRORTYPE EncodeOffsetTrunUnary( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 offset, - EB_U32 maxValue) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 offset, + EB_U32 maxValue) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 index; - EB_BOOL codeLastBin = (maxValue > offset) ? EB_TRUE : EB_FALSE; - - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (offset == 0) ? 0 : 1); - - if (offset != 0) { - - for (index = 0; index < (offset - 1); index++) { - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1); - } - - if (codeLastBin) { - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0); - } - } - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 index; + EB_BOOL codeLastBin = (maxValue > offset) ? EB_TRUE : EB_FALSE; + + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (offset == 0) ? 0 : 1); + + if (offset != 0) { + + for (index = 0; index < (offset - 1); index++) { + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1); + } + + if (codeLastBin) { + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 0); + } + } + + return return_error; } /********************************************************************* @@ -1011,129 +1011,129 @@ EB_ERRORTYPE EncodeOffsetTrunUnary( * input position of the band *********************************************************************/ EB_ERRORTYPE EncodeSaoOffsets( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 componentIdx, - EB_U32 *saoType, - EB_S32 *offset, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 componentIdx, + EB_U32 *saoType, + EB_S32 *offset, EB_U32 bandPosition, - EB_U8 bitdepth) + EB_U8 bitdepth) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 saoTypeIdx, eoType; - - EB_U32 maxSaoOffsetValue = (1 << (MIN(bitdepth, 10) - 5)) - 1; - - // Code SAO type - if (componentIdx != 2) { - - saoTypeIdx = saoType[componentIdx]; - EncodeSaoType( - cabacEncodeCtxPtr, - saoTypeIdx); - } - else { - saoTypeIdx = saoType[1]; - } - - if (saoTypeIdx != 0) { - - // Band Offset - if (saoTypeIdx == 5) { - - // code abs value of offsets - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - ABS(offset[0]), - maxSaoOffsetValue); - - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - ABS(offset[1]), - maxSaoOffsetValue); - - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - ABS(offset[2]), - maxSaoOffsetValue); - - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - ABS(offset[3]), - maxSaoOffsetValue); - - // code the sign of offsets - if (offset[0] != 0) { - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (offset[0] < 0) ? 1 : 0); - } - - if (offset[1] != 0) { - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (offset[1] < 0) ? 1 : 0); - } - - if (offset[2] != 0) { - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (offset[2] < 0) ? 1 : 0); - } - - if (offset[3] != 0) { - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (offset[3] < 0) ? 1 : 0); - } - - // code band position - EncodeBypassBins( - &(cabacEncodeCtxPtr->bacEncContext), - bandPosition, - 5); - } - // Edge Offset - else { - - // code the offset values - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - offset[0], - maxSaoOffsetValue); - - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - offset[1], - maxSaoOffsetValue); - - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - (EB_U32)-offset[2], - maxSaoOffsetValue); - - EncodeOffsetTrunUnary( - cabacEncodeCtxPtr, - (EB_U32)-offset[3], - maxSaoOffsetValue); - - // Derive EO type from sao type - // 0: EO - 0 degrees - // 1: EO - 90 degrees - // 2: EO - 135 degrees - // 3: EO - 45 degrees - if (componentIdx != 2) { - eoType = saoTypeIdx - 1; - EncodeBypassBins( - &(cabacEncodeCtxPtr->bacEncContext), - eoType, - 2); - } - } - - } - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 saoTypeIdx, eoType; + + EB_U32 maxSaoOffsetValue = (1 << (MIN(bitdepth, 10) - 5)) - 1; + + // Code SAO type + if (componentIdx != 2) { + + saoTypeIdx = saoType[componentIdx]; + EncodeSaoType( + cabacEncodeCtxPtr, + saoTypeIdx); + } + else { + saoTypeIdx = saoType[1]; + } + + if (saoTypeIdx != 0) { + + // Band Offset + if (saoTypeIdx == 5) { + + // code abs value of offsets + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + ABS(offset[0]), + maxSaoOffsetValue); + + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + ABS(offset[1]), + maxSaoOffsetValue); + + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + ABS(offset[2]), + maxSaoOffsetValue); + + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + ABS(offset[3]), + maxSaoOffsetValue); + + // code the sign of offsets + if (offset[0] != 0) { + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (offset[0] < 0) ? 1 : 0); + } + + if (offset[1] != 0) { + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (offset[1] < 0) ? 1 : 0); + } + + if (offset[2] != 0) { + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (offset[2] < 0) ? 1 : 0); + } + + if (offset[3] != 0) { + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (offset[3] < 0) ? 1 : 0); + } + + // code band position + EncodeBypassBins( + &(cabacEncodeCtxPtr->bacEncContext), + bandPosition, + 5); + } + // Edge Offset + else { + + // code the offset values + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + offset[0], + maxSaoOffsetValue); + + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + offset[1], + maxSaoOffsetValue); + + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + (EB_U32)-offset[2], + maxSaoOffsetValue); + + EncodeOffsetTrunUnary( + cabacEncodeCtxPtr, + (EB_U32)-offset[3], + maxSaoOffsetValue); + + // Derive EO type from sao type + // 0: EO - 0 degrees + // 1: EO - 90 degrees + // 2: EO - 135 degrees + // 3: EO - 45 degrees + if (componentIdx != 2) { + eoType = saoTypeIdx - 1; + EncodeBypassBins( + &(cabacEncodeCtxPtr->bacEncContext), + eoType, + 2); + } + } + + } + + return return_error; } @@ -1154,102 +1154,102 @@ EB_ERRORTYPE EncodeSaoOffsets( * is the output pointer to the number of significant coefficients *********************************************************************/ EB_ERRORTYPE ComputeNumofSigCoefficients( - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - const EB_U32 size, - EB_U32 *numOfCoeffsPtr) + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + const EB_U32 size, + EB_U32 *numOfCoeffsPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 colIndex, rowIndex; - *numOfCoeffsPtr = 0; - - for (rowIndex = 0; rowIndex < size; rowIndex++) { - for (colIndex = 0; colIndex < size; colIndex++) { - (*numOfCoeffsPtr) += (coeffBufferPtr[colIndex] != 0); - } - coeffBufferPtr += coeffStride; - } - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 colIndex, rowIndex; + *numOfCoeffsPtr = 0; + + for (rowIndex = 0; rowIndex < size; rowIndex++) { + for (colIndex = 0; colIndex < size; colIndex++) { + (*numOfCoeffsPtr) += (coeffBufferPtr[colIndex] != 0); + } + coeffBufferPtr += coeffStride; + } + return return_error; } // Table of subblock scans // Note: for 4x4, only one entry with value 0 is required (hence reusing 8x8 scan) static const EB_U8 *sbScans[] = { - sbScan8, sbScan8, sbScan16, sbScan32 + sbScan8, sbScan8, sbScan16, sbScan32 }; void EncodeQuantizedCoefficients_generic( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, TransformUnit_t *tuPtr) { - EB_S32 blockSizeOffset; - EB_S32 absVal; - EB_U32 symbolValue; - EB_U32 contextOffset; - EB_U32 contextOffset2; - EB_U32 scanIndex; - - EB_S16 linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE]; - EB_S16 *linearCoeffBufferPtr; - - // Significance map for each 4x4 subblock - // 1 bit per coefficient - // i-th bit corresponds to i-th coefficient in forward scan order - EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; - - EB_S32 lastScanSet = -1; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_S32 coeffGroupPositionY; - EB_S32 coeffGroupPositionX; - - EB_S16 *subblockPtr; - - EB_S16 k; - EB_S32 sigmap; - EB_U32 num; - EB_S32 val; - EB_S32 sign; - EB_U32 isNonZero; - - EB_S32 sbDiagIdx; - - EB_S32 isChroma = componentType != COMPONENT_LUMA; - EB_U32 logBlockSize = Log2f(size); - - EB_U32 posLast; - EB_S32 scanPosLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; - - EB_U32 significantFlagContextOffset; - EB_U32 contextOffset1; - EB_U32 sbSigMemory; - EB_S32 sbPrevDiagIdx; - - EB_S32 numNonZero; // Number of nonzero coefficients in current subblock + EB_S32 blockSizeOffset; + EB_S32 absVal; + EB_U32 symbolValue; + EB_U32 contextOffset; + EB_U32 contextOffset2; + EB_U32 scanIndex; + + EB_S16 linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE]; + EB_S16 *linearCoeffBufferPtr; + + // Significance map for each 4x4 subblock + // 1 bit per coefficient + // i-th bit corresponds to i-th coefficient in forward scan order + EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; + + EB_S32 lastScanSet = -1; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_S32 coeffGroupPositionY; + EB_S32 coeffGroupPositionX; + + EB_S16 *subblockPtr; + + EB_S16 k; + EB_S32 sigmap; + EB_U32 num; + EB_S32 val; + EB_S32 sign; + EB_U32 isNonZero; + + EB_S32 sbDiagIdx; + + EB_S32 isChroma = componentType != COMPONENT_LUMA; + EB_U32 logBlockSize = Log2f(size); + + EB_U32 posLast; + EB_S32 scanPosLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; + + EB_U32 significantFlagContextOffset; + EB_U32 contextOffset1; + EB_U32 sbSigMemory; + EB_S32 sbPrevDiagIdx; + + EB_S32 numNonZero; // Number of nonzero coefficients in current subblock EB_S32 absCoeff[16] = {0}; // Array containing list of nonzero coefficients (size given by numNonZero) - EB_U32 signFlags; + EB_U32 signFlags; - EB_U32 tempOffset; - const EB_U8 *contextIndexMapPtr; + EB_U32 tempOffset; + const EB_U8 *contextIndexMapPtr; - EB_U32 golombRiceParam; - EB_S32 index, index2; - EB_U32 contextSet; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + EB_U32 golombRiceParam; + EB_S32 index, index2; + EB_U32 contextSet; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - EB_U32 numNonZeroCoeffs = tuPtr->nzCoefCount[ (componentType == COMPONENT_LUMA) ? 0 : + EB_U32 numNonZeroCoeffs = tuPtr->nzCoefCount[ (componentType == COMPONENT_LUMA) ? 0 : (componentType == COMPONENT_CHROMA_CB) ? 1 : 2 ]; numNonZeroCoeffs = (componentType == COMPONENT_CHROMA_CB2) ? tuPtr->nzCoefCount2[0] : @@ -1311,592 +1311,592 @@ void EncodeQuantizedCoefficients_generic( } - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { - blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, - &(cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset])); - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, - &(cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset])); + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, + &(cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset])); + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, + &(cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset])); - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; - // Add bits for coeff_abs_level_greater1_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1])); + // Add bits for coeff_abs_level_greater1_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1])); - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); - } + // Add bits for coeff_abs_level_greater2_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); + } - EncodeBypassOneBin(&(cabacEncodeCtxPtr->bacEncContext), coeffBufferPtr[0] < 0); + EncodeBypassOneBin(&(cabacEncodeCtxPtr->bacEncContext), coeffBufferPtr[0] < 0); - if (absVal > 2) - { - // Golomb Rice parameter is known to be 0 here - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); - } + if (absVal > 2) + { + // Golomb Rice parameter is known to be 0 here + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); + } - return; - } + return; + } - // Compute the scanning type - // optimized this if statement later - scanIndex = SCAN_DIAG2; + // Compute the scanning type + // optimized this if statement later + scanIndex = SCAN_DIAG2; - if (type == INTRA_MODE) - { - // The test on partition size should be commented out to get conformance for Intra 4x4 ! - // if (partitionSize == SIZE_2Nx2N) To do - update asm - { - // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as - // the mode of upper-left corner of current CU - //intraLumaMode = candidatePtr->intraLumaMode[0]; - //intraChromaMode = candidatePtr->intraChromaMode[0]; + if (type == INTRA_MODE) + { + // The test on partition size should be commented out to get conformance for Intra 4x4 ! + // if (partitionSize == SIZE_2Nx2N) To do - update asm + { + // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as + // the mode of upper-left corner of current CU + //intraLumaMode = candidatePtr->intraLumaMode[0]; + //intraChromaMode = candidatePtr->intraChromaMode[0]; - if ((((EB_S32)logBlockSize) <= 3 - isChroma) || + if ((((EB_S32)logBlockSize) <= 3 - isChroma) || (((EB_S32)logBlockSize) == 3 && cabacEncodeCtxPtr->colorFormat == EB_YUV444)) { - EB_U32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; - EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; + EB_U32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; + EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; if (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && isChroma && tempIntraChromaMode == EB_INTRA_CHROMA_DM) { intraMode = intra422PredModeMap[intraLumaMode]; } - if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { - scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; - } - } - } - } - - //------------------------------------------------------------------------------------------------------------------- - // Coefficients ordered according to scan order (absolute values) - linearCoeffBufferPtr = linearCoeff; - - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - subSetIndex = 0; - while (1) - { - // determine position of subblock within transform block - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(coeffGroupPositionX, coeffGroupPositionY); - } - - subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - - sigmap = 0; - num = 0; - - for (k = 0; k < 16; k++) - { - EB_U32 position = scans4[scanIndex != SCAN_DIAG2][k]; - EB_U32 positionY = position >> 2; - EB_U32 positionX = position & 3; - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(positionX, positionY); - } - - val = subblockPtr[coeffStride * positionY + positionX]; - linearCoeff[16 * subSetIndex + k] = (EB_S16)val; - isNonZero = val != 0; - num += isNonZero; - sigmap |= isNonZero << k; - } - - subblockSigmap[subSetIndex] = (EB_U16)sigmap; - - if (sigmap != 0) - { - lastScanSet = subSetIndex; - - numNonZeroCoeffs -= num; - if (numNonZeroCoeffs == 0) - { - break; - } - } - - subSetIndex++; - - } - - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost - - // subblock position - coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - lastSigYPos = 4 * coeffGroupPositionY; - lastSigXPos = 4 * coeffGroupPositionX; - scanPosLast = 16 * lastScanSet; - - // position within subblock - posLast = Log2f(subblockSigmap[lastScanSet]); - coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; - lastSigYPos += coeffGroupPosition >> 2; - lastSigXPos += coeffGroupPosition & 3; - scanPosLast += posLast; - - // Should swap row/col for SCAN_HOR and SCAN_VER: - // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) - // - SCAN_VER because of equation (7-66) in H.265 (04/2013) - // Note that the scans4 array is adjusted to reflect this - if (scanIndex != SCAN_DIAG2) - { - SWAP(lastSigXPos, lastSigYPos); - } - - // Encode the position of last significant coefficient - EncodeLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels - - significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - - contextOffset1 = 1; - - // Memory for 4x4 subblock-level significance flag - // Bits 0-7 are for current diagonal - // Bits 16-23 are for previous diagonal - sbSigMemory = 0; - - // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) - sbPrevDiagIdx = -1; - - // Loop over subblocks - subSetIndex = lastScanSet; - do - { - // 1. Subblock-level significance flag - - // Assign default value that works for first and last subblock - EB_S32 significantFlagContextPattern = sbSigMemory & 3; - - if (subSetIndex != 0) - { - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; - if (sbDiagIdx != sbPrevDiagIdx) - { - sbSigMemory = sbSigMemory << 16; - sbPrevDiagIdx = sbDiagIdx; - } - - if (subSetIndex != lastScanSet) - { - EB_U32 sigCoeffGroupContextIndex; - EB_U32 significanceFlag; - - significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; - sigCoeffGroupContextIndex = significantFlagContextPattern != 0; - sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - - significanceFlag = (subblockSigmap[subSetIndex] != 0); - - // Add bits for coded_sub_block_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), significanceFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex])); - - if (!significanceFlag) - { - // Nothing else to do for this subblock since all coefficients in it are zero - continue; - } - } - - // Memorize that current subblock is nonzero - sbSigMemory += 1 << coeffGroupPositionY; - } - - // 2. Coefficient significance flags - - numNonZero = 0; // Number of nonzero coefficients in current subblock - signFlags = 0; - - // Use do {} while(0) loop to avoid goto statement (early exit) - do - { - EB_S32 scanPosSig; - EB_S32 sigMap = subblockSigmap[subSetIndex]; - EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; - EB_S32 subPosition2 = subPosition; - - if (subSetIndex == lastScanSet) - { - int val = linearCoeffBufferPtr[scanPosLast]; - int sign = val >> 31; - signFlags = -sign; - absCoeff[0] = (val ^ sign) - sign; - - numNonZero = 1; - if (sigMap == 1) - { - // Nothing else to do here (only "DC" coeff within subblock) - break; - } - scanPosSig = scanPosLast - 1; - sigMap <<= 31 - (scanPosSig & 15); - } - else - { - if (sigMap == 1 && subSetIndex != 0) - { - subPosition2++; - val = linearCoeffBufferPtr[subPosition]; - sign = val >> 31; - signFlags = -sign; - absCoeff[0] = (val ^ sign) - sign; - numNonZero = 1; - } - scanPosSig = subPosition + 15; - sigMap <<= 16; - } + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { + scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; + } + } + } + } + + //------------------------------------------------------------------------------------------------------------------- + // Coefficients ordered according to scan order (absolute values) + linearCoeffBufferPtr = linearCoeff; + + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + subSetIndex = 0; + while (1) + { + // determine position of subblock within transform block + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(coeffGroupPositionX, coeffGroupPositionY); + } + + subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; + + sigmap = 0; + num = 0; + + for (k = 0; k < 16; k++) + { + EB_U32 position = scans4[scanIndex != SCAN_DIAG2][k]; + EB_U32 positionY = position >> 2; + EB_U32 positionX = position & 3; + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(positionX, positionY); + } + + val = subblockPtr[coeffStride * positionY + positionX]; + linearCoeff[16 * subSetIndex + k] = (EB_S16)val; + isNonZero = val != 0; + num += isNonZero; + sigmap |= isNonZero << k; + } + + subblockSigmap[subSetIndex] = (EB_U16)sigmap; + + if (sigmap != 0) + { + lastScanSet = subSetIndex; + + numNonZeroCoeffs -= num; + if (numNonZeroCoeffs == 0) + { + break; + } + } + + subSetIndex++; + + } + + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost + + // subblock position + coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + lastSigYPos = 4 * coeffGroupPositionY; + lastSigXPos = 4 * coeffGroupPositionX; + scanPosLast = 16 * lastScanSet; + + // position within subblock + posLast = Log2f(subblockSigmap[lastScanSet]); + coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; + lastSigYPos += coeffGroupPosition >> 2; + lastSigXPos += coeffGroupPosition & 3; + scanPosLast += posLast; + + // Should swap row/col for SCAN_HOR and SCAN_VER: + // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) + // - SCAN_VER because of equation (7-66) in H.265 (04/2013) + // Note that the scans4 array is adjusted to reflect this + if (scanIndex != SCAN_DIAG2) + { + SWAP(lastSigXPos, lastSigYPos); + } + + // Encode the position of last significant coefficient + EncodeLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); + + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels + + significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; + + contextOffset1 = 1; + + // Memory for 4x4 subblock-level significance flag + // Bits 0-7 are for current diagonal + // Bits 16-23 are for previous diagonal + sbSigMemory = 0; + + // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) + sbPrevDiagIdx = -1; + + // Loop over subblocks + subSetIndex = lastScanSet; + do + { + // 1. Subblock-level significance flag + + // Assign default value that works for first and last subblock + EB_S32 significantFlagContextPattern = sbSigMemory & 3; + + if (subSetIndex != 0) + { + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + + sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; + if (sbDiagIdx != sbPrevDiagIdx) + { + sbSigMemory = sbSigMemory << 16; + sbPrevDiagIdx = sbDiagIdx; + } + + if (subSetIndex != lastScanSet) + { + EB_U32 sigCoeffGroupContextIndex; + EB_U32 significanceFlag; + + significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; + sigCoeffGroupContextIndex = significantFlagContextPattern != 0; + sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; + + significanceFlag = (subblockSigmap[subSetIndex] != 0); + + // Add bits for coded_sub_block_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), significanceFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex])); + + if (!significanceFlag) + { + // Nothing else to do for this subblock since all coefficients in it are zero + continue; + } + } + + // Memorize that current subblock is nonzero + sbSigMemory += 1 << coeffGroupPositionY; + } + + // 2. Coefficient significance flags + + numNonZero = 0; // Number of nonzero coefficients in current subblock + signFlags = 0; + + // Use do {} while(0) loop to avoid goto statement (early exit) + do + { + EB_S32 scanPosSig; + EB_S32 sigMap = subblockSigmap[subSetIndex]; + EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; + EB_S32 subPosition2 = subPosition; + + if (subSetIndex == lastScanSet) + { + int val = linearCoeffBufferPtr[scanPosLast]; + int sign = val >> 31; + signFlags = -sign; + absCoeff[0] = (val ^ sign) - sign; + + numNonZero = 1; + if (sigMap == 1) + { + // Nothing else to do here (only "DC" coeff within subblock) + break; + } + scanPosSig = scanPosLast - 1; + sigMap <<= 31 - (scanPosSig & 15); + } + else + { + if (sigMap == 1 && subSetIndex != 0) + { + subPosition2++; + val = linearCoeffBufferPtr[subPosition]; + sign = val >> 31; + signFlags = -sign; + absCoeff[0] = (val ^ sign) - sign; + numNonZero = 1; + } + scanPosSig = subPosition + 15; + sigMap <<= 16; + } // Jing: change here for 444 - if (logBlockSize == 2) - { - tempOffset = 0; - contextIndexMapPtr = contextIndexMap4[scanIndex]; - } - else - { - tempOffset = (logBlockSize == 3) ? ((scanIndex == SCAN_DIAG2 || isChroma) ? 9 : 15) : (!isChroma ? 21 : 12); - tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; - contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; - } + if (logBlockSize == 2) + { + tempOffset = 0; + contextIndexMapPtr = contextIndexMap4[scanIndex]; + } + else + { + tempOffset = (logBlockSize == 3) ? ((scanIndex == SCAN_DIAG2 || isChroma) ? 9 : 15) : (!isChroma ? 21 : 12); + tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; + contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; + } ///////////// - // Loop over coefficients - do - { - EB_U32 sigContextIndex; - EB_S32 sigCoeffFlag = sigMap < 0; - - sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - - // Add bits for sig_coeff_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), sigCoeffFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex])); - - if (sigCoeffFlag) - { - int val = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; - int sign = val >> 31; - signFlags += signFlags - sign; - absCoeff[numNonZero] = (val ^ sign) - sign; - numNonZero++; - } - - sigMap <<= 1; - scanPosSig--; - } while (scanPosSig >= subPosition2); - } while (0); - - // 3. Coefficient level values - golombRiceParam = 0; - - contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; - contextSet += (contextOffset1 == 0); - contextOffset1 = 1; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - index2 = numCoeffWithCodedGt1Flag; - - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for coeff_abs_level_greater1_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1])); - - if (symbolValue) - { - index2 = index; - contextOffset1 = 0; // Need to set because used in next subblock - index++; - break; - } - - if (contextOffset1 < 3) - { - contextOffset1++; - } - } - - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for >1 flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset])); - } - - index = index2; - if (index < numCoeffWithCodedGt1Flag) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 2; - - // Add bits for coeff_abs_level_greater2_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); - } - - { - EncodeBypassBins(&(cabacEncodeCtxPtr->bacEncContext), signFlags, numNonZero); - } - - if (index < numCoeffWithCodedGt1Flag) - { - EB_S32 absVal = absCoeff[index]; - - if (absVal >= 3) - { - // Golomb Rice parameter is known to be 0 here - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); - golombRiceParam = (absVal > 3); - } - index++; - - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - if (absVal >= 2) - { - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 2, golombRiceParam); - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } - } - - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < numNonZero; index++) - { - EB_S32 absVal = absCoeff[index]; - - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 1, golombRiceParam); - - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } while (--subSetIndex >= 0); - - return; + // Loop over coefficients + do + { + EB_U32 sigContextIndex; + EB_S32 sigCoeffFlag = sigMap < 0; + + sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; + + // Add bits for sig_coeff_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), sigCoeffFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex])); + + if (sigCoeffFlag) + { + int val = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; + int sign = val >> 31; + signFlags += signFlags - sign; + absCoeff[numNonZero] = (val ^ sign) - sign; + numNonZero++; + } + + sigMap <<= 1; + scanPosSig--; + } while (scanPosSig >= subPosition2); + } while (0); + + // 3. Coefficient level values + golombRiceParam = 0; + + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; + contextSet += (contextOffset1 == 0); + contextOffset1 = 1; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; + + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); + + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 + index2 = numCoeffWithCodedGt1Flag; + + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; + + // Add bits for coeff_abs_level_greater1_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1])); + + if (symbolValue) + { + index2 = index; + contextOffset1 = 0; // Need to set because used in next subblock + index++; + break; + } + + if (contextOffset1 < 3) + { + contextOffset1++; + } + } + + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; + + // Add bits for >1 flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset])); + } + + index = index2; + if (index < numCoeffWithCodedGt1Flag) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 2; + + // Add bits for coeff_abs_level_greater2_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); + } + + { + EncodeBypassBins(&(cabacEncodeCtxPtr->bacEncContext), signFlags, numNonZero); + } + + if (index < numCoeffWithCodedGt1Flag) + { + EB_S32 absVal = absCoeff[index]; + + if (absVal >= 3) + { + // Golomb Rice parameter is known to be 0 here + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); + golombRiceParam = (absVal > 3); + } + index++; + + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + if (absVal >= 2) + { + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 2, golombRiceParam); + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } + } + } + + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < numNonZero; index++) + { + EB_S32 absVal = absCoeff[index]; + + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 1, golombRiceParam); + + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } + } while (--subSetIndex >= 0); + + return; } void EncodeQuantizedCoefficients_SSE2( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, TransformUnit_t *tuPtr) { - EB_S32 absVal; - EB_U32 symbolValue; - EB_U32 contextOffset; - EB_U32 contextOffset2; - EB_U32 scanIndex; + EB_S32 absVal; + EB_U32 symbolValue; + EB_U32 contextOffset; + EB_U32 contextOffset2; + EB_U32 scanIndex; EB_U32 numNonZeroCoeffs = tuPtr->nzCoefCount[(componentType == COMPONENT_LUMA) ? 0 : (componentType == COMPONENT_CHROMA_CB) ? 1 : 2]; numNonZeroCoeffs = (componentType == COMPONENT_CHROMA_CB2) ? tuPtr->nzCoefCount2[0] : (componentType == COMPONENT_CHROMA_CR2) ? tuPtr->nzCoefCount2[1] : numNonZeroCoeffs; - __m128i linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_S16))]; - EB_S16 *linearCoeffBufferPtr; + __m128i linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_S16))]; + EB_S16 *linearCoeffBufferPtr; - // Significance map for each 4x4 subblock - // 1 bit per coefficient - // i-th bit corresponds to i-th coefficient in forward scan order - EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; + // Significance map for each 4x4 subblock + // 1 bit per coefficient + // i-th bit corresponds to i-th coefficient in forward scan order + EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; - EB_S32 lastScanSet = -1; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_S32 coeffGroupPositionY; - EB_S32 coeffGroupPositionX; + EB_S32 lastScanSet = -1; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_S32 coeffGroupPositionY; + EB_S32 coeffGroupPositionX; - EB_S16 *subblockPtr; + EB_S16 *subblockPtr; - EB_S32 sigmap; - EB_S32 val; - EB_S32 sign; + EB_S32 sigmap; + EB_S32 val; + EB_S32 sign; - EB_S32 sbDiagIdx; + EB_S32 sbDiagIdx; - EB_S32 isChroma = componentType != COMPONENT_LUMA; - EB_U32 logBlockSize = Log2f(size); + EB_S32 isChroma = componentType != COMPONENT_LUMA; + EB_U32 logBlockSize = Log2f(size); - EB_U32 posLast; - EB_S32 scanPosLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; + EB_U32 posLast; + EB_S32 scanPosLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; - EB_U32 significantFlagContextOffset; - EB_U32 contextOffset1; - EB_U32 sbSigMemory; - EB_S32 sbPrevDiagIdx; + EB_U32 significantFlagContextOffset; + EB_U32 contextOffset1; + EB_U32 sbSigMemory; + EB_S32 sbPrevDiagIdx; - EB_S32 numNonZero; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) - EB_U32 signFlags; + EB_S32 numNonZero; // Number of nonzero coefficients in current subblock + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) + EB_U32 signFlags; - EB_U32 tempOffset; - const EB_U8 *contextIndexMapPtr; + EB_U32 tempOffset; + const EB_U8 *contextIndexMapPtr; - EB_U32 sigCoeffGroupContextIndex; - EB_U32 significanceFlag; + EB_U32 sigCoeffGroupContextIndex; + EB_U32 significanceFlag; - EB_U32 golombRiceParam; - EB_S32 index, index2; - EB_U32 contextSet; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + EB_U32 golombRiceParam; + EB_S32 index, index2; + EB_U32 contextSet; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded EB_U32 transCoeffShapeChroma = (componentType == COMPONENT_CHROMA_CB2 || componentType == COMPONENT_CHROMA_CR2) ? tuPtr->transCoeffShapeChroma2 : tuPtr->transCoeffShapeChroma; - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 blockSizeOffset; - blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 blockSizeOffset; + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, - &(cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset])); - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, - &(cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset])); + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, + &(cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset])); + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), 0, + &(cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset])); - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; - // Add bits for coeff_abs_level_greater1_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1])); + // Add bits for coeff_abs_level_greater1_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1])); - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); - } + // Add bits for coeff_abs_level_greater2_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); + } - EncodeBypassOneBin(&(cabacEncodeCtxPtr->bacEncContext), coeffBufferPtr[0] < 0); + EncodeBypassOneBin(&(cabacEncodeCtxPtr->bacEncContext), coeffBufferPtr[0] < 0); - if (absVal > 2) - { - // Golomb Rice parameter is known to be 0 here - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); - } + if (absVal > 2) + { + // Golomb Rice parameter is known to be 0 here + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); + } - return; - } + return; + } - // Compute the scanning type - // optimized this if statement later - scanIndex = SCAN_DIAG2; + // Compute the scanning type + // optimized this if statement later + scanIndex = SCAN_DIAG2; - if (type == INTRA_MODE) - { - // The test on partition size should be commented out to get conformance for Intra 4x4 ! - //if (partitionSize == SIZE_2Nx2N) - { - // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as - // the mode of upper-left corner of current CU - //intraLumaMode = candidatePtr->intraLumaMode[0]; - //intraChromaMode = candidatePtr->intraChromaMode[0]; + if (type == INTRA_MODE) + { + // The test on partition size should be commented out to get conformance for Intra 4x4 ! + //if (partitionSize == SIZE_2Nx2N) + { + // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as + // the mode of upper-left corner of current CU + //intraLumaMode = candidatePtr->intraLumaMode[0]; + //intraChromaMode = candidatePtr->intraChromaMode[0]; if ((((EB_S32)logBlockSize) <= 3 - isChroma) || (((EB_S32)logBlockSize) == 3 && cabacEncodeCtxPtr->colorFormat == EB_YUV444)) { - EB_U32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; - EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; + EB_U32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; + EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? intraLumaMode : tempIntraChromaMode; if (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && isChroma && tempIntraChromaMode == EB_INTRA_CHROMA_DM) { intraMode = intra422PredModeMap[intraLumaMode]; } - if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { - scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; - } - } - } - } - - //------------------------------------------------------------------------------------------------------------------- - // Coefficients ordered according to scan order (signed values) - linearCoeffBufferPtr = (EB_S16 *)linearCoeff; - - lastScanSet = -1; - - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - subSetIndex = 0; - while (1) - { - __m128i a0, a1, a2, a3; - __m128i b0, b1, c0, c1, d0, d1; - __m128i z0; - - // determine position of subblock within transform block - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(coeffGroupPositionX, coeffGroupPositionY); - } - - subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) { + scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; + } + } + } + } + + //------------------------------------------------------------------------------------------------------------------- + // Coefficients ordered according to scan order (signed values) + linearCoeffBufferPtr = (EB_S16 *)linearCoeff; + + lastScanSet = -1; + + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + subSetIndex = 0; + while (1) + { + __m128i a0, a1, a2, a3; + __m128i b0, b1, c0, c1, d0, d1; + __m128i z0; + + // determine position of subblock within transform block + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(coeffGroupPositionX, coeffGroupPositionY); + } + + subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; EB_BOOL isCGin; @@ -1909,498 +1909,498 @@ void EncodeQuantizedCoefficients_SSE2( if(isCGin == EB_FALSE){ a0 = _mm_setzero_si128(); - a1 = _mm_setzero_si128(); - a2 = _mm_setzero_si128(); - a3 = _mm_setzero_si128(); + a1 = _mm_setzero_si128(); + a2 = _mm_setzero_si128(); + a3 = _mm_setzero_si128(); } else{ a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- - a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- - a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- - a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - } - - if (scanIndex == SCAN_DIAG2) - { - int v03; - int v30; - - b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 - b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - - c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 - c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - - v03 = _mm_extract_epi16(a0, 3); - v30 = _mm_extract_epi16(a3, 0); - - d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 - d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - - d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 - d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 - } - else if (scanIndex == SCAN_HOR2) - { - d0 = _mm_unpacklo_epi64(a0, a1); // 00 01 02 03 10 11 12 13 - d1 = _mm_unpacklo_epi64(a2, a3); // 20 21 22 23 30 31 32 33 - } - else - { - b0 = _mm_unpacklo_epi16(a0, a2); // 00 20 01 21 02 22 03 23 - b1 = _mm_unpacklo_epi16(a1, a3); // 10 30 11 31 12 32 13 33 - - d0 = _mm_unpacklo_epi16(b0, b1); // 00 10 20 30 01 11 21 31 - d1 = _mm_unpackhi_epi16(b0, b1); // 02 12 22 32 03 13 23 33 - } - - z0 = _mm_packs_epi16(d0, d1); - z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - - sigmap = _mm_movemask_epi8(z0) ^ 0xffff; - subblockSigmap[subSetIndex] = (EB_U16)sigmap; - - if (sigmap != 0) - { - EB_U32 num; - lastScanSet = subSetIndex; - linearCoeff[2 * subSetIndex + 0] = d0; - linearCoeff[2 * subSetIndex + 1] = d1; - - // Count number of bits set in sigmap (Hamming weight) - num = sigmap; - num = (num)-((num >> 1) & 0x5555); - num = (num & 0x3333) + ((num >> 2) & 0x3333); - num = (num + (num >> 4)) & 0x0f0f; - num = (num + (num >> 8)) & 0x1f; - - numNonZeroCoeffs -= num; - if (numNonZeroCoeffs == 0) - { - break; - } - } - - subSetIndex++; - - } - - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost - - // subblock position - coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - lastSigYPos = 4 * coeffGroupPositionY; - lastSigXPos = 4 * coeffGroupPositionX; - scanPosLast = 16 * lastScanSet; - - // position within subblock - posLast = Log2f(subblockSigmap[lastScanSet]); - coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; - lastSigYPos += coeffGroupPosition >> 2; - lastSigXPos += coeffGroupPosition & 3; - scanPosLast += posLast; - - // Should swap row/col for SCAN_HOR and SCAN_VER: - // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) - // - SCAN_VER because of equation (7-66) in H.265 (04/2013) - // Note that the scans4 array is adjusted to reflect this - if (scanIndex != SCAN_DIAG2) - { - SWAP(lastSigXPos, lastSigYPos); - } - - // Encode the position of last significant coefficient - EncodeLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels - - significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - - contextOffset1 = 1; - - // Memory for 4x4 subblock-level significance flag - // Bits 0-7 are for current diagonal - // Bits 16-23 are for previous diagonal - sbSigMemory = 0; - - // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) - sbPrevDiagIdx = -1; - - // Loop over subblocks - subSetIndex = lastScanSet; - do - { - // 1. Subblock-level significance flag - - // Assign default value that works for first and last subblock - EB_S32 significantFlagContextPattern = sbSigMemory & 3; - - if (subSetIndex != 0) - { - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; - if (sbDiagIdx != sbPrevDiagIdx) - { - sbSigMemory = sbSigMemory << 16; - sbPrevDiagIdx = sbDiagIdx; - } - - if (subSetIndex != lastScanSet) - { - significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; - sigCoeffGroupContextIndex = significantFlagContextPattern != 0; - sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - - significanceFlag = (subblockSigmap[subSetIndex] != 0); - - // Add bits for coded_sub_block_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), significanceFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex])); - - if (!significanceFlag) - { - // Nothing else to do for this subblock since all coefficients in it are zero - continue; - } - } - - // Memorize that current subblock is nonzero - sbSigMemory += 1 << coeffGroupPositionY; - } - - // 2. Coefficient significance flags - numNonZero = 0; // Number of nonzero coefficients in current subblock - signFlags = 0; - - // Use do {} while(0) loop to avoid goto statement (early exit) - do - { - EB_S32 scanPosSig; - EB_S32 sigMap = subblockSigmap[subSetIndex]; - EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; - EB_S32 subPosition2 = subPosition; - - if (subSetIndex == lastScanSet) - { - int val = linearCoeffBufferPtr[scanPosLast]; - int sign = val >> 31; - signFlags = -sign; - absCoeff[0] = (val ^ sign) - sign; - - numNonZero = 1; - if (sigMap == 1) - { - // Nothing else to do here (only "DC" coeff within subblock) - break; - } - scanPosSig = scanPosLast - 1; - sigMap <<= 31 - (scanPosSig & 15); - } - else - { - if (sigMap == 1 && subSetIndex != 0) - { - subPosition2++; - val = linearCoeffBufferPtr[subPosition]; - sign = val >> 31; - signFlags = -sign; - absCoeff[0] = (val ^ sign) - sign; - numNonZero = 1; - } - scanPosSig = subPosition + 15; - sigMap <<= 16; - } - - if (logBlockSize == 2) - { - tempOffset = 0; - contextIndexMapPtr = contextIndexMap4[scanIndex]; - } - else - { - tempOffset = (logBlockSize == 3) ? ((scanIndex == SCAN_DIAG2 || isChroma) ? 9 : 15) : (!isChroma ? 21 : 12); - tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; - contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; - } - - // Loop over coefficients - do - { - EB_U32 sigContextIndex; - EB_S32 sigCoeffFlag = sigMap < 0; - - sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - - // Add bits for sig_coeff_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), sigCoeffFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex])); - - if (sigCoeffFlag) - { - int val = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; - int sign = val >> 31; - signFlags += signFlags - sign; - absCoeff[numNonZero] = (val ^ sign) - sign; - numNonZero++; - } - - sigMap <<= 1; - scanPosSig--; - } while (scanPosSig >= subPosition2); - } while (0); - - // 3. Coefficient level values - - golombRiceParam = 0; - - contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; - contextSet += (contextOffset1 == 0); - contextOffset1 = 1; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - index2 = numCoeffWithCodedGt1Flag; - - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for coeff_abs_level_greater1_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1])); - - if (symbolValue) - { - index2 = index; - contextOffset1 = 0; // Need to set because used in next subblock - index++; - break; - } - - if (contextOffset1 < 3) - { - contextOffset1++; - } - } - - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for >1 flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset])); - } - - index = index2; - if (index < numCoeffWithCodedGt1Flag) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 2; - - // Add bits for coeff_abs_level_greater2_flag - EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, - &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); - } - - { - EncodeBypassBins(&(cabacEncodeCtxPtr->bacEncContext), signFlags, numNonZero); - } - - if (index < numCoeffWithCodedGt1Flag) - { - EB_S32 absVal = absCoeff[index]; - - if (absVal >= 3) - { - // Golomb Rice parameter is known to be 0 here - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); - golombRiceParam = (absVal > 3); - } - index++; - - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - if (absVal >= 2) - { - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 2, golombRiceParam); - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } - } - - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < numNonZero; index++) - { - EB_S32 absVal = absCoeff[index]; - - RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 1, golombRiceParam); - - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } while (--subSetIndex >= 0); - - return; -} + a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- + a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- + a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- + } + if (scanIndex == SCAN_DIAG2) + { + int v03; + int v30; -EB_ERRORTYPE EncodeLastSignificantXYTemp( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 lastSigXPos, - EB_U32 lastSigYPos, - const EB_U32 width, - const EB_U32 height, - const EB_U32 widthLog2, - const EB_U32 heightLog2, - const EB_U32 componentType, // 0 = Luma, 1 = Chroma - const EB_U32 scanIndex, - EB_U64 *coeffBits) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 + b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - EB_U32 xGroupIndex, yGroupIndex; - EB_S32 xBlockSizeOffset, yBlockSizeOffset; - EB_S32 xShift, yShift; - EB_U32 contextIndex; - EB_S32 index, groupCount; - EB_U32 contextOffset = componentType*NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS; + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 + c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - xBlockSizeOffset = componentType ? 0 : ((widthLog2 - 2) * 3 + ((widthLog2 - 1) >> 2)); - yBlockSizeOffset = componentType ? 0 : ((heightLog2 - 2) * 3 + ((heightLog2 - 1) >> 2)); - xShift = componentType ? (widthLog2 - 2) : ((widthLog2 + 1) >> 2); - yShift = componentType ? (heightLog2 - 2) : ((heightLog2 + 1) >> 2); + v03 = _mm_extract_epi16(a0, 3); + v30 = _mm_extract_epi16(a3, 0); - if (scanIndex == SCAN_VER2) { - SWAP(lastSigXPos, lastSigYPos); - } - xGroupIndex = lastSigXYGroupIndex[lastSigXPos]; - yGroupIndex = lastSigXYGroupIndex[lastSigYPos]; + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 + d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - // X position - for (contextIndex = 0; contextIndex < xGroupIndex; contextIndex++) { + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 + d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 + } + else if (scanIndex == SCAN_HOR2) + { + d0 = _mm_unpacklo_epi64(a0, a1); // 00 01 02 03 10 11 12 13 + d1 = _mm_unpacklo_epi64(a2, a3); // 20 21 22 23 30 31 32 33 + } + else + { + b0 = _mm_unpacklo_epi16(a0, a2); // 00 20 01 21 02 22 03 23 + b1 = _mm_unpacklo_epi16(a1, a3); // 10 30 11 31 12 32 13 33 - *coeffBits += CabacEstimatedBits[1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[contextOffset + xBlockSizeOffset + (contextIndex >> xShift)]]; - } + d0 = _mm_unpacklo_epi16(b0, b1); // 00 10 20 30 01 11 21 31 + d1 = _mm_unpackhi_epi16(b0, b1); // 02 12 22 32 03 13 23 33 + } - if (xGroupIndex < lastSigXYGroupIndex[width - 1]) { + z0 = _mm_packs_epi16(d0, d1); + z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - *coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[contextOffset + xBlockSizeOffset + (contextIndex >> xShift)]]; - } + sigmap = _mm_movemask_epi8(z0) ^ 0xffff; + subblockSigmap[subSetIndex] = (EB_U16)sigmap; - // Y position - for (contextIndex = 0; contextIndex < yGroupIndex; contextIndex++) { + if (sigmap != 0) + { + EB_U32 num; + lastScanSet = subSetIndex; + linearCoeff[2 * subSetIndex + 0] = d0; + linearCoeff[2 * subSetIndex + 1] = d1; + + // Count number of bits set in sigmap (Hamming weight) + num = sigmap; + num = (num)-((num >> 1) & 0x5555); + num = (num & 0x3333) + ((num >> 2) & 0x3333); + num = (num + (num >> 4)) & 0x0f0f; + num = (num + (num >> 8)) & 0x1f; + + numNonZeroCoeffs -= num; + if (numNonZeroCoeffs == 0) + { + break; + } + } - *coeffBits += CabacEstimatedBits[1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[contextOffset + yBlockSizeOffset + (contextIndex >> yShift)]]; - } + subSetIndex++; - if (yGroupIndex < lastSigXYGroupIndex[height - 1]) { + } - *coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[contextOffset + yBlockSizeOffset + (contextIndex >> yShift)]]; - } + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost + + // subblock position + coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + lastSigYPos = 4 * coeffGroupPositionY; + lastSigXPos = 4 * coeffGroupPositionX; + scanPosLast = 16 * lastScanSet; + + // position within subblock + posLast = Log2f(subblockSigmap[lastScanSet]); + coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; + lastSigYPos += coeffGroupPosition >> 2; + lastSigXPos += coeffGroupPosition & 3; + scanPosLast += posLast; + + // Should swap row/col for SCAN_HOR and SCAN_VER: + // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) + // - SCAN_VER because of equation (7-66) in H.265 (04/2013) + // Note that the scans4 array is adjusted to reflect this + if (scanIndex != SCAN_DIAG2) + { + SWAP(lastSigXPos, lastSigYPos); + } - if (xGroupIndex > 3) { - groupCount = (xGroupIndex - 2) >> 1; - lastSigXPos = lastSigXPos - minInSigXYGroup[xGroupIndex]; + // Encode the position of last significant coefficient + EncodeLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - for (index = groupCount - 1; index >= 0; index--){ + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels - *coeffBits += 32768; - } - } + significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - if (yGroupIndex > 3) { - groupCount = (yGroupIndex - 2) >> 1; - lastSigYPos = lastSigYPos - minInSigXYGroup[yGroupIndex]; + contextOffset1 = 1; - for (index = groupCount - 1; index >= 0; index--){ + // Memory for 4x4 subblock-level significance flag + // Bits 0-7 are for current diagonal + // Bits 16-23 are for previous diagonal + sbSigMemory = 0; - *coeffBits += 32768; - } - } + // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) + sbPrevDiagIdx = -1; - return return_error; -} + // Loop over subblocks + subSetIndex = lastScanSet; + do + { + // 1. Subblock-level significance flag -EB_ERRORTYPE RemainingCoeffExponentialGolombCodeTemp( - EB_U32 symbolValue, - EB_U32 *golombParamPtr, - EB_U64 *coeffBits) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + // Assign default value that works for first and last subblock + EB_S32 significantFlagContextPattern = sbSigMemory & 3; - EB_S32 codeWord = (EB_S32)symbolValue; - EB_U32 numberOfBins; + if (subSetIndex != 0) + { + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; - //if (codeWord < (8 << (*golombParamPtr) )) - if (codeWord < (COEF_REMAIN_BIN_REDUCTION << (*golombParamPtr))) - { - numberOfBins = codeWord >> (*golombParamPtr); - *coeffBits += 32768 * (numberOfBins + 1); + sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; + if (sbDiagIdx != sbPrevDiagIdx) + { + sbSigMemory = sbSigMemory << 16; + sbPrevDiagIdx = sbDiagIdx; + } - *coeffBits += 32768 * (*golombParamPtr); + if (subSetIndex != lastScanSet) + { + significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; + sigCoeffGroupContextIndex = significantFlagContextPattern != 0; + sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - } - else - { - numberOfBins = (*golombParamPtr); - //codeWord = codeWord - ( 8 << ((*golombParamPtr))); - codeWord = codeWord - (COEF_REMAIN_BIN_REDUCTION << ((*golombParamPtr))); - while (codeWord >= (1 << numberOfBins)) - { - codeWord -= (1 << (numberOfBins++)); - } + significanceFlag = (subblockSigmap[subSetIndex] != 0); - //*coeffBits += 32768*(8+numberOfBins+1-*golombParamPtr); - *coeffBits += 32768 * (COEF_REMAIN_BIN_REDUCTION + numberOfBins + 1 - *golombParamPtr); + // Add bits for coded_sub_block_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), significanceFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex])); - *coeffBits += 32768 * numberOfBins; + if (!significanceFlag) + { + // Nothing else to do for this subblock since all coefficients in it are zero + continue; + } + } - } + // Memorize that current subblock is nonzero + sbSigMemory += 1 << coeffGroupPositionY; + } - return return_error; -} + // 2. Coefficient significance flags + numNonZero = 0; // Number of nonzero coefficients in current subblock + signFlags = 0; -EB_U32 EstimateLastSignificantXY_UPDATE( - CoeffCtxtMdl_t *updatedCoeffCtxModel, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 lastSigXPos, - EB_U32 lastSigYPos, - const EB_U32 size, - const EB_U32 logBlockSize, - const EB_U32 isChroma) -{ - EB_U32 coeffBits = 0; - EB_U32 xGroupIndex, yGroupIndex; - EB_S32 blockSizeOffset; - EB_S32 shift; - EB_U32 contextIndex; - EB_S32 groupCount; + // Use do {} while(0) loop to avoid goto statement (early exit) + do + { + EB_S32 scanPosSig; + EB_S32 sigMap = subblockSigmap[subSetIndex]; + EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; + EB_S32 subPosition2 = subPosition; - EB_U32 * ctxModelPtr; + if (subSetIndex == lastScanSet) + { + int val = linearCoeffBufferPtr[scanPosLast]; + int sign = val >> 31; + signFlags = -sign; + absCoeff[0] = (val ^ sign) - sign; - (void)cabacEncodeCtxPtr; + numNonZero = 1; + if (sigMap == 1) + { + // Nothing else to do here (only "DC" coeff within subblock) + break; + } + scanPosSig = scanPosLast - 1; + sigMap <<= 31 - (scanPosSig & 15); + } + else + { + if (sigMap == 1 && subSetIndex != 0) + { + subPosition2++; + val = linearCoeffBufferPtr[subPosition]; + sign = val >> 31; + signFlags = -sign; + absCoeff[0] = (val ^ sign) - sign; + numNonZero = 1; + } + scanPosSig = subPosition + 15; + sigMap <<= 16; + } + + if (logBlockSize == 2) + { + tempOffset = 0; + contextIndexMapPtr = contextIndexMap4[scanIndex]; + } + else + { + tempOffset = (logBlockSize == 3) ? ((scanIndex == SCAN_DIAG2 || isChroma) ? 9 : 15) : (!isChroma ? 21 : 12); + tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; + contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; + } + + // Loop over coefficients + do + { + EB_U32 sigContextIndex; + EB_S32 sigCoeffFlag = sigMap < 0; + + sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; + + // Add bits for sig_coeff_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), sigCoeffFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex])); + + if (sigCoeffFlag) + { + int val = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; + int sign = val >> 31; + signFlags += signFlags - sign; + absCoeff[numNonZero] = (val ^ sign) - sign; + numNonZero++; + } + + sigMap <<= 1; + scanPosSig--; + } while (scanPosSig >= subPosition2); + } while (0); + + // 3. Coefficient level values + + golombRiceParam = 0; + + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; + contextSet += (contextOffset1 == 0); + contextOffset1 = 1; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; + + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); + + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 + index2 = numCoeffWithCodedGt1Flag; + + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; + + // Add bits for coeff_abs_level_greater1_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1])); + + if (symbolValue) + { + index2 = index; + contextOffset1 = 0; // Need to set because used in next subblock + index++; + break; + } + + if (contextOffset1 < 3) + { + contextOffset1++; + } + } + + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; + + // Add bits for >1 flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset])); + } + + index = index2; + if (index < numCoeffWithCodedGt1Flag) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 2; + + // Add bits for coeff_abs_level_greater2_flag + EncodeOneBin(&(cabacEncodeCtxPtr->bacEncContext), symbolValue, + &(cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2])); + } + + { + EncodeBypassBins(&(cabacEncodeCtxPtr->bacEncContext), signFlags, numNonZero); + } + + if (index < numCoeffWithCodedGt1Flag) + { + EB_S32 absVal = absCoeff[index]; + + if (absVal >= 3) + { + // Golomb Rice parameter is known to be 0 here + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 3, 0); + golombRiceParam = (absVal > 3); + } + index++; + + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + if (absVal >= 2) + { + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 2, golombRiceParam); + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } + } + } + + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < numNonZero; index++) + { + EB_S32 absVal = absCoeff[index]; + + RemainingCoeffExponentialGolombCode(cabacEncodeCtxPtr, absVal - 1, golombRiceParam); + + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } + } while (--subSetIndex >= 0); + + return; +} + + +EB_ERRORTYPE EncodeLastSignificantXYTemp( + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 lastSigXPos, + EB_U32 lastSigYPos, + const EB_U32 width, + const EB_U32 height, + const EB_U32 widthLog2, + const EB_U32 heightLog2, + const EB_U32 componentType, // 0 = Luma, 1 = Chroma + const EB_U32 scanIndex, + EB_U64 *coeffBits) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 xGroupIndex, yGroupIndex; + EB_S32 xBlockSizeOffset, yBlockSizeOffset; + EB_S32 xShift, yShift; + EB_U32 contextIndex; + EB_S32 index, groupCount; + EB_U32 contextOffset = componentType*NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS; + + xBlockSizeOffset = componentType ? 0 : ((widthLog2 - 2) * 3 + ((widthLog2 - 1) >> 2)); + yBlockSizeOffset = componentType ? 0 : ((heightLog2 - 2) * 3 + ((heightLog2 - 1) >> 2)); + xShift = componentType ? (widthLog2 - 2) : ((widthLog2 + 1) >> 2); + yShift = componentType ? (heightLog2 - 2) : ((heightLog2 + 1) >> 2); + + if (scanIndex == SCAN_VER2) { + SWAP(lastSigXPos, lastSigYPos); + } + xGroupIndex = lastSigXYGroupIndex[lastSigXPos]; + yGroupIndex = lastSigXYGroupIndex[lastSigYPos]; + + // X position + for (contextIndex = 0; contextIndex < xGroupIndex; contextIndex++) { + + *coeffBits += CabacEstimatedBits[1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[contextOffset + xBlockSizeOffset + (contextIndex >> xShift)]]; + } + + if (xGroupIndex < lastSigXYGroupIndex[width - 1]) { + + *coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[contextOffset + xBlockSizeOffset + (contextIndex >> xShift)]]; + } + + // Y position + for (contextIndex = 0; contextIndex < yGroupIndex; contextIndex++) { + + *coeffBits += CabacEstimatedBits[1 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[contextOffset + yBlockSizeOffset + (contextIndex >> yShift)]]; + } + + if (yGroupIndex < lastSigXYGroupIndex[height - 1]) { + + *coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[contextOffset + yBlockSizeOffset + (contextIndex >> yShift)]]; + } + + if (xGroupIndex > 3) { + groupCount = (xGroupIndex - 2) >> 1; + lastSigXPos = lastSigXPos - minInSigXYGroup[xGroupIndex]; + + for (index = groupCount - 1; index >= 0; index--){ + + *coeffBits += 32768; + } + } + + if (yGroupIndex > 3) { + groupCount = (yGroupIndex - 2) >> 1; + lastSigYPos = lastSigYPos - minInSigXYGroup[yGroupIndex]; + + for (index = groupCount - 1; index >= 0; index--){ + + *coeffBits += 32768; + } + } + + return return_error; +} + +EB_ERRORTYPE RemainingCoeffExponentialGolombCodeTemp( + EB_U32 symbolValue, + EB_U32 *golombParamPtr, + EB_U64 *coeffBits) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_S32 codeWord = (EB_S32)symbolValue; + EB_U32 numberOfBins; + + //if (codeWord < (8 << (*golombParamPtr) )) + if (codeWord < (COEF_REMAIN_BIN_REDUCTION << (*golombParamPtr))) + { + numberOfBins = codeWord >> (*golombParamPtr); + *coeffBits += 32768 * (numberOfBins + 1); + + *coeffBits += 32768 * (*golombParamPtr); + + } + else + { + numberOfBins = (*golombParamPtr); + //codeWord = codeWord - ( 8 << ((*golombParamPtr))); + codeWord = codeWord - (COEF_REMAIN_BIN_REDUCTION << ((*golombParamPtr))); + while (codeWord >= (1 << numberOfBins)) + { + codeWord -= (1 << (numberOfBins++)); + } + + //*coeffBits += 32768*(8+numberOfBins+1-*golombParamPtr); + *coeffBits += 32768 * (COEF_REMAIN_BIN_REDUCTION + numberOfBins + 1 - *golombParamPtr); + + *coeffBits += 32768 * numberOfBins; + + } + + return return_error; +} + +EB_U32 EstimateLastSignificantXY_UPDATE( + CoeffCtxtMdl_t *updatedCoeffCtxModel, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 lastSigXPos, + EB_U32 lastSigYPos, + const EB_U32 size, + const EB_U32 logBlockSize, + const EB_U32 isChroma) +{ + EB_U32 coeffBits = 0; + EB_U32 xGroupIndex, yGroupIndex; + EB_S32 blockSizeOffset; + EB_S32 shift; + EB_U32 contextIndex; + EB_S32 groupCount; + + EB_U32 * ctxModelPtr; + + (void)cabacEncodeCtxPtr; blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); shift = isChroma ? (logBlockSize - 2) : ((logBlockSize + 1) >> 2); @@ -2501,6236 +2501,6471 @@ EB_U32 EstimateLastSignificantXY_UPDATE( **********************************************************************/ EB_ERRORTYPE EstimateQuantizedCoefficients_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 isChroma = componentType != COMPONENT_LUMA; - EB_U32 logBlockSize = Log2f(size); - EB_U32 coeffBits = 0; + EB_U32 isChroma = componentType != COMPONENT_LUMA; + EB_U32 logBlockSize = Log2f(size); + EB_U32 coeffBits = 0; - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 blockSizeOffset; - blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 blockSizeOffset; + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); - coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset]]; - coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset]]; + coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset]]; + coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset]]; - { - EB_S32 absVal = ABS(coeffBufferPtr[0]); - EB_U32 symbolValue = absVal > 1; - EB_U32 contextOffset; - EB_U32 contextOffset2; + { + EB_S32 absVal = ABS(coeffBufferPtr[0]); + EB_U32 symbolValue = absVal > 1; + EB_U32 contextOffset; + EB_U32 contextOffset2; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; - // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1]]; + // Add bits for coeff_abs_level_greater1_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1]]; - if (symbolValue) - { - symbolValue = absVal > 2; + if (symbolValue) + { + symbolValue = absVal > 2; - // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; + // Add bits for coeff_abs_level_greater2_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); - } - } - } + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); + } + } + } - coeffBits += ONE_BIT; // Sign bit - // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits; + coeffBits += ONE_BIT; // Sign bit + // Add local bit counter to global bit counter + *coeffBitsLong += coeffBits; - return return_error; - } + return return_error; + } - // Compute the scanning type - // optimized this if statement later + // Compute the scanning type + // optimized this if statement later { - EB_U32 scanIndex = SCAN_DIAG2; - - if (type == INTRA_MODE) - { - // The test on partition size should be commented out to get conformance for Intra 4x4 ! - //if (partitionSize == SIZE_2Nx2N) - { - // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as - // the mode of upper-left corner of current CU - //intraLumaMode = candidatePtr->intraLumaMode[0]; - //intraChromaMode = candidatePtr->intraChromaMode[0]; - - if (logBlockSize <= 3 - isChroma) - { - EB_U32 tempIntraChromaMode = chromaMappingTable[(EB_U32)intraChromaMode]; - EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? (EB_S32)intraLumaMode : (EB_S32)tempIntraChromaMode; - - if (ABS(8 - ((intraMode - 2) & 15)) <= 4) - { - scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; - } - } - } - } - - //------------------------------------------------------------------------------------------------------------------- - // Coefficients ordered according to scan order (absolute values) - { + EB_U32 scanIndex = SCAN_DIAG2; + + if (type == INTRA_MODE) + { + // The test on partition size should be commented out to get conformance for Intra 4x4 ! + //if (partitionSize == SIZE_2Nx2N) + { + // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as + // the mode of upper-left corner of current CU + //intraLumaMode = candidatePtr->intraLumaMode[0]; + //intraChromaMode = candidatePtr->intraChromaMode[0]; + + if (logBlockSize <= 3 - isChroma) + { + EB_U32 tempIntraChromaMode = chromaMappingTable[(EB_U32)intraChromaMode]; + EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? (EB_S32)intraLumaMode : (EB_S32)tempIntraChromaMode; + + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) + { + scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; + } + } + } + } + + //------------------------------------------------------------------------------------------------------------------- + // Coefficients ordered according to scan order (absolute values) + { __m128i linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE / (sizeof(__m128i) / sizeof(EB_U16))] = {{0}}; - EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; - - // Significance map for each 4x4 subblock - // 1 bit per coefficient - // i-th bit corresponds to i-th coefficient in forward scan order - EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; - - EB_S32 lastScanSet = -1; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_S32 coeffGroupPositionY; - EB_S32 coeffGroupPositionX; - - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - subSetIndex = 0; - while (1) - { - // determine position of subblock within transform block - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(coeffGroupPositionX, coeffGroupPositionY); - } - - { - EB_S16 *subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - __m128i a0, a1, a2, a3; - __m128i b0, b1, c0, c1, d0, d1; - - a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- - a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- - a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- - a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - - if (scanIndex == SCAN_DIAG2) - { - b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 - b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - - c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 - c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - - { - int v03 = _mm_extract_epi16(a0, 3); - int v30 = _mm_extract_epi16(a3, 0); - - d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 - d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - - d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 - d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 - } - } - else if (scanIndex == SCAN_HOR2) - { - d0 = _mm_unpacklo_epi64(a0, a1); // 00 01 02 03 10 11 12 13 - d1 = _mm_unpacklo_epi64(a2, a3); // 20 21 22 23 30 31 32 33 - } - else - { - b0 = _mm_unpacklo_epi16(a0, a2); // 00 20 01 21 02 22 03 23 - b1 = _mm_unpacklo_epi16(a1, a3); // 10 30 11 31 12 32 13 33 - - d0 = _mm_unpacklo_epi16(b0, b1); // 00 10 20 30 01 11 21 31 - d1 = _mm_unpackhi_epi16(b0, b1); // 02 12 22 32 03 13 23 33 - } - - { - __m128i z0; - z0 = _mm_packs_epi16(d0, d1); - z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - - { - __m128i s0, s1; - // Absolute value (note: _mm_abs_epi16 requires SSSE3) - s0 = _mm_srai_epi16(d0, 15); - s1 = _mm_srai_epi16(d1, 15); - d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); - d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); - } - - { - EB_S32 sigmap = _mm_movemask_epi8(z0) ^ 0xffff; - subblockSigmap[subSetIndex] = (EB_U16)sigmap; - - if (sigmap != 0) - { - lastScanSet = subSetIndex; - linearCoeff[2 * subSetIndex + 0] = d0; - linearCoeff[2 * subSetIndex + 1] = d1; - - // Count number of bits set in sigmap (Hamming weight) - { - EB_U32 num; - num = sigmap; - num = (num)-((num >> 1) & 0x5555); - num = (num & 0x3333) + ((num >> 2) & 0x3333); - num = (num + (num >> 4)) & 0x0f0f; - num = (num + (num >> 8)) & 0x1f; - - numNonZeroCoeffs -= num; - if (numNonZeroCoeffs == 0) - { - break; - } - } - } - } - } - } - - subSetIndex++; - - } - - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost - { - EB_U32 posLast; - EB_S32 scanPosLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; - - // subblock position - coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - lastSigYPos = 4 * coeffGroupPositionY; - lastSigXPos = 4 * coeffGroupPositionX; - scanPosLast = 16 * lastScanSet; - - // position within subblock - posLast = Log2f(subblockSigmap[lastScanSet]); - coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; - lastSigYPos += coeffGroupPosition >> 2; - lastSigXPos += coeffGroupPosition & 3; - scanPosLast += posLast; - - // Should swap row/col for SCAN_HOR and SCAN_VER: - // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) - // - SCAN_VER because of equation (7-66) in H.265 (04/2013) - // Note that the scans4 array is adjusted to reflect this - if (scanIndex != SCAN_DIAG2) - { - SWAP(lastSigXPos, lastSigYPos); - } - - // Encode the position of last significant coefficient - coeffBits += EstimateLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels - { - EB_U32 significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - - EB_U32 contextOffset1 = 1; - - // Memory for 4x4 subblock-level significance flag - // Bits 0-7 are for current diagonal - // Bits 16-23 are for previous diagonal - EB_U32 sbSigMemory = 0; - - // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) - EB_S32 sbPrevDiagIdx = -1; - - // Loop over subblocks - subSetIndex = lastScanSet; - do - { - // 1. Subblock-level significance flag - - // Assign default value that works for first and last subblock - EB_S32 significantFlagContextPattern = sbSigMemory & 3; - - if (subSetIndex != 0) - { - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - { - EB_S32 sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; - if (sbDiagIdx != sbPrevDiagIdx) - { - sbSigMemory = sbSigMemory << 16; - sbPrevDiagIdx = sbDiagIdx; - } - - if (subSetIndex != lastScanSet) - { - EB_U32 sigCoeffGroupContextIndex; - EB_U32 significanceFlag; - - significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; - sigCoeffGroupContextIndex = significantFlagContextPattern != 0; - sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - - significanceFlag = (subblockSigmap[subSetIndex] != 0); - - // Add bits for coded_sub_block_flag - coeffBits += CabacEstimatedBits[significanceFlag ^ cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex]]; - - if (!significanceFlag) - { - // Nothing else to do for this subblock since all coefficients in it are zero - continue; - } - } - - // Memorize that current subblock is nonzero - sbSigMemory += 1 << coeffGroupPositionY; - } - } - - // 2. Coefficient significance flags - { - EB_S32 numNonZero = 0; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) - - // Use do {} while(0) loop to avoid goto statement (early exit) - do - { - EB_S32 scanPosSig; - EB_S32 sigMap = subblockSigmap[subSetIndex]; - EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; - EB_S32 subPosition2 = subPosition; - - if (subSetIndex == lastScanSet) - { - absCoeff[0] = linearCoeffBufferPtr[scanPosLast]; - numNonZero = 1; - if (sigMap == 1) - { - // Nothing else to do here (only "DC" coeff within subblock) - break; - } - scanPosSig = scanPosLast - 1; - sigMap <<= 31 - (scanPosSig & 15); - } - else - { - if (sigMap == 1 && subSetIndex != 0) - { - subPosition2++; - absCoeff[0] = linearCoeffBufferPtr[subPosition]; - numNonZero = 1; - } - scanPosSig = subPosition + 15; - sigMap <<= 16; - } - - { - EB_U32 tempOffset; - const EB_U8 *contextIndexMapPtr; - - if (logBlockSize == 2) - { - tempOffset = 0; - contextIndexMapPtr = contextIndexMap4[scanIndex]; - } - else - { - tempOffset = (logBlockSize == 3) ? (scanIndex == SCAN_DIAG2 ? 9 : 15) : (!isChroma ? 21 : 12); - tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; - contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; - } - - // Loop over coefficients - do - { - EB_U32 sigContextIndex; - EB_S32 sigCoeffFlag = sigMap < 0; - - sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - - // Add bits for sig_coeff_flag - coeffBits += CabacEstimatedBits[sigCoeffFlag ^ cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex]]; - - if (sigCoeffFlag) - { - absCoeff[numNonZero] = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; - numNonZero++; - } - - sigMap <<= 1; - scanPosSig--; - } while (scanPosSig >= subPosition2); - } - } while (0); - - // 3. Coefficient level values - { - EB_U32 golombRiceParam = 0; - EB_S32 index; - EB_U32 contextSet; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - EB_U32 contextOffset; - EB_U32 contextOffset2; - - contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; - contextSet += (contextOffset1 == 0); - contextOffset1 = 1; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - - { - coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) - } - - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1]]; - - if (symbolValue) - { - symbolValue = absVal > 2; - - // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; - - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); - golombRiceParam = (absVal > 3); - } - - index++; - contextOffset1 = 0; - - // Exit loop early as remaining coefficients are coded differently - break; - } - - if (contextOffset1 < 3) - { - contextOffset1++; - } - } - - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for >1 flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset]]; - - if (symbolValue) - { - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 2, golombRiceParam); - - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } - - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < numNonZero; index++) - { - EB_S32 absVal = absCoeff[index]; - - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 1, golombRiceParam); - - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } - } - } while (--subSetIndex >= 0); - } - } - } - } + EB_U16 *linearCoeffBufferPtr = (EB_U16 *)linearCoeff; + + // Significance map for each 4x4 subblock + // 1 bit per coefficient + // i-th bit corresponds to i-th coefficient in forward scan order + EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; + + EB_S32 lastScanSet = -1; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_S32 coeffGroupPositionY; + EB_S32 coeffGroupPositionX; + + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + subSetIndex = 0; + while (1) + { + // determine position of subblock within transform block + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; - // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits; - (void)CabacCost; - return return_error; -} + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(coeffGroupPositionX, coeffGroupPositionY); + } -EB_ERRORTYPE EstimateQuantizedCoefficients_generic_Update( - CoeffCtxtMdl_t *UpdatedCoeffCtxModel, - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + { + EB_S16 *subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; + __m128i a0, a1, a2, a3; + __m128i b0, b1, c0, c1, d0, d1; - EB_U32 isChroma = componentType != COMPONENT_LUMA; - EB_U32 logBlockSize = Log2f(size); - EB_U32 coeffBits = 0; + a0 = _mm_loadl_epi64((__m128i *)(subblockPtr + 0 * coeffStride)); // 00 01 02 03 -- -- -- -- + a1 = _mm_loadl_epi64((__m128i *)(subblockPtr + 1 * coeffStride)); // 10 11 12 13 -- -- -- -- + a2 = _mm_loadl_epi64((__m128i *)(subblockPtr + 2 * coeffStride)); // 20 21 22 23 -- -- -- -- + a3 = _mm_loadl_epi64((__m128i *)(subblockPtr + 3 * coeffStride)); // 30 31 32 33 -- -- -- -- - EB_S32 absVal; - EB_U32 symbolValue; - EB_U32 contextOffset; - EB_U32 contextOffset2; + if (scanIndex == SCAN_DIAG2) + { + b0 = _mm_unpacklo_epi64(a0, a3); // 00 01 02 03 30 31 32 33 + b1 = _mm_unpacklo_epi16(a1, a2); // 10 20 11 21 12 22 13 23 - EB_U32 scanIndex; + c0 = _mm_unpacklo_epi16(b0, b1); // 00 10 01 20 02 11 03 21 + c1 = _mm_unpackhi_epi16(b1, b0); // 12 30 22 31 13 32 23 33 - EB_U16 linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE]; - EB_U16 *linearCoeffBufferPtr = linearCoeff; + { + int v03 = _mm_extract_epi16(a0, 3); + int v30 = _mm_extract_epi16(a3, 0); - EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; + d0 = _mm_shufflehi_epi16(c0, 0xe1); // 00 10 01 20 11 02 03 21 + d1 = _mm_shufflelo_epi16(c1, 0xb4); // 12 30 31 22 13 32 23 33 - EB_S32 lastScanSet = -1; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_S32 coeffGroupPositionY; - EB_S32 coeffGroupPositionX; + d0 = _mm_insert_epi16(d0, v30, 6); // 00 10 01 20 11 02 30 21 + d1 = _mm_insert_epi16(d1, v03, 1); // 12 03 31 22 13 32 23 33 + } + } + else if (scanIndex == SCAN_HOR2) + { + d0 = _mm_unpacklo_epi64(a0, a1); // 00 01 02 03 10 11 12 13 + d1 = _mm_unpacklo_epi64(a2, a3); // 20 21 22 23 30 31 32 33 + } + else + { + b0 = _mm_unpacklo_epi16(a0, a2); // 00 20 01 21 02 22 03 23 + b1 = _mm_unpacklo_epi16(a1, a3); // 10 30 11 31 12 32 13 33 - EB_S16 *subblockPtr; + d0 = _mm_unpacklo_epi16(b0, b1); // 00 10 20 30 01 11 21 31 + d1 = _mm_unpackhi_epi16(b0, b1); // 02 12 22 32 03 13 23 33 + } - EB_S16 k; - EB_S32 sigmap; - EB_U32 num; + { + __m128i z0; + z0 = _mm_packs_epi16(d0, d1); + z0 = _mm_cmpeq_epi8(z0, _mm_setzero_si128()); - EB_U32 val; - EB_U32 isNonZero; + { + __m128i s0, s1; + // Absolute value (note: _mm_abs_epi16 requires SSSE3) + s0 = _mm_srai_epi16(d0, 15); + s1 = _mm_srai_epi16(d1, 15); + d0 = _mm_sub_epi16(_mm_xor_si128(d0, s0), s0); + d1 = _mm_sub_epi16(_mm_xor_si128(d1, s1), s1); + } - EB_U32 posLast; - EB_S32 scanPosLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; + { + EB_S32 sigmap = _mm_movemask_epi8(z0) ^ 0xffff; + subblockSigmap[subSetIndex] = (EB_U16)sigmap; - EB_U32 significantFlagContextOffset; + if (sigmap != 0) + { + lastScanSet = subSetIndex; + linearCoeff[2 * subSetIndex + 0] = d0; + linearCoeff[2 * subSetIndex + 1] = d1; - EB_U32 contextOffset1; + // Count number of bits set in sigmap (Hamming weight) + { + EB_U32 num; + num = sigmap; + num = (num)-((num >> 1) & 0x5555); + num = (num & 0x3333) + ((num >> 2) & 0x3333); + num = (num + (num >> 4)) & 0x0f0f; + num = (num + (num >> 8)) & 0x1f; + + numNonZeroCoeffs -= num; + if (numNonZeroCoeffs == 0) + { + break; + } + } + } + } + } + } - EB_S32 numNonZero; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) + subSetIndex++; - // Memory for 4x4 subblock-level significance flag - // Bits 0-7 are for current diagonal - // Bits 16-23 are for previous diagonal - EB_U32 sbSigMemory; + } - // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) - EB_S32 sbPrevDiagIdx; - EB_S32 sbDiagIdx; + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost + { + EB_U32 posLast; + EB_S32 scanPosLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; + + // subblock position + coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + lastSigYPos = 4 * coeffGroupPositionY; + lastSigXPos = 4 * coeffGroupPositionX; + scanPosLast = 16 * lastScanSet; + + // position within subblock + posLast = Log2f(subblockSigmap[lastScanSet]); + coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; + lastSigYPos += coeffGroupPosition >> 2; + lastSigXPos += coeffGroupPosition & 3; + scanPosLast += posLast; + + // Should swap row/col for SCAN_HOR and SCAN_VER: + // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) + // - SCAN_VER because of equation (7-66) in H.265 (04/2013) + // Note that the scans4 array is adjusted to reflect this + if (scanIndex != SCAN_DIAG2) + { + SWAP(lastSigXPos, lastSigYPos); + } + + // Encode the position of last significant coefficient + coeffBits += EstimateLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); + + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels + { + EB_U32 significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; + + EB_U32 contextOffset1 = 1; + + // Memory for 4x4 subblock-level significance flag + // Bits 0-7 are for current diagonal + // Bits 16-23 are for previous diagonal + EB_U32 sbSigMemory = 0; + + // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) + EB_S32 sbPrevDiagIdx = -1; + + // Loop over subblocks + subSetIndex = lastScanSet; + do + { + // 1. Subblock-level significance flag + + // Assign default value that works for first and last subblock + EB_S32 significantFlagContextPattern = sbSigMemory & 3; + + if (subSetIndex != 0) + { + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + + { + EB_S32 sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; + if (sbDiagIdx != sbPrevDiagIdx) + { + sbSigMemory = sbSigMemory << 16; + sbPrevDiagIdx = sbDiagIdx; + } + + if (subSetIndex != lastScanSet) + { + EB_U32 sigCoeffGroupContextIndex; + EB_U32 significanceFlag; + + significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; + sigCoeffGroupContextIndex = significantFlagContextPattern != 0; + sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; + + significanceFlag = (subblockSigmap[subSetIndex] != 0); + + // Add bits for coded_sub_block_flag + coeffBits += CabacEstimatedBits[significanceFlag ^ cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex]]; + + if (!significanceFlag) + { + // Nothing else to do for this subblock since all coefficients in it are zero + continue; + } + } + + // Memorize that current subblock is nonzero + sbSigMemory += 1 << coeffGroupPositionY; + } + } + + // 2. Coefficient significance flags + { + EB_S32 numNonZero = 0; // Number of nonzero coefficients in current subblock + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) - EB_U32 tempOffset; - const EB_U8 *contextIndexMapPtr; + // Use do {} while(0) loop to avoid goto statement (early exit) + do + { + EB_S32 scanPosSig; + EB_S32 sigMap = subblockSigmap[subSetIndex]; + EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; + EB_S32 subPosition2 = subPosition; - EB_U32 golombRiceParam; - EB_S32 index; - EB_U32 contextSet; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + if (subSetIndex == lastScanSet) + { + absCoeff[0] = linearCoeffBufferPtr[scanPosLast]; + numNonZero = 1; + if (sigMap == 1) + { + // Nothing else to do here (only "DC" coeff within subblock) + break; + } + scanPosSig = scanPosLast - 1; + sigMap <<= 31 - (scanPosSig & 15); + } + else + { + if (sigMap == 1 && subSetIndex != 0) + { + subPosition2++; + absCoeff[0] = linearCoeffBufferPtr[subPosition]; + numNonZero = 1; + } + scanPosSig = subPosition + 15; + sigMap <<= 16; + } - EB_U32 * ctxModelPtr; + { + EB_U32 tempOffset; + const EB_U8 *contextIndexMapPtr; - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 blockSizeOffset; - blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); + if (logBlockSize == 2) + { + tempOffset = 0; + contextIndexMapPtr = contextIndexMap4[scanIndex]; + } + else + { + tempOffset = (logBlockSize == 3) ? (scanIndex == SCAN_DIAG2 ? 9 : 15) : (!isChroma ? 21 : 12); + tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; + contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; + } + // Loop over coefficients + do + { + EB_U32 sigContextIndex; + EB_S32 sigCoeffFlag = sigMap < 0; - //CHKN coeffBits += CabacEstimatedBits[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[ blockSizeOffset ] ]; + sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - ctxModelPtr = &(UpdatedCoeffCtxModel->lastSigXContextModel[blockSizeOffset]); - coeffBits += CabacEstimatedBits[0 ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(0, ctxModelPtr); + // Add bits for sig_coeff_flag + coeffBits += CabacEstimatedBits[sigCoeffFlag ^ cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex]]; - //CHKN coeffBits += CabacEstimatedBits[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[ blockSizeOffset ] ]; - ctxModelPtr = &(UpdatedCoeffCtxModel->lastSigYContextModel[blockSizeOffset]); - coeffBits += CabacEstimatedBits[0 ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(0, ctxModelPtr); + if (sigCoeffFlag) + { + absCoeff[numNonZero] = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; + numNonZero++; + } + sigMap <<= 1; + scanPosSig--; + } while (scanPosSig >= subPosition2); + } + } while (0); - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; + // 3. Coefficient level values + { + EB_U32 golombRiceParam = 0; + EB_S32 index; + EB_U32 contextSet; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + EB_U32 contextOffset; + EB_U32 contextOffset2; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; - - // Add bits for coeff_abs_level_greater1_flag - //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[ contextOffset+1 ] ]; - ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanOneContextModel[contextOffset + 1]); - coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); - - /********************************************************************************* - - ctxModelPtr = &(UpdatedCoeffCtxModel->xxxxxxxxxxxxx[ xxxxxxxxx ] ); - coeffBits += CabacEstimatedBits[ xxxxxxxxxxx ^ ctxModelPtr[0] ]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(xxxxxxxxxx, ctxModelPtr ); - - *********************************************************************************/ - - if (symbolValue) - { - symbolValue = absVal > 2; - - // Add bits for coeff_abs_level_greater2_flag - //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[ contextOffset2 ] ]; - - ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanTwoContextModel[contextOffset2]); - coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); - - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); - } - } - - coeffBits += ONE_BIT; // Sign bit - // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits; - - return return_error; - } - - // Compute the scanning type - // optimized this if statement later - scanIndex = SCAN_DIAG2; - - if (type == INTRA_MODE) - { - // The test on partition size should be commented out to get conformance for Intra 4x4 ! - //if (partitionSize == SIZE_2Nx2N) - { - // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as - // the mode of upper-left corner of current CU - //intraLumaMode = candidatePtr->intraLumaMode[0]; - //intraChromaMode = candidatePtr->intraChromaMode[0]; - - if (logBlockSize <= 3 - isChroma) - { - EB_S32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; - EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? (EB_S32)intraLumaMode : tempIntraChromaMode; - - if (ABS(8 - ((intraMode - 2) & 15)) <= 4) - { - scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; - } - } - } - } - - //------------------------------------------------------------------------------------------------------------------- - // Coefficients ordered according to scan order (absolute values) - // Significance map for each 4x4 subblock - // 1 bit per coefficient - // i-th bit corresponds to i-th coefficient in forward scan order - - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - subSetIndex = 0; - while (1) - { - // determine position of subblock within transform block - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(coeffGroupPositionX, coeffGroupPositionY); - } - - subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - - sigmap = 0; - num = 0; - - for (k = 0; k < 16; k++) - { - EB_U32 position = scans4[scanIndex != SCAN_DIAG2][k]; - EB_U32 positionY = position >> 2; - EB_U32 positionX = position & 3; - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(positionX, positionY); - } - - val = ABS(subblockPtr[coeffStride * positionY + positionX]); - linearCoeff[16 * subSetIndex + k] = (EB_U16)val; - isNonZero = val != 0; - num += isNonZero; - sigmap |= isNonZero << k; - } - - subblockSigmap[subSetIndex] = (EB_U16)sigmap; - - if (sigmap != 0) - { - lastScanSet = subSetIndex; - - numNonZeroCoeffs -= num; - if (numNonZeroCoeffs == 0) - { - break; - } - } - - subSetIndex++; - - } - - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost - - // subblock position - coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - lastSigYPos = 4 * coeffGroupPositionY; - lastSigXPos = 4 * coeffGroupPositionX; - scanPosLast = 16 * lastScanSet; - - // position within subblock - posLast = Log2f(subblockSigmap[lastScanSet]); - coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; - lastSigYPos += coeffGroupPosition >> 2; - lastSigXPos += coeffGroupPosition & 3; - scanPosLast += posLast; - - // Should swap row/col for SCAN_HOR and SCAN_VER: - // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) - // - SCAN_VER because of equation (7-66) in H.265 (04/2013) - // Note that the scans4 array is adjusted to reflect this - if (scanIndex != SCAN_DIAG2) - { - SWAP(lastSigXPos, lastSigYPos); - } - - // Encode the position of last significant coefficient - //CHKN coeffBits += EstimateLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - coeffBits += EstimateLastSignificantXY_UPDATE(UpdatedCoeffCtxModel, cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels - - significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - - contextOffset1 = 1; - - // Memory for 4x4 subblock-level significance flag - // Bits 0-7 are for current diagonal - // Bits 16-23 are for previous diagonal - sbSigMemory = 0; - - // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) - sbPrevDiagIdx = -1; - - // Loop over subblocks - subSetIndex = lastScanSet; - do - { - // 1. Subblock-level significance flag - - // Assign default value that works for first and last subblock - EB_S32 significantFlagContextPattern = sbSigMemory & 3; - - if (subSetIndex != 0) - { - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; - if (sbDiagIdx != sbPrevDiagIdx) - { - sbSigMemory = sbSigMemory << 16; - sbPrevDiagIdx = sbDiagIdx; - } - - if (subSetIndex != lastScanSet) - { - EB_U32 sigCoeffGroupContextIndex; - EB_U32 significanceFlag; - - significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; - sigCoeffGroupContextIndex = significantFlagContextPattern != 0; - sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - - significanceFlag = (subblockSigmap[subSetIndex] != 0); - - // Add bits for coded_sub_block_flag - //CHKN coeffBits += CabacEstimatedBits[ significanceFlag ^ cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[ sigCoeffGroupContextIndex ] ]; - - ctxModelPtr = &(UpdatedCoeffCtxModel->coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex]); - coeffBits += CabacEstimatedBits[significanceFlag ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(significanceFlag, ctxModelPtr); - - - if (!significanceFlag) - { - // Nothing else to do for this subblock since all coefficients in it are zero - continue; - } - } - - // Memorize that current subblock is nonzero - sbSigMemory += 1 << coeffGroupPositionY; - } - - // 2. Coefficient significance flags - - numNonZero = 0; // Number of nonzero coefficients in current subblock - - // Use do {} while(0) loop to avoid goto statement (early exit) - do - { - EB_S32 scanPosSig; - EB_S32 sigMap = subblockSigmap[subSetIndex]; - EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; - EB_S32 subPosition2 = subPosition; - - if (subSetIndex == lastScanSet) - { - absCoeff[0] = linearCoeffBufferPtr[scanPosLast]; - numNonZero = 1; - if (sigMap == 1) - { - // Nothing else to do here (only "DC" coeff within subblock) - break; - } - scanPosSig = scanPosLast - 1; - sigMap <<= 31 - (scanPosSig & 15); - } - else - { - if (sigMap == 1 && subSetIndex != 0) - { - subPosition2++; - absCoeff[0] = linearCoeffBufferPtr[subPosition]; - numNonZero = 1; - } - scanPosSig = subPosition + 15; - sigMap <<= 16; - } - - if (logBlockSize == 2) - { - tempOffset = 0; - contextIndexMapPtr = contextIndexMap4[scanIndex]; - } - else - { - tempOffset = (logBlockSize == 3) ? (scanIndex == SCAN_DIAG2 ? 9 : 15) : (!isChroma ? 21 : 12); - tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; - contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; - } - - // Loop over coefficients - do - { - EB_U32 sigContextIndex; - EB_S32 sigCoeffFlag = sigMap < 0; - - sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - - // Add bits for sig_coeff_flag - //CHKN coeffBits += CabacEstimatedBits[ sigCoeffFlag ^ cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[ significantFlagContextOffset+sigContextIndex ] ]; - - ctxModelPtr = &(UpdatedCoeffCtxModel->significanceFlagContextModel[significantFlagContextOffset + sigContextIndex]); - coeffBits += CabacEstimatedBits[sigCoeffFlag ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(sigCoeffFlag, ctxModelPtr); - - if (sigCoeffFlag) - { - absCoeff[numNonZero] = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; - numNonZero++; - } - - sigMap <<= 1; - scanPosSig--; - } while (scanPosSig >= subPosition2); - } while (0); - - // 3. Coefficient level values - golombRiceParam = 0; - - contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; - contextSet += (contextOffset1 == 0); - contextOffset1 = 1; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - - { - coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) - } - - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for coeff_abs_level_greater1_flag - //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[ contextOffset+contextOffset1 ] ]; - - - ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanOneContextModel[contextOffset + contextOffset1]); - coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); - - - if (symbolValue) - { - symbolValue = absVal > 2; - - // Add bits for coeff_abs_level_greater2_flag - //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[ contextOffset2 ] ]; - - ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanTwoContextModel[contextOffset2]); - coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); - - - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); - golombRiceParam = (absVal > 3); - } - - index++; - contextOffset1 = 0; - - // Exit loop early as remaining coefficients are coded differently - break; - } - - if (contextOffset1 < 3) - { - contextOffset1++; - } - } - - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; + contextSet += (contextOffset1 == 0); + contextOffset1 = 1; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - // Add bits for >1 flag - //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[ contextOffset ] ]; + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanOneContextModel[contextOffset]); - coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; - ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); + { + coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) + } + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 - if (symbolValue) - { - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 2, golombRiceParam); + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } + // Add bits for coeff_abs_level_greater1_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1]]; - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < numNonZero; index++) - { - EB_S32 absVal = absCoeff[index]; + if (symbolValue) + { + symbolValue = absVal > 2; - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 1, golombRiceParam); + // Add bits for coeff_abs_level_greater2_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } while (--subSetIndex >= 0); + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); + golombRiceParam = (absVal > 3); + } - // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits; - (void)CabacCost; - return return_error; -} + index++; + contextOffset1 = 0; -EB_ERRORTYPE EstimateQuantizedCoefficients_generic( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + // Exit loop early as remaining coefficients are coded differently + break; + } - EB_U32 isChroma = componentType != COMPONENT_LUMA; - EB_U32 logBlockSize = Log2f(size); - EB_U32 coeffBits = 0; + if (contextOffset1 < 3) + { + contextOffset1++; + } + } - EB_S32 absVal; - EB_U32 symbolValue; - EB_U32 contextOffset; - EB_U32 contextOffset2; + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - EB_U32 scanIndex; + // Add bits for >1 flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset]]; - EB_U16 linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE]; - EB_U16 *linearCoeffBufferPtr = linearCoeff; + if (symbolValue) + { + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 2, golombRiceParam); - EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } + } - EB_S32 lastScanSet = -1; - EB_S32 subSetIndex; - EB_U32 coeffGroupPosition; - EB_S32 coeffGroupPositionY; - EB_S32 coeffGroupPositionX; + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < numNonZero; index++) + { + EB_S32 absVal = absCoeff[index]; - EB_S16 *subblockPtr; + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 1, golombRiceParam); - EB_S16 k; - EB_S32 sigmap; - EB_U32 num; + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } + } + } + } while (--subSetIndex >= 0); + } + } + } + } - EB_U32 val; - EB_U32 isNonZero; - - EB_U32 posLast; - EB_S32 scanPosLast; - EB_S32 lastSigXPos; - EB_S32 lastSigYPos; - - EB_U32 significantFlagContextOffset; - - EB_U32 contextOffset1; - - EB_S32 numNonZero; // Number of nonzero coefficients in current subblock - EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) - - // Memory for 4x4 subblock-level significance flag - // Bits 0-7 are for current diagonal - // Bits 16-23 are for previous diagonal - EB_U32 sbSigMemory; - - // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) - EB_S32 sbPrevDiagIdx; - EB_S32 sbDiagIdx; - - EB_U32 tempOffset; - const EB_U8 *contextIndexMapPtr; - - EB_U32 golombRiceParam; - EB_S32 index; - EB_U32 contextSet; - EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - - // DC-only fast track - if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) - { - EB_S32 blockSizeOffset; - blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); - - coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset]]; - coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset]]; - - absVal = ABS(coeffBufferPtr[0]); - symbolValue = absVal > 1; - - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; - - // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1]]; - - if (symbolValue) - { - symbolValue = absVal > 2; - - // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; - - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); - } - } - - coeffBits += ONE_BIT; // Sign bit - // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits; - - return return_error; - } - - // Compute the scanning type - // optimized this if statement later - scanIndex = SCAN_DIAG2; - - if (type == INTRA_MODE) - { - // The test on partition size should be commented out to get conformance for Intra 4x4 ! - //if (partitionSize == SIZE_2Nx2N) - { - // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as - // the mode of upper-left corner of current CU - //intraLumaMode = candidatePtr->intraLumaMode[0]; - //intraChromaMode = candidatePtr->intraChromaMode[0]; - - if (logBlockSize <= 3 - isChroma) - { - EB_S32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; - EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? (EB_S32)intraLumaMode : tempIntraChromaMode; - - if (ABS(8 - ((intraMode - 2) & 15)) <= 4) - { - scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; - } - } - } - } - - //------------------------------------------------------------------------------------------------------------------- - // Coefficients ordered according to scan order (absolute values) - // Significance map for each 4x4 subblock - // 1 bit per coefficient - // i-th bit corresponds to i-th coefficient in forward scan order - - // Loop through subblocks to reorder coefficients according to scan order - // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients - subSetIndex = 0; - while (1) - { - // determine position of subblock within transform block - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(coeffGroupPositionX, coeffGroupPositionY); - } - - subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - - sigmap = 0; - num = 0; - - for (k = 0; k < 16; k++) - { - EB_U32 position = scans4[scanIndex != SCAN_DIAG2][k]; - EB_U32 positionY = position >> 2; - EB_U32 positionX = position & 3; - if (scanIndex == SCAN_HOR2) - { - // Subblock scan is mirrored for horizontal scan - SWAP(positionX, positionY); - } - - val = ABS(subblockPtr[coeffStride * positionY + positionX]); - linearCoeff[16 * subSetIndex + k] = (EB_U16)val; - isNonZero = val != 0; - num += isNonZero; - sigmap |= isNonZero << k; - } - - subblockSigmap[subSetIndex] = (EB_U16)sigmap; - - if (sigmap != 0) - { - lastScanSet = subSetIndex; - - numNonZeroCoeffs -= num; - if (numNonZeroCoeffs == 0) - { - break; - } - } - - subSetIndex++; - - } - - //------------------------------------------------------------------------------------------------------------------- - // Obtain the last significant X and Y positions and compute their bit cost - - // subblock position - coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - lastSigYPos = 4 * coeffGroupPositionY; - lastSigXPos = 4 * coeffGroupPositionX; - scanPosLast = 16 * lastScanSet; - - // position within subblock - posLast = Log2f(subblockSigmap[lastScanSet]); - coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; - lastSigYPos += coeffGroupPosition >> 2; - lastSigXPos += coeffGroupPosition & 3; - scanPosLast += posLast; - - // Should swap row/col for SCAN_HOR and SCAN_VER: - // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) - // - SCAN_VER because of equation (7-66) in H.265 (04/2013) - // Note that the scans4 array is adjusted to reflect this - if (scanIndex != SCAN_DIAG2) - { - SWAP(lastSigXPos, lastSigYPos); - } - - // Encode the position of last significant coefficient - coeffBits += EstimateLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - - //------------------------------------------------------------------------------------------------------------------- - // Encode Coefficient levels - - significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - - contextOffset1 = 1; - - // Memory for 4x4 subblock-level significance flag - // Bits 0-7 are for current diagonal - // Bits 16-23 are for previous diagonal - sbSigMemory = 0; - - // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) - sbPrevDiagIdx = -1; - - // Loop over subblocks - subSetIndex = lastScanSet; - do - { - // 1. Subblock-level significance flag - - // Assign default value that works for first and last subblock - EB_S32 significantFlagContextPattern = sbSigMemory & 3; - - if (subSetIndex != 0) - { - coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; - coeffGroupPositionY = coeffGroupPosition >> 4; - coeffGroupPositionX = coeffGroupPosition & 15; - - sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; - if (sbDiagIdx != sbPrevDiagIdx) - { - sbSigMemory = sbSigMemory << 16; - sbPrevDiagIdx = sbDiagIdx; - } - - if (subSetIndex != lastScanSet) - { - EB_U32 sigCoeffGroupContextIndex; - EB_U32 significanceFlag; - - significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; - sigCoeffGroupContextIndex = significantFlagContextPattern != 0; - sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - - significanceFlag = (subblockSigmap[subSetIndex] != 0); - - // Add bits for coded_sub_block_flag - coeffBits += CabacEstimatedBits[significanceFlag ^ cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex]]; - - if (!significanceFlag) - { - // Nothing else to do for this subblock since all coefficients in it are zero - continue; - } - } - - // Memorize that current subblock is nonzero - sbSigMemory += 1 << coeffGroupPositionY; - } - - // 2. Coefficient significance flags - - numNonZero = 0; // Number of nonzero coefficients in current subblock - - // Use do {} while(0) loop to avoid goto statement (early exit) - do - { - EB_S32 scanPosSig; - EB_S32 sigMap = subblockSigmap[subSetIndex]; - EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; - EB_S32 subPosition2 = subPosition; - - if (subSetIndex == lastScanSet) - { - absCoeff[0] = linearCoeffBufferPtr[scanPosLast]; - numNonZero = 1; - if (sigMap == 1) - { - // Nothing else to do here (only "DC" coeff within subblock) - break; - } - scanPosSig = scanPosLast - 1; - sigMap <<= 31 - (scanPosSig & 15); - } - else - { - if (sigMap == 1 && subSetIndex != 0) - { - subPosition2++; - absCoeff[0] = linearCoeffBufferPtr[subPosition]; - numNonZero = 1; - } - scanPosSig = subPosition + 15; - sigMap <<= 16; - } - - if (logBlockSize == 2) - { - tempOffset = 0; - contextIndexMapPtr = contextIndexMap4[scanIndex]; - } - else - { - tempOffset = (logBlockSize == 3) ? (scanIndex == SCAN_DIAG2 ? 9 : 15) : (!isChroma ? 21 : 12); - tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; - contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; - } - - // Loop over coefficients - do - { - EB_U32 sigContextIndex; - EB_S32 sigCoeffFlag = sigMap < 0; - - sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - - // Add bits for sig_coeff_flag - coeffBits += CabacEstimatedBits[sigCoeffFlag ^ cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex]]; - - if (sigCoeffFlag) - { - absCoeff[numNonZero] = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; - numNonZero++; - } - - sigMap <<= 1; - scanPosSig--; - } while (scanPosSig >= subPosition2); - } while (0); - - // 3. Coefficient level values - golombRiceParam = 0; - - contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; - contextSet += (contextOffset1 == 0); - contextOffset1 = 1; - contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; - contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - - numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - - { - coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) - } - - // Loop over coefficients until base value of Exp-Golomb coding changes - // Base value changes after either - // - 8th coefficient - // - a coefficient larger than 1 - - for (index = 0; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for coeff_abs_level_greater1_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1]]; - - if (symbolValue) - { - symbolValue = absVal > 2; - - // Add bits for coeff_abs_level_greater2_flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; - - if (symbolValue) - { - // Golomb Rice parameter is known to be 0 here - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); - golombRiceParam = (absVal > 3); - } - - index++; - contextOffset1 = 0; - - // Exit loop early as remaining coefficients are coded differently - break; - } - - if (contextOffset1 < 3) - { - contextOffset1++; - } - } - - // Loop over coefficients after first one that was > 1 but before 8th one - // Base value is know to be equal to 2 - for (; index < numCoeffWithCodedGt1Flag; index++) - { - EB_S32 absVal = absCoeff[index]; - EB_U32 symbolValue = absVal > 1; - - // Add bits for >1 flag - coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset]]; - - if (symbolValue) - { - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 2, golombRiceParam); - - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } - - // Loop over remaining coefficients (8th and beyond) - // Base value is known to be equal to 1 - for (; index < numNonZero; index++) - { - EB_S32 absVal = absCoeff[index]; - - coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 1, golombRiceParam); - - // Update Golomb-Rice parameter - if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; - } - } while (--subSetIndex >= 0); - - // Add local bit counter to global bit counter - *coeffBitsLong += coeffBits; - (void)CabacCost; - return return_error; + // Add local bit counter to global bit counter + *coeffBitsLong += coeffBits; + (void)CabacCost; + return return_error; } -/********************************************************************* -* EncodeDeltaQp -* Encodes the change in the QP indicated by delta QP -* -* cabacEncContextPtr -* pointer to the CABAC structure passed as input -* -*********************************************************************/ -// The functionality of coding delta Qp is implemented for HM 7.0 and needs to be updated for HM 8.0 -EB_ERRORTYPE EncodeDeltaQp( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_S32 deltaQp) +EB_ERRORTYPE EstimateQuantizedCoefficients_generic_Update( + CoeffCtxtMdl_t *UpdatedCoeffCtxModel, + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_BOOL lastBin; - EB_U32 absDeltaQp; - EB_U32 tuValue; - EB_U32 tuValueTemp; - EB_U32 signDeltaQp = 0; - - absDeltaQp = ABS(deltaQp); - tuValue = MIN((EB_S32)absDeltaQp, CU_DELTA_QP_CMAX); - tuValueTemp = tuValue; - - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuValueTemp ? 1 : 0, - &(cabacEncodeCtxPtr->contextModelEncContext.deltaQpContextModel[0])); - - - if (tuValueTemp) { - lastBin = - (CU_DELTA_QP_CMAX > tuValueTemp) ? EB_TRUE : EB_FALSE; - - while (--tuValueTemp) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 1, - &(cabacEncodeCtxPtr->contextModelEncContext.deltaQpContextModel[1])); - } - - if (lastBin) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - 0, - &(cabacEncodeCtxPtr->contextModelEncContext.deltaQpContextModel[1])); - } - } - - if (absDeltaQp >= CU_DELTA_QP_CMAX){ - ExponentialGolombCode( - cabacEncodeCtxPtr, - absDeltaQp - CU_DELTA_QP_CMAX, - CU_DELTA_QP_EGK); - } - - if (absDeltaQp > 0){ - signDeltaQp = (deltaQp > 0 ? 0 : 1); - - EncodeBypassOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - signDeltaQp); - } - - return return_error; -} - -/********************************************************************* -* CheckAndCodeDeltaQp -* Check the conditions and codes the change in the QP indicated by delta QP -* -* cabacEncContextPtr -* pointer to the CABAC structure passed as input -* -* cuPtr -* input pointer to the coding unit -* -* tuPtr -* input pointer to the transform unit -*********************************************************************/ -EB_ERRORTYPE CheckAndCodeDeltaQp( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - TransformUnit_t *tuPtr, - EB_BOOL isDeltaQpEnable, - EB_BOOL *isdeltaQpNotCoded) -{ + EB_U32 isChroma = componentType != COMPONENT_LUMA; + EB_U32 logBlockSize = Log2f(size); + EB_U32 coeffBits = 0; - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_S32 absVal; + EB_U32 symbolValue; + EB_U32 contextOffset; + EB_U32 contextOffset2; - if (isDeltaQpEnable) { - if (tuPtr->lumaCbf || tuPtr->cbCbf || tuPtr->crCbf || tuPtr->cbCbf2 || tuPtr->crCbf2){ - if (*isdeltaQpNotCoded){ - EB_S32 deltaQp; - deltaQp = cuPtr->qp - cuPtr->refQp; + EB_U32 scanIndex; - EncodeDeltaQp( - cabacEncodeCtxPtr, - deltaQp); + EB_U16 linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE]; + EB_U16 *linearCoeffBufferPtr = linearCoeff; - *isdeltaQpNotCoded = EB_FALSE; - } - } - } + EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; - return return_error; -} + EB_S32 lastScanSet = -1; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_S32 coeffGroupPositionY; + EB_S32 coeffGroupPositionX; -/************************************ -******* EncodeCoeff -**************************************/ -static EB_ERRORTYPE EncodeCoeff( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - TransformUnit_t *tuPtr, - EB_U32 tuSize, - EB_U32 tuOriginX, - EB_U32 tuOriginY, - EbPictureBufferDesc_t *coeffPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_S16 *subblockPtr; - EB_S16 *coeffBuffer; - EB_U32 coeffLocation; - const EB_U16 subWidthCMinus1 = (cabacEncodeCtxPtr->colorFormat == EB_YUV444 ? 1 : 2) - 1; - const EB_U16 subHeightCMinus1 = (cabacEncodeCtxPtr->colorFormat >= EB_YUV422 ? 1 : 2) - 1; - EB_U32 tuChromaSize = (tuSize == 4) ? 4 : (tuSize >> subWidthCMinus1); - coeffLocation = tuOriginX + (tuOriginY * coeffPtr->strideY); - coeffBuffer = (EB_S16*)&coeffPtr->bufferY[coeffLocation * sizeof(EB_S16)]; - - if (tuPtr->lumaCbf) { - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - tuSize, - (EB_MODETYPE)cuPtr->predictionModeFlag, - (&cuPtr->predictionUnitArray[0])->intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideY, - COMPONENT_LUMA, - tuPtr);//tuPtr->nzCoefCount[0]); - } - - // Chroma case when cusize 8x8 and tudepth == 1 OR 16x16 and tudepth == 2 - //tuOriginX = (cuPtr->size == MIN_CU_SIZE ) || ( (cuPtr->size == 16 ) && ((Log2f(cuPtr->size) - tuSizeLog2) == 2))? tuPtr->tuNode->originX: tuOriginX; - //tuOriginY = (cuPtr->size == MIN_CU_SIZE ) || ( (cuPtr->size == 16 ) && ((Log2f(cuPtr->size) - tuSizeLog2) == 2))? tuPtr->tuNode->originY: tuOriginY; - - // cb - coeffLocation = (tuOriginX >> subWidthCMinus1) + ((tuOriginY * coeffPtr->strideCb) >> subHeightCMinus1); - coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[coeffLocation * sizeof(EB_S16)]; - - if (tuSize > 4){ - if (tuPtr->cbCbf) { - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - tuChromaSize, - (EB_MODETYPE)cuPtr->predictionModeFlag, - (&cuPtr->predictionUnitArray[0])->intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideCb, - COMPONENT_CHROMA_CB, - tuPtr);//tuPtr->nzCoefCount[1]); - } + EB_S16 k; + EB_S32 sigmap; + EB_U32 num; - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && tuPtr->cbCbf2) { - coeffLocation = (tuOriginX >> 1) + ((tuOriginY+tuChromaSize) * coeffPtr->strideCb); - coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[coeffLocation * sizeof(EB_S16)]; - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - tuChromaSize, - (EB_MODETYPE)cuPtr->predictionModeFlag, - (&cuPtr->predictionUnitArray[0])->intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer,// Jing: check here - coeffPtr->strideCb, - COMPONENT_CHROMA_CB2, - tuPtr);//tuPtr->nzCoefCount[1]); - } - } else if (tuPtr->tuIndex - ((tuPtr->tuIndex >> 2) << 2) == 0) { - // Never be here - if (tuPtr->cbCbf) { - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - tuChromaSize, - (EB_MODETYPE)cuPtr->predictionModeFlag, - (&cuPtr->predictionUnitArray[0])->intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideCb, - COMPONENT_CHROMA_CB, - tuPtr);//tuPtr->nzCoefCount[1]); + EB_U32 val; + EB_U32 isNonZero; - } - } + EB_U32 posLast; + EB_S32 scanPosLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; - // cr - coeffLocation = (tuOriginX >> subWidthCMinus1) + ((tuOriginY * coeffPtr->strideCr) >> subHeightCMinus1); - coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[coeffLocation * sizeof(EB_S16)]; + EB_U32 significantFlagContextOffset; - if (tuSize > 4){ - if (tuPtr->crCbf) { - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - tuChromaSize, - (EB_MODETYPE)cuPtr->predictionModeFlag, - (&cuPtr->predictionUnitArray[0])->intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideCr, - COMPONENT_CHROMA_CR, - tuPtr);//tuPtr->nzCoefCount[2]); + EB_U32 contextOffset1; - } - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && tuPtr->crCbf2) { - coeffLocation = (tuOriginX >> 1) + ((tuOriginY+tuChromaSize) * coeffPtr->strideCr); - coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[coeffLocation * sizeof(EB_S16)]; - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - tuChromaSize, - (EB_MODETYPE)cuPtr->predictionModeFlag, - (&cuPtr->predictionUnitArray[0])->intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideCr, - COMPONENT_CHROMA_CR2, - tuPtr);//tuPtr->nzCoefCount[2]); - } - } - else if (tuPtr->tuIndex - ((tuPtr->tuIndex >> 2) << 2) == 0) { + EB_S32 numNonZero; // Number of nonzero coefficients in current subblock + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) - if (tuPtr->crCbf) { - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - tuChromaSize, - (EB_MODETYPE)cuPtr->predictionModeFlag, - (&cuPtr->predictionUnitArray[0])->intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideCr, - COMPONENT_CHROMA_CR, - tuPtr);//tuPtr->nzCoefCount[2]); + // Memory for 4x4 subblock-level significance flag + // Bits 0-7 are for current diagonal + // Bits 16-23 are for previous diagonal + EB_U32 sbSigMemory; - } - } + // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) + EB_S32 sbPrevDiagIdx; + EB_S32 sbDiagIdx; - return return_error; -} + EB_U32 tempOffset; + const EB_U8 *contextIndexMapPtr; -/************************************ -******* EncodeTuCoeff -**************************************/ -static EB_ERRORTYPE EncodeTuCoeff( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_BOOL isDeltaQpEnable, - EB_BOOL *isdeltaQpNotCoded) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 subDivContext; - EB_U32 cbfContext; - TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStatsPtr; - EB_U32 tuSize; - EB_U32 tuOriginX; - EB_U32 tuOriginY; - EB_U32 tuIndex; - EB_U32 tuIndexDepth2; - EB_U32 tuSizeDepth2; - - tuPtr = &cuPtr->transformUnitArray[0]; - tuStatsPtr = GetTransformUnitStats(0); - tuSize = cuStatsPtr->size >> tuStatsPtr->depth; - cbfContext = tuPtr->chromaCbfContext; - subDivContext = 5 - Log2f(tuSize); - - if (GetCodedUnitStats(cuPtr->leafIndex)->size != 64) { - // Encode split flag - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->splitFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.transSubDivFlagContextModel[subDivContext])); - } - - if (tuPtr->splitFlag) { - // Jing: only comes here for inter 64x64 + EB_U32 golombRiceParam; + EB_S32 index; + EB_U32 contextSet; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded - // Cb CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (tuPtr->cbCbf | tuPtr->cbCbf2), - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - - // Cr CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (tuPtr->crCbf | tuPtr->crCbf2), - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - - //for(tuIndex = 1; tuIndex < 5; tuIndex++) { - for (tuIndex = 1; tuIndex < 5; tuIndex ++ ) { - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - tuStatsPtr = GetTransformUnitStats(tuIndex); - tuSize = cuStatsPtr->size >> tuStatsPtr->depth; - - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - - if (GetCodedUnitStats(cuPtr->leafIndex)->size != 8) { - subDivContext = 5 - Log2f(tuSize); - // Encode split flag - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->splitFlag, - &(cabacEncodeCtxPtr->contextModelEncContext.transSubDivFlagContextModel[subDivContext])); - } - - if (tuPtr->splitFlag) { - // Jing: seems never comes here for now - cbfContext = tuPtr->chromaCbfContext; - - if (cuPtr->transformUnitArray[0].cbCbf | cuPtr->transformUnitArray[0].cbCbf2) { - // Cb CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - if (cuPtr->transformUnitArray[0].crCbf | cuPtr->transformUnitArray[0].crCbf2){ - // Cr CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - // Transform depth 2 - //tuIndexDepth2 = tuIndex*4 + 1; - tuIndexDepth2 = tuIndex + 1; - - tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - - tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); - tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->lumaCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - - - //EncodeDeltaQp - CheckAndCodeDeltaQp( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); - - EncodeCoeff( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - tuSizeDepth2, - tuOriginX, - tuOriginY, - coeffPtr); - - tuIndexDepth2++; - - tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - - tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); - tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - cbfContext = tuPtr->lumaCbfContext; - - // Luma CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->lumaCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - - //EncodeDeltaQp - CheckAndCodeDeltaQp( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); - - EncodeCoeff( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - tuSizeDepth2, - tuOriginX, - tuOriginY, - coeffPtr); - - - tuIndexDepth2++; - tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - - tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); - tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->lumaCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - - //EncodeDeltaQp - CheckAndCodeDeltaQp( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); - - EncodeCoeff( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - tuSizeDepth2, - tuOriginX, - tuOriginY, - coeffPtr); - - - tuIndexDepth2++; - - tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - - tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); - tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - - cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->lumaCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - - - //EncodeDeltaQp - CheckAndCodeDeltaQp( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); - - EncodeCoeff( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - tuSizeDepth2, - tuOriginX, - tuOriginY, - coeffPtr); - - } - else { - - cbfContext = tuPtr->chromaCbfContext; - - // Cb CBF - if (cuPtr->transformUnitArray[0].cbCbf | cuPtr->transformUnitArray[0].cbCbf2) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf2, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - } + EB_U32 * ctxModelPtr; - // Cr CBF - if (cuPtr->transformUnitArray[0].crCbf | cuPtr->transformUnitArray[0].crCbf2) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf2, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - } - - cbfContext = tuPtr->lumaCbfContext; - - // Luma CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->lumaCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - - - //EncodeDeltaQp - - CheckAndCodeDeltaQp( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); - - EncodeCoeff( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - tuSize, - tuOriginX, - tuOriginY, - coeffPtr); - - } - } - - } - else { - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - - // Cb CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf2, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 blockSizeOffset; + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); - // Cr CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf2, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - // Luma CBF + //CHKN coeffBits += CabacEstimatedBits[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[ blockSizeOffset ] ]; - // In the Inter case, if the RootCbf is 1 and the Chroma Cbfs are 0, then we can infer that the - // luma Cbf is true, so there is no need to code it. - if ((cuPtr->predictionModeFlag == INTRA_MODE) || tuPtr->cbCbf || tuPtr->crCbf || - (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && (tuPtr->cbCbf2 || tuPtr->crCbf2))) { + ctxModelPtr = &(UpdatedCoeffCtxModel->lastSigXContextModel[blockSizeOffset]); + coeffBits += CabacEstimatedBits[0 ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(0, ctxModelPtr); - //cbfContext = ((cuPtr->size == tuPtr->size) || (tuPtr->size == TRANSFORM_MAX_SIZE)); - cbfContext = tuPtr->lumaCbfContext; - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->lumaCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - } - - //EncodeDeltaQp - CheckAndCodeDeltaQp( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); - - EncodeCoeff( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - tuSize, - tuOriginX, - tuOriginY, - coeffPtr); - - } - - return return_error; -} + //CHKN coeffBits += CabacEstimatedBits[ 0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[ blockSizeOffset ] ]; + ctxModelPtr = &(UpdatedCoeffCtxModel->lastSigYContextModel[blockSizeOffset]); + coeffBits += CabacEstimatedBits[0 ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(0, ctxModelPtr); -/********************************************************************* -* EncodeTuSplitCoeff -* Encodes the TU split flags and coded block flags -* -* cabacEncContextPtr -* pointer to the CABAC structure passed as input -* -* puPtr -* input pointer to the prediction unit -*********************************************************************/ -static EB_ERRORTYPE EncodeTuSplitCoeff( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_U32 *cuQuantizedCoeffsBits, - EB_BOOL isDeltaQpEnable, - EB_BOOL *isdeltaQpNotCoded) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 rootCbf; - - //rate Control - EB_U32 writtenBitsBeforeQuantizedCoeff; - EB_U32 writtenBitsAfterQuantizedCoeff; - - //store the number of written bits before coding quantized coeffs (flush is not called yet): - // The total number of bits is - // number of written bits - // + 32 - bits remaining in interval Low Value - // + number of buffered byte * 8 - writtenBitsBeforeQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + - 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + - (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); - // Root CBF - rootCbf = cuPtr->rootCbf; - if (cuPtr->predictionModeFlag != INTRA_MODE && - !((&cuPtr->predictionUnitArray[0])->mergeFlag)) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - rootCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.rootCbfContextModel[0])); - } - if ((cuPtr->predictionModeFlag == INTRA_MODE) || - ((cuPtr->predictionModeFlag == INTER_MODE) && (rootCbf > 0))) { - EncodeTuCoeff( - cabacEncodeCtxPtr, - cuPtr, - cuStatsPtr, - coeffPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); - } - - //store the number of written bits after coding quantized coeffs (flush is not called yet): - // The total number of bits is - // number of written bits - // + 32 - bits remaining in interval Low Value - // + number of buffered byte * 8 - writtenBitsAfterQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + - 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + - (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); - - *cuQuantizedCoeffsBits = writtenBitsAfterQuantizedCoeff - writtenBitsBeforeQuantizedCoeff; - - - return return_error; -} + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; -/************************************************** -* ConvertToSigned32 -**************************************************/ -inline static EB_U32 ConvertToSigned32( - EB_S32 signedNum) -{ - return (signedNum <= 0) ? -signedNum << 1 : (signedNum << 1) - 1; -} + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; -/************************************************** -* WriteCodeCavlc -**************************************************/ -inline static void WriteCodeCavlc( - OutputBitstreamUnit_t *bitstreamPtr, - EB_U32 bits, - EB_U32 numberOfBits) -{ - OutputBitstreamWrite( - bitstreamPtr, - bits, - numberOfBits); -} + // Add bits for coeff_abs_level_greater1_flag + //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[ contextOffset+1 ] ]; + ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanOneContextModel[contextOffset + 1]); + coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); + /********************************************************************************* -/************************************************** -* WriteUvlc -**************************************************/ -static void WriteUvlc( - OutputBitstreamUnit_t *bitstreamPtr, - EB_U32 bits) -{ - EB_U32 numberOfBits = 1; - EB_U32 tempBits = ++bits; + ctxModelPtr = &(UpdatedCoeffCtxModel->xxxxxxxxxxxxx[ xxxxxxxxx ] ); + coeffBits += CabacEstimatedBits[ xxxxxxxxxxx ^ ctxModelPtr[0] ]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(xxxxxxxxxx, ctxModelPtr ); - while (tempBits > 1) - { - tempBits >>= 1; - numberOfBits += 2; - } + *********************************************************************************/ - if(numberOfBits<32) { - OutputBitstreamWrite( - bitstreamPtr, - bits, - numberOfBits); - } else - { - OutputBitstreamWrite( - bitstreamPtr, - 0, - numberOfBits>>1); - OutputBitstreamWrite( - bitstreamPtr, - bits, - (numberOfBits+1)>>1); - } -} + if (symbolValue) + { + symbolValue = absVal > 2; -/************************************************** -* WriteSvlc -**************************************************/ -inline static void WriteSvlc( - OutputBitstreamUnit_t *bitstreamPtr, - EB_S32 signedBits) -{ - EB_U32 bits; + // Add bits for coeff_abs_level_greater2_flag + //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[ contextOffset2 ] ]; - bits = ConvertToSigned32(signedBits); - WriteUvlc( - bitstreamPtr, - bits); + ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanTwoContextModel[contextOffset2]); + coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); -} + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); + } + } -/************************************************** -* WriteFlagCavlc -**************************************************/ -inline static void WriteFlagCavlc( - OutputBitstreamUnit_t *bitstreamPtr, - EB_U32 bits) -{ - OutputBitstreamWrite( - bitstreamPtr, - bits, - 1); -} + coeffBits += ONE_BIT; // Sign bit + // Add local bit counter to global bit counter + *coeffBitsLong += coeffBits; -static void CodeNALUnitHeader( - OutputBitstreamUnit_t *bitstreamPtr, - NalUnitType eNalUnitType, - unsigned int TemporalId) -{ - bitstreamPtr->sliceLocation[bitstreamPtr->sliceNum++] = (bitstreamPtr->writtenBitsCount >> 3); + return return_error; + } - // Write Start Code - WriteCodeCavlc( - bitstreamPtr, - 1, - 32); + // Compute the scanning type + // optimized this if statement later + scanIndex = SCAN_DIAG2; - //bsNALUHeader.write(0,1); // forbidden_zero_bit - //bsNALUHeader.write(nalu.m_nalUnitType, 6); // nal_unit_type - //bsNALUHeader.write(0, 6); // nuh_reserved_zero_6bits - //bsNALUHeader.write(nalu.m_temporalId+1, 3); // nuh_temporal_id_plus1 + if (type == INTRA_MODE) + { + // The test on partition size should be commented out to get conformance for Intra 4x4 ! + //if (partitionSize == SIZE_2Nx2N) + { + // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as + // the mode of upper-left corner of current CU + //intraLumaMode = candidatePtr->intraLumaMode[0]; + //intraChromaMode = candidatePtr->intraChromaMode[0]; - WriteCodeCavlc(bitstreamPtr, 0, 1); // forbidden_zero_bit - WriteCodeCavlc(bitstreamPtr, eNalUnitType, 6); // nal_unit_type - WriteCodeCavlc(bitstreamPtr, 0, 6); // nuh_reserved_zero_6bits - WriteCodeCavlc(bitstreamPtr, TemporalId + 1, 3); // nuh_temporal_id_plus1 + if (logBlockSize <= 3 - isChroma) + { + EB_S32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; + EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? (EB_S32)intraLumaMode : tempIntraChromaMode; -} -/************************************************** -* CodeShortTermRPS -* Note - A value of -1 used for numberOfNegativeReferences -* denotes that the default value should be used. -**************************************************/ -static void CodeShortTermRPS( - OutputBitstreamUnit_t *bitstreamPtr, - PredictionStructureEntry_t *predStructEntryPtr, - EB_U32 numberOfNegativeReferences, - EB_U32 numberOfPositiveReferences, - EB_U32 rpsCurrentIndex, - EB_BOOL openGopCraFlag) -{ - // difference between poc value of current picture and the picture used for inter prediction - //EB_S32 deltaPocRps; - EB_U32 rpsSyntaxIndex; - EB_BOOL usedByCurrFlag; - - if (rpsCurrentIndex > 0) { - - // "inter_ref_pic_set_prediction_flag" - WriteFlagCavlc( - bitstreamPtr, - predStructEntryPtr->interRpsPredictionFlag); - } - - { - // Update Number of Negative and Positive References - - numberOfNegativeReferences = (numberOfNegativeReferences == RPS_DEFAULT_VALUE || numberOfNegativeReferences > predStructEntryPtr->negativeRefPicsTotalCount) ? - predStructEntryPtr->negativeRefPicsTotalCount : - numberOfNegativeReferences; - numberOfPositiveReferences = (numberOfPositiveReferences == RPS_DEFAULT_VALUE || numberOfPositiveReferences > predStructEntryPtr->positiveRefPicsTotalCount) ? - predStructEntryPtr->positiveRefPicsTotalCount : - numberOfPositiveReferences; - - // "num_negative_pics" - WriteUvlc( - bitstreamPtr, - numberOfNegativeReferences); - - // "num_positive_pics" - WriteUvlc( - bitstreamPtr, - numberOfPositiveReferences); - - for (rpsSyntaxIndex = 0; rpsSyntaxIndex < numberOfNegativeReferences; ++rpsSyntaxIndex) { - - //"delta_poc_s0_minus1" - WriteUvlc( - bitstreamPtr, - predStructEntryPtr->deltaNegativeGopPosMinus1[rpsSyntaxIndex]); - - usedByCurrFlag = (openGopCraFlag == EB_TRUE) ? - EB_FALSE : - predStructEntryPtr->usedByNegativeCurrPicFlag[rpsSyntaxIndex]; - - // "used_by_curr_pic_s0_flag" - WriteFlagCavlc( - bitstreamPtr, - usedByCurrFlag); - } - - for (rpsSyntaxIndex = 0; rpsSyntaxIndex < numberOfPositiveReferences; ++rpsSyntaxIndex) { - - // "delta_poc_s0_minus1" - WriteUvlc( - bitstreamPtr, - predStructEntryPtr->deltaPositiveGopPosMinus1[rpsSyntaxIndex]); - - // "used_by_curr_pic_s0_flag" - WriteFlagCavlc( - bitstreamPtr, - predStructEntryPtr->usedByPositiveCurrPicFlag[rpsSyntaxIndex]); - } - } - - return; -} + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) + { + scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; + } + } + } + } -/************************************************** -* CodeProfileTier -**************************************************/ -static void CodeProfileTier( - OutputBitstreamUnit_t *bitstreamPtr, - SequenceControlSet_t *scsPtr) -{ - EB_U32 index; - - // "XXX_profile_space[]" - WriteCodeCavlc( - bitstreamPtr, - 0, - 2); - - //"XXX_tier_flag[]" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->tierIdc); - - // "XXX_profile_idc[]" - WriteCodeCavlc( - bitstreamPtr, - scsPtr->profileIdc, - 5); - - // "XXX_profile_compatibility_flag[][j]" - for (index = 0; index < 32; index++) { - - // "XXX_profile_compatibility_flag[][j]" - WriteFlagCavlc( - bitstreamPtr, - (EB_U32)(index == scsPtr->profileIdc)); - } - - // "general_progressive_source_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->generalProgressiveSourceFlag); - - // "general_interlaced_source_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->generalInterlacedSourceFlag); - - // "general_non_packed_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "general_frame_only_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->generalFrameOnlyConstraintFlag); + //------------------------------------------------------------------------------------------------------------------- + // Coefficients ordered according to scan order (absolute values) + // Significance map for each 4x4 subblock + // 1 bit per coefficient + // i-th bit corresponds to i-th coefficient in forward scan order - if(scsPtr->profileIdc < 4) - { - // "XXX_reserved_zero_44bits[0..15]" - WriteCodeCavlc( - bitstreamPtr, - 0, - 16); - } else + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + subSetIndex = 0; + while (1) { - // "general_max_12bit_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - (scsPtr->encoderBitDepth <= EB_12BIT)); + // determine position of subblock within transform block + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; - // "general_max_10bit_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - (scsPtr->encoderBitDepth <= EB_10BIT)); + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(coeffGroupPositionX, coeffGroupPositionY); + } - // "general_max_8bit_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - (scsPtr->encoderBitDepth <= EB_8BIT)); + subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - // "general_max_422chroma_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - (scsPtr->chromaFormatIdc <= EB_YUV422)); + sigmap = 0; + num = 0; - // "general_max_420chroma_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - (scsPtr->chromaFormatIdc <= EB_YUV420)); + for (k = 0; k < 16; k++) + { + EB_U32 position = scans4[scanIndex != SCAN_DIAG2][k]; + EB_U32 positionY = position >> 2; + EB_U32 positionX = position & 3; + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(positionX, positionY); + } - // "general_max_monochrome_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - (scsPtr->chromaFormatIdc <= EB_YUV400)); + val = ABS(subblockPtr[coeffStride * positionY + positionX]); + linearCoeff[16 * subSetIndex + k] = (EB_U16)val; + isNonZero = val != 0; + num += isNonZero; + sigmap |= isNonZero << k; + } - // "general_intra_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - (scsPtr->intraPeriodLength == 0)); - - // "general_one_picture_only_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "general_lower_bit_rate_constraint_flag" - WriteFlagCavlc( - bitstreamPtr, - 1); - - // "XXX_reserved_zero_44bits[9..15]" - WriteCodeCavlc( - bitstreamPtr, - 0, - 7); - } + subblockSigmap[subSetIndex] = (EB_U16)sigmap; - // "XXX_reserved_zero_44bits[16..31]" - WriteCodeCavlc( - bitstreamPtr, - 0, - 16); + if (sigmap != 0) + { + lastScanSet = subSetIndex; - // "XXX_reserved_zero_44bits[32..43]" - WriteCodeCavlc( - bitstreamPtr, - 0, - 12); + numNonZeroCoeffs -= num; + if (numNonZeroCoeffs == 0) + { + break; + } + } - return; -} -/************************************************** -* ComputeProfileTierLevelInfo -**************************************************/ -EB_ERRORTYPE ComputeProfileTierLevelInfo( - SequenceControlSet_t *scsPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - // Profile, level, tier calculation - - EB_U64 lumaPictureSize; - EB_U64 lumaWidthSquare; - EB_U64 lumaHeightSquare; - EB_U64 lumaSampleRate; - - lumaWidthSquare = scsPtr->lumaWidth* scsPtr->lumaWidth; - lumaHeightSquare = scsPtr->lumaHeight* scsPtr->lumaHeight; - lumaPictureSize = (((scsPtr->lumaWidth + (MAX_LCU_SIZE - 1)) >> MAX_LOG2_LCU_SIZE) << MAX_LOG2_LCU_SIZE) * (((scsPtr->lumaHeight + (MAX_LCU_SIZE - 1)) >> MAX_LOG2_LCU_SIZE) << MAX_LOG2_LCU_SIZE); - lumaSampleRate = (lumaPictureSize*scsPtr->frameRate) >> 16; - - // profile calculation - // profile is obatined from config file (needs to be modified later) - scsPtr->profileIdc = scsPtr->staticConfig.profile; - - - if (scsPtr->staticConfig.rateControlMode == 0){ - // level calculation - if ((lumaSampleRate <= maxLumaSampleRate[0]) && (lumaPictureSize <= maxLumaPictureSize[0]) && (lumaWidthSquare <= maxLumaPictureSize[0] * 8) && (lumaHeightSquare <= maxLumaPictureSize[0] * 8)) - scsPtr->levelIdc = 30; //1*30 - else if ((lumaSampleRate <= maxLumaSampleRate[1]) && (lumaPictureSize <= maxLumaPictureSize[1]) && (lumaWidthSquare <= maxLumaPictureSize[1] * 8) && (lumaHeightSquare <= maxLumaPictureSize[1] * 8)) - scsPtr->levelIdc = 60;//2*30 - else if ((lumaSampleRate <= maxLumaSampleRate[2]) && (lumaPictureSize <= maxLumaPictureSize[2]) && (lumaWidthSquare <= maxLumaPictureSize[2] * 8) && (lumaHeightSquare <= maxLumaPictureSize[2] * 8)) - scsPtr->levelIdc = 63;//2.1*30 - else if ((lumaSampleRate <= maxLumaSampleRate[3]) && (lumaPictureSize <= maxLumaPictureSize[3]) && (lumaWidthSquare <= maxLumaPictureSize[3] * 8) && (lumaHeightSquare <= maxLumaPictureSize[3] * 8)) - scsPtr->levelIdc = 90;//3*30 - else if ((lumaSampleRate <= maxLumaSampleRate[4]) && (lumaPictureSize <= maxLumaPictureSize[4]) && (lumaWidthSquare <= maxLumaPictureSize[4] * 8) && (lumaHeightSquare <= maxLumaPictureSize[4] * 8)) - scsPtr->levelIdc = 93;//3.1*30 - else if ((lumaSampleRate <= maxLumaSampleRate[5]) && (lumaPictureSize <= maxLumaPictureSize[5]) && (lumaWidthSquare <= maxLumaPictureSize[5] * 8) && (lumaHeightSquare <= maxLumaPictureSize[5] * 8)) - scsPtr->levelIdc = 120;//4*30 - else if ((lumaSampleRate <= maxLumaSampleRate[6]) && (lumaPictureSize <= maxLumaPictureSize[6]) && (lumaWidthSquare <= maxLumaPictureSize[6] * 8) && (lumaHeightSquare <= maxLumaPictureSize[6] * 8)) - scsPtr->levelIdc = 123;//4.1*30 - else if ((lumaSampleRate <= maxLumaSampleRate[7]) && (lumaPictureSize <= maxLumaPictureSize[7]) && (lumaWidthSquare <= maxLumaPictureSize[7] * 8) && (lumaHeightSquare <= maxLumaPictureSize[7] * 8)) - scsPtr->levelIdc = 150;//5*30 - else if ((lumaSampleRate <= maxLumaSampleRate[8]) && (lumaPictureSize <= maxLumaPictureSize[8]) && (lumaWidthSquare <= maxLumaPictureSize[8] * 8) && (lumaHeightSquare <= maxLumaPictureSize[8] * 8)) - scsPtr->levelIdc = 153;//5.1*30 - else if ((lumaSampleRate <= maxLumaSampleRate[9]) && (lumaPictureSize <= maxLumaPictureSize[9]) && (lumaWidthSquare <= maxLumaPictureSize[9] * 8) && (lumaHeightSquare <= maxLumaPictureSize[9] * 8)) - scsPtr->levelIdc = 156;//5.2*30 - else if ((lumaSampleRate <= maxLumaSampleRate[10]) && (lumaPictureSize <= maxLumaPictureSize[10]) && (lumaWidthSquare <= maxLumaPictureSize[10] * 8) && (lumaHeightSquare <= maxLumaPictureSize[10] * 8)) - scsPtr->levelIdc = 180;//6*30 - else if ((lumaSampleRate <= maxLumaSampleRate[11]) && (lumaPictureSize <= maxLumaPictureSize[11]) && (lumaWidthSquare <= maxLumaPictureSize[11] * 8) && (lumaHeightSquare <= maxLumaPictureSize[11] * 8)) - scsPtr->levelIdc = 183;//6.1*30 - else if ((lumaSampleRate <= maxLumaSampleRate[12]) && (lumaPictureSize <= maxLumaPictureSize[12]) && (lumaWidthSquare <= maxLumaPictureSize[12] * 8) && (lumaHeightSquare <= maxLumaPictureSize[12] * 8)) - scsPtr->levelIdc = 186;///6.2*30 - - // Tier calculation - // tier is hardcoded to 0 - scsPtr->tierIdc = 0; - } - else{ - // level calculation - if ((lumaSampleRate <= maxLumaSampleRate[0]) && (lumaPictureSize <= maxLumaPictureSize[0]) && (lumaWidthSquare <= maxLumaPictureSize[0] * 8) && (lumaHeightSquare <= maxLumaPictureSize[0] * 8) - && ((scsPtr->staticConfig.targetBitRate*2) <= highTierMaxBitrate[0]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[0])){ - scsPtr->levelIdc = 30; //1*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[0]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[0])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[1]) && (lumaPictureSize <= maxLumaPictureSize[1]) && (lumaWidthSquare <= maxLumaPictureSize[1] * 8) && (lumaHeightSquare <= maxLumaPictureSize[1] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[1]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[1])){ - scsPtr->levelIdc = 60;//2*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[1]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[1])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[2]) && (lumaPictureSize <= maxLumaPictureSize[2]) && (lumaWidthSquare <= maxLumaPictureSize[2] * 8) && (lumaHeightSquare <= maxLumaPictureSize[2] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[2]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[2])){ - scsPtr->levelIdc = 63;//2.1*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[2]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[2])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[3]) && (lumaPictureSize <= maxLumaPictureSize[3]) && (lumaWidthSquare <= maxLumaPictureSize[3] * 8) && (lumaHeightSquare <= maxLumaPictureSize[3] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[3]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[3])){ - scsPtr->levelIdc = 90;//3*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[3]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[3])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[4]) && (lumaPictureSize <= maxLumaPictureSize[4]) && (lumaWidthSquare <= maxLumaPictureSize[4] * 8) && (lumaHeightSquare <= maxLumaPictureSize[4] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[4]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[4])){ - scsPtr->levelIdc = 93;//3.1*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[4]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[4])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[5]) && (lumaPictureSize <= maxLumaPictureSize[5]) && (lumaWidthSquare <= maxLumaPictureSize[5] * 8) && (lumaHeightSquare <= maxLumaPictureSize[5] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[5]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[5])){ - scsPtr->levelIdc = 120;//4*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[5]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[5])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[6]) && (lumaPictureSize <= maxLumaPictureSize[6]) && (lumaWidthSquare <= maxLumaPictureSize[6] * 8) && (lumaHeightSquare <= maxLumaPictureSize[6] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[6]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[6])){ - scsPtr->levelIdc = 123;//4.1*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[6]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[6])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[7]) && (lumaPictureSize <= maxLumaPictureSize[7]) && (lumaWidthSquare <= maxLumaPictureSize[7] * 8) && (lumaHeightSquare <= maxLumaPictureSize[7] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[7]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[7])){ - scsPtr->levelIdc = 150;//5*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[7]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[7])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[8]) && (lumaPictureSize <= maxLumaPictureSize[8]) && (lumaWidthSquare <= maxLumaPictureSize[8] * 8) && (lumaHeightSquare <= maxLumaPictureSize[8] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[8]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[8])){ - scsPtr->levelIdc = 153;//5.1*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[8]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[8])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[9]) && (lumaPictureSize <= maxLumaPictureSize[9]) && (lumaWidthSquare <= maxLumaPictureSize[9] * 8) && (lumaHeightSquare <= maxLumaPictureSize[9] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[9]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[9])){ - scsPtr->levelIdc = 156;//5.2*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[9]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[9])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[10]) && (lumaPictureSize <= maxLumaPictureSize[10]) && (lumaWidthSquare <= maxLumaPictureSize[10] * 8) && (lumaHeightSquare <= maxLumaPictureSize[10] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[10]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[10])){ - scsPtr->levelIdc = 180;//6*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[10]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[10])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[11]) && (lumaPictureSize <= maxLumaPictureSize[11]) && (lumaWidthSquare <= maxLumaPictureSize[11] * 8) && (lumaHeightSquare <= maxLumaPictureSize[11] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[11]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[11])){ - scsPtr->levelIdc = 183;//6.1*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[11]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[11])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - else if ((lumaSampleRate <= maxLumaSampleRate[12]) && (lumaPictureSize <= maxLumaPictureSize[12]) && (lumaWidthSquare <= maxLumaPictureSize[12] * 8) && (lumaHeightSquare <= maxLumaPictureSize[12] * 8) - && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[12]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[12])){ - scsPtr->levelIdc = 186;///6.2*30 - - if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[12]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[12])) - scsPtr->tierIdc = 0; - else - scsPtr->tierIdc = 1; - } - - } + subSetIndex++; - if(scsPtr->staticConfig.tileColumnCount > 1 || scsPtr->staticConfig.tileRowCount > 1) { - unsigned int levelIdx = 0; - const unsigned int general_level_idc[13] = {30, 60, 63, 90, 93, 120, 123, 150, 153, 156, 180, 183, 186}; - while (scsPtr->levelIdc != general_level_idc[levelIdx]) levelIdx++; - while(scsPtr->staticConfig.tileColumnCount > maxTileColumn[levelIdx] || scsPtr->staticConfig.tileRowCount > maxTileRow[levelIdx]) levelIdx++; - if (levelIdx>12) { - return_error = EB_ErrorBadParameter; - return return_error; - } - scsPtr->levelIdc = general_level_idc[levelIdx]; } - // Use Level and Tier info if set in config - if (scsPtr->staticConfig.level != 0) { - scsPtr->levelIdc = scsPtr->staticConfig.level * 3; - } - // This needs to be modified later - scsPtr->tierIdc = scsPtr->staticConfig.tier; + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost + + // subblock position + coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + lastSigYPos = 4 * coeffGroupPositionY; + lastSigXPos = 4 * coeffGroupPositionX; + scanPosLast = 16 * lastScanSet; + + // position within subblock + posLast = Log2f(subblockSigmap[lastScanSet]); + coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; + lastSigYPos += coeffGroupPosition >> 2; + lastSigXPos += coeffGroupPosition & 3; + scanPosLast += posLast; + + // Should swap row/col for SCAN_HOR and SCAN_VER: + // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) + // - SCAN_VER because of equation (7-66) in H.265 (04/2013) + // Note that the scans4 array is adjusted to reflect this + if (scanIndex != SCAN_DIAG2) + { + SWAP(lastSigXPos, lastSigYPos); + } - return return_error; -} -/************************************************** -* ComputeMaxDpbBuffer -**************************************************/ -EB_ERRORTYPE ComputeMaxDpbBuffer( - SequenceControlSet_t *scsPtr){ - - EB_U64 maxLumaPicSize = 0, frameSize = (scsPtr->lumaWidth * scsPtr->lumaHeight); - EB_ERRORTYPE return_error = EB_ErrorNone; - - switch (scsPtr->levelIdc){ - case 30: - maxLumaPicSize = maxLumaPictureSize[0]; - break; - case 60: - maxLumaPicSize = maxLumaPictureSize[1]; - break; - case 63: - maxLumaPicSize = maxLumaPictureSize[2]; - break; - case 90: - maxLumaPicSize = maxLumaPictureSize[3]; - break; - case 93: - maxLumaPicSize = maxLumaPictureSize[4]; - break; - case 120: - maxLumaPicSize = maxLumaPictureSize[5]; - break; - case 123: - maxLumaPicSize = maxLumaPictureSize[6]; - break; - case 150: - maxLumaPicSize = maxLumaPictureSize[7]; - break; - case 153: - maxLumaPicSize = maxLumaPictureSize[8]; - break; - case 156: - maxLumaPicSize = maxLumaPictureSize[9]; - break; - case 180: - maxLumaPicSize = maxLumaPictureSize[10]; - break; - case 183: - maxLumaPicSize = maxLumaPictureSize[11]; - break; - case 186: - maxLumaPicSize = maxLumaPictureSize[12]; - break; - default: - CHECK_REPORT_ERROR_NC(scsPtr->encodeContextPtr->appCallbackPtr, EB_ENC_EC_ERROR26) - break; - } - - if (frameSize <= maxLumaPicSize >> 2) - scsPtr->maxDpbSize = 16; // MaxDpbSize = Min( 4 * maxDpbPicBuf, 16 ) \ maxDpbPicBuf = 6 - else if (frameSize <= maxLumaPicSize >> 1) - scsPtr->maxDpbSize = 12; // MaxDpbSize = Min( 2 * maxDpbPicBuf, 16 ) \ maxDpbPicBuf = 6 - else if (frameSize <= (3 * maxLumaPicSize) >> 2) - scsPtr->maxDpbSize = 8; // MaxDpbSize = Min( ( 4 * maxDpbPicBuf ) / 3, 16 ) \ maxDpbPicBuf = 6 - else - scsPtr->maxDpbSize = 6; // MaxDpbSize = maxDpbPicBuf \ maxDpbPicBuf = 6 - - return return_error; -} -/************************************************** -* CodeProfileTierLevel -**************************************************/ -static void CodeProfileTierLevel( - OutputBitstreamUnit_t *bitstreamPtr, - SequenceControlSet_t *scsPtr, - EB_BOOL profilePresentFlag, - EB_U32 maxSubLayersMinus1) -{ - EB_U32 index; - - if (profilePresentFlag) { - CodeProfileTier(bitstreamPtr, scsPtr); // general profile tier - } - - //"general_level_idc" - WriteCodeCavlc( - bitstreamPtr, - scsPtr->levelIdc, - 8); - - for (index = 0; index < maxSubLayersMinus1; index++) { - if (profilePresentFlag) { - // sub_layer_profile_present_flag[i] - WriteFlagCavlc( - bitstreamPtr, - 0); - } - //sub_layer_level_present_flag[i] - WriteFlagCavlc( - bitstreamPtr, - 0); - } - - if (maxSubLayersMinus1 > 0) { - for (index = maxSubLayersMinus1; index < 8; index++) { - // reserved_zero_2bits - WriteCodeCavlc( - bitstreamPtr, - 0, - 2); - } - } - - return; -} + // Encode the position of last significant coefficient + //CHKN coeffBits += EstimateLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); + coeffBits += EstimateLastSignificantXY_UPDATE(UpdatedCoeffCtxModel, cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); -/************************************************** -* CodeVPS -**************************************************/ -static void CodeVPS( - OutputBitstreamUnit_t *bitstreamPtr, - SequenceControlSet_t *scsPtr) -{ + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels - EB_U32 temporalLayersMinus1 = scsPtr->staticConfig.enableTemporalId ? scsPtr->maxTemporalLayers - : 0; - - // uiFirstByte - //codeNALUnitHeader( NAL_UNIT_SPS, NAL_REF_IDC_PRIORITY_HIGHEST ); - CodeNALUnitHeader( - bitstreamPtr, - NAL_UNIT_VPS, - 0); - - // Note: This function is currently hard coded, needs to have a proper structure - - // "vps_video_parameter_set_id" - WriteCodeCavlc( - bitstreamPtr, - scsPtr->vpsId, - 4); - - // "vps_reserved_three_2bits" - WriteCodeCavlc( - bitstreamPtr, - 3, - 2); - - // "vps_reserved_zero_6bits" - WriteCodeCavlc( - bitstreamPtr, - 0, - 6); - - // "vps_max_sub_layers_minus1" - WriteCodeCavlc( - bitstreamPtr, - temporalLayersMinus1,//scsPtr->maxTemporalLayers - 1, - 3); - - // "vps_temporal_id_nesting_flag" - WriteFlagCavlc( - bitstreamPtr, - temporalLayersMinus1 == 0 ? 1 : 0); - - // "vps_reserved_ffff_16bits" - WriteCodeCavlc( - bitstreamPtr, - 0xffff, - 16); - - CodeProfileTierLevel( - bitstreamPtr, - scsPtr, - EB_TRUE, - temporalLayersMinus1); - - // "vps_sub_layer_ordering_info_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - { - // Supports Main Profile Level 5 (Max Picture resolution 4Kx2K, up to 6 Hierarchy Levels) - // Max Dec Pic Buffering [i] - WriteUvlc( - bitstreamPtr, - scsPtr->maxDpbSize - 1/*4*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); - - WriteUvlc( - bitstreamPtr, - scsPtr->maxDpbSize - 1/*3*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); - - WriteUvlc( - bitstreamPtr, - 0); - } - - // "vps_max_nuh_reserved_zero_layer_id" - WriteCodeCavlc( - bitstreamPtr, - 0, - 6); - - // "vps_max_op_sets_minus1" - WriteUvlc( - bitstreamPtr, - 0); + significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - // "vps_timing_info_present_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->staticConfig.fpsInVps == 1 ? EB_TRUE : EB_FALSE); + contextOffset1 = 1; - if (scsPtr->staticConfig.fpsInVps == 1) { - if (scsPtr->staticConfig.frameRateDenominator != 0 && scsPtr->staticConfig.frameRateNumerator != 0) { + // Memory for 4x4 subblock-level significance flag + // Bits 0-7 are for current diagonal + // Bits 16-23 are for previous diagonal + sbSigMemory = 0; - // vps_num_units_in_tick - WriteCodeCavlc( - bitstreamPtr, - scsPtr->staticConfig.frameRateDenominator, - 32); + // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) + sbPrevDiagIdx = -1; - // vps_time_scale - WriteCodeCavlc( - bitstreamPtr, - scsPtr->staticConfig.frameRateNumerator, - 32); - } - else { - // vps_num_units_in_tick - WriteCodeCavlc( - bitstreamPtr, - 1 << 16, - 32); + // Loop over subblocks + subSetIndex = lastScanSet; + do + { + // 1. Subblock-level significance flag - // vps_time_scale - WriteCodeCavlc( - bitstreamPtr, - scsPtr->frameRate > 1000 ? scsPtr->frameRate : scsPtr->frameRate << 16, - 32); - } + // Assign default value that works for first and last subblock + EB_S32 significantFlagContextPattern = sbSigMemory & 3; - // vps_poc_proportional_to_timing_flag - WriteFlagCavlc( - bitstreamPtr, - 0); + if (subSetIndex != 0) + { + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; - // vps_num_hrd_parameters - WriteUvlc( - bitstreamPtr, - 0); - } + sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; + if (sbDiagIdx != sbPrevDiagIdx) + { + sbSigMemory = sbSigMemory << 16; + sbPrevDiagIdx = sbDiagIdx; + } + if (subSetIndex != lastScanSet) + { + EB_U32 sigCoeffGroupContextIndex; + EB_U32 significanceFlag; - // "vps_extension_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); + significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; + sigCoeffGroupContextIndex = significantFlagContextPattern != 0; + sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - return; + significanceFlag = (subblockSigmap[subSetIndex] != 0); -} -static void CodeHrdParameters( - OutputBitstreamUnit_t *bitstreamPtr, - AppHrdParameters_t *hrdParamterPtr, - EB_BOOL commonInfoPresentFlag, - EB_U32 maxTemporalLayersM1, - EncodeContext_t *encodeContextPtr) -{ - EB_U32 layerIndex; - EB_U32 cpbIndex; - EB_U32 nalOrVclIndex; // 0 --- Nal; 1 --- VCL - - (void)encodeContextPtr; - - if (commonInfoPresentFlag){ - // nal_hrd_parameters_present_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->nalHrdParametersPresentFlag); - - // vcl_hrd_parameters_present_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->vclHrdParametersPresentFlag); - - if (hrdParamterPtr->nalHrdParametersPresentFlag || hrdParamterPtr->vclHrdParametersPresentFlag){ - // sub_pic_cpb_params_present_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->subPicCpbParamsPresentFlag); - - if (hrdParamterPtr->subPicCpbParamsPresentFlag){ - // tick_divisor_minus2 - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->tickDivisorMinus2, - 8); - - // du_cpb_removal_delay_length_minus1 - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->duCpbRemovalDelayLengthMinus1, - 5); - - // sub_pic_cpb_params_in_pic_timing_sei_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->subPicCpbParamsPicTimingSeiFlag); - - // dpb_output_delay_du_length_minus1 - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->dpbOutputDelayDuLengthMinus1, - 5); - } - - // bit_rate_scale - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->bitRateScale, - 4); - - // cpb_size_scale - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->cpbSizeScale, - 4); - - if (hrdParamterPtr->subPicCpbParamsPresentFlag){ - // du_cpb_size_scale - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->duCpbSizeScale, - 4); - } - - // initial_cpb_removal_delay_length_minus1 - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->initialCpbRemovalDelayLengthMinus1, - 5); - - // au_cpb_removal_delay_length_minus1 - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->auCpbRemovalDelayLengthMinus1, - 5); - - // dpb_output_delay_length_minus1 - WriteCodeCavlc( - bitstreamPtr, - hrdParamterPtr->dpbOutputDelayLengthMinus1, - 5); - - } - } - - for (layerIndex = 0; layerIndex <= maxTemporalLayersM1; ++layerIndex){ - // fixed_pic_rate_general_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->fixedPicRateGeneralFlag[layerIndex]); - - if (!hrdParamterPtr->fixedPicRateGeneralFlag[layerIndex]){ - // fixed_pic_rate_within_cvs_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->fixedPicRateWithinCvsFlag[layerIndex]); - } - - if (hrdParamterPtr->fixedPicRateWithinCvsFlag[layerIndex]){ - // elemental_duration_in_tc_minus1 - WriteUvlc( - bitstreamPtr, - hrdParamterPtr->elementalDurationTcMinus1[layerIndex]); - } - else{ - // low_delay_hrd_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->lowDelayHrdFlag[layerIndex]); - } - - if (!hrdParamterPtr->lowDelayHrdFlag[layerIndex]){ - // cpb_cnt_minus1 - WriteUvlc( - bitstreamPtr, - hrdParamterPtr->cpbCountMinus1[layerIndex]); - } - - for (nalOrVclIndex = 0; nalOrVclIndex < 2; ++nalOrVclIndex){ - if ((nalOrVclIndex == 0 && hrdParamterPtr->nalHrdParametersPresentFlag) || - (nalOrVclIndex == 1 && hrdParamterPtr->vclHrdParametersPresentFlag)){ - - //CHECK_REPORT_ERROR( - // (hrdParamterPtr->cpbCountMinus1[layerIndex] < MAX_CPB_COUNT), - // encodeContextPtr->appCallbackPtr, - // EB_ENC_EC_ERROR14); - - for (cpbIndex = 0; cpbIndex <= hrdParamterPtr->cpbCountMinus1[layerIndex]; ++cpbIndex){ - // bit_rate_value_minus1 - WriteUvlc( - bitstreamPtr, - hrdParamterPtr->bitRateValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); - - // cpb_size_value_minus1 - WriteUvlc( - bitstreamPtr, - hrdParamterPtr->cpbSizeValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); - - if (hrdParamterPtr->subPicCpbParamsPresentFlag){ - // bit_rate_du_value_minus1 - WriteUvlc( - bitstreamPtr, - hrdParamterPtr->bitRateDuValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); - - // cpb_size_du_value_minus1 - WriteUvlc( - bitstreamPtr, - hrdParamterPtr->cpbSizeDuValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); - } - - // cbr_flag - WriteFlagCavlc( - bitstreamPtr, - hrdParamterPtr->cbrFlag[layerIndex][nalOrVclIndex][cpbIndex]); - } - } - } - } - - return; -} + // Add bits for coded_sub_block_flag + //CHKN coeffBits += CabacEstimatedBits[ significanceFlag ^ cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[ sigCoeffGroupContextIndex ] ]; + ctxModelPtr = &(UpdatedCoeffCtxModel->coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex]); + coeffBits += CabacEstimatedBits[significanceFlag ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(significanceFlag, ctxModelPtr); -/************************************************** -* CodeVUI -**************************************************/ -static void CodeVUI( - OutputBitstreamUnit_t *bitstreamPtr, - AppVideoUsabilityInfo_t *vuiPtr, - EB_U32 maxTemporalLayersM1, - EncodeContext_t *encodeContextPtr) -{ - // aspect_ratio_info_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->aspectRatioInfoPresentFlag); - - if (vuiPtr->aspectRatioInfoPresentFlag) - { - // aspect_ratio_idc - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->aspectRatioIdc, - 8); - - if (vuiPtr->aspectRatioIdc == 255) { - // sar_width - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->sarWidth, - 16); - - // sar_height - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->sarHeight, - 16); - } - } - - // overscan_info_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->overscanInfoPresentFlag); - - if (vuiPtr->overscanInfoPresentFlag) { - // overscan_appropriate_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->overscanApproriateFlag); - } - - // video_signal_type_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->videoSignalTypePresentFlag); - - if (vuiPtr->videoSignalTypePresentFlag) { - - // video_format - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->videoFormat, - 3); - - // video_full_range_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->videoFullRangeFlag); - - // colour_description_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->colorDescriptionPresentFlag); - - if (vuiPtr->colorDescriptionPresentFlag) { - - // colour_primaries - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->colorPrimaries, - 8); - - // transfer_characteristics - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->transferCharacteristics, - 8); - - // matrix_coefficients - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->matrixCoeffs, - 8); - } - } - - // chroma_loc_info_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->chromaLocInfoPresentFlag); - - if (vuiPtr->chromaLocInfoPresentFlag) { - - // chroma_sample_loc_type_top_field - WriteUvlc( - bitstreamPtr, - vuiPtr->chromaSampleLocTypeTopField); - - // chroma_sample_loc_type_bottom_field - WriteUvlc( - bitstreamPtr, - vuiPtr->chromaSampleLocTypeBottomField); - } - - // neutral_chroma_indication_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->neutralChromaIndicationFlag); - - // field_seq_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->fieldSeqFlag); - - // frame_field_info_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->frameFieldInfoPresentFlag); - - // default_display_window_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->defaultDisplayWindowFlag); - - if (vuiPtr->defaultDisplayWindowFlag) - { - // def_disp_win_left_offset - WriteUvlc( - bitstreamPtr, - vuiPtr->defaultDisplayWinLeftOffset); - - // def_disp_win_right_offset - WriteUvlc( - bitstreamPtr, - vuiPtr->defaultDisplayWinRightOffset); - - // def_disp_win_top_offset - WriteUvlc( - bitstreamPtr, - vuiPtr->defaultDisplayWinTopOffset); - - // def_disp_win_bottom_offset - WriteUvlc( - bitstreamPtr, - vuiPtr->defaultDisplayWinBottomOffset); - } - - // vui_timing_info_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->vuiTimingInfoPresentFlag); - - if (vuiPtr->vuiTimingInfoPresentFlag) { - - // vui_num_units_in_tick - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->vuiNumUnitsInTick, - 32); - - // vui_time_scale - WriteCodeCavlc( - bitstreamPtr, - vuiPtr->vuiTimeScale, - 32); - - // vui_poc_proportional_to_timing_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->vuiPocPropotionalTimingFlag); - - if (vuiPtr->vuiPocPropotionalTimingFlag) { - // vui_num_ticks_poc_diff_one_minus1 - WriteUvlc( - bitstreamPtr, - vuiPtr->vuiNumTicksPocDiffOneMinus1); - } - - // hrd_parameters_present_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->vuiHrdParametersPresentFlag); - - if (vuiPtr->vuiHrdParametersPresentFlag) { - CodeHrdParameters( - bitstreamPtr, - vuiPtr->hrdParametersPtr, - EB_TRUE, - maxTemporalLayersM1, - encodeContextPtr); - } - } - - - // bitstream_restriction_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->bitstreamRestrictionFlag); - - if (vuiPtr->bitstreamRestrictionFlag) { - // tiles_fixed_structure_flag - WriteFlagCavlc( - bitstreamPtr, - 0); - - // motion_vectors_over_pic_boundaries_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->motionVectorsOverPicBoundariesFlag); - - // restricted_ref_pic_lists_flag - WriteFlagCavlc( - bitstreamPtr, - vuiPtr->restrictedRefPicListsFlag); - - // min_spatial_segmentation_idc - WriteUvlc( - bitstreamPtr, - vuiPtr->minSpatialSegmentationIdc); - - // max_bytes_per_pic_denom - WriteUvlc( - bitstreamPtr, - vuiPtr->maxBytesPerPicDenom); - - // max_bits_per_mincu_denom - WriteUvlc( - bitstreamPtr, - vuiPtr->maxBitsPerMinCuDenom); - - // log2_max_mv_length_horizontal - WriteUvlc( - bitstreamPtr, - vuiPtr->log2MaxMvLengthHorizontal); - - // log2_max_mv_length_vertical - WriteUvlc( - bitstreamPtr, - vuiPtr->log2MaxMvLengthVertical); - } -} -/************************************************** -* CodeSPS -**************************************************/ -static void CodeSPS( - OutputBitstreamUnit_t *bitstreamPtr, - SequenceControlSet_t *scsPtr) -{ + if (!significanceFlag) + { + // Nothing else to do for this subblock since all coefficients in it are zero + continue; + } + } - EncodeContext_t *encodeContextPtr = scsPtr->encodeContextPtr; - - EB_U32 temporalLayersMinus1 = scsPtr->staticConfig.enableTemporalId ? scsPtr->maxTemporalLayers - : 0; - CodeNALUnitHeader( - bitstreamPtr, - NAL_UNIT_SPS, - 0); - - // "sps_video_parameter_set_id" - WriteCodeCavlc( - bitstreamPtr, - scsPtr->vpsId, - 4); - - // "sps_max_sub_layers_minus1" - WriteCodeCavlc( - bitstreamPtr, - temporalLayersMinus1,//scsPtr->maxTemporalLayers - 1, - 3); - - // "sps_temporal_id_nesting_flag" - WriteFlagCavlc( - bitstreamPtr, - temporalLayersMinus1 == 0 ? 1 : 0); - - CodeProfileTierLevel( - bitstreamPtr, - scsPtr, - EB_TRUE, - temporalLayersMinus1); - - // "sps_seq_parameter_set_id" - WriteUvlc( - bitstreamPtr, - scsPtr->spsId); - - // "chroma_format_idc" - WriteUvlc( - bitstreamPtr, - scsPtr->chromaFormatIdc); + // Memorize that current subblock is nonzero + sbSigMemory += 1 << coeffGroupPositionY; + } - if (scsPtr->chromaFormatIdc == EB_YUV444) { - WriteFlagCavlc(bitstreamPtr, 0); //separate_colour_plane_flag=0 - } + // 2. Coefficient significance flags - // "pic_width_in_luma_samples" - WriteUvlc( - bitstreamPtr, - scsPtr->lumaWidth); - - // "pic_height_in_luma_samples" - WriteUvlc( - bitstreamPtr, - scsPtr->lumaHeight); - - // "conformance_window_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->conformanceWindowFlag); - - - if (scsPtr->conformanceWindowFlag) { - - // "conf_win_left_offset" - WriteUvlc( - bitstreamPtr, - scsPtr->croppingLeftOffset >> 1); - - // "conf_win_right_offset" - WriteUvlc( - bitstreamPtr, - scsPtr->croppingRightOffset >> 1); - - // "conf_win_top_offset" - WriteUvlc( - bitstreamPtr, - scsPtr->croppingTopOffset >> 1); - - // "conf_win_bottom_offset" - WriteUvlc( - bitstreamPtr, - scsPtr->croppingBottomOffset >> 1); - } - - - // Luma Bit Increment - // "bit_depth_luma_minus8" - WriteUvlc( - bitstreamPtr, - scsPtr->staticConfig.encoderBitDepth - 8);//2);// - - // Chroma Bit Increment - // "bit_depth_chroma_minus8" - WriteUvlc( - bitstreamPtr, - scsPtr->staticConfig.encoderBitDepth - 8);// 2);// - - // "log2_max_pic_order_cnt_lsb_minus4" - WriteUvlc( - bitstreamPtr, - (EB_U32)(scsPtr->bitsForPictureOrderCount - 4)); - - // "sps_sub_layer_ordering_info_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - - { - - // Supports Main Profile Level 5 (Max Picture resolution 4Kx2K, up to 6 Hierarchy Levels) - WriteUvlc( - bitstreamPtr, - scsPtr->maxDpbSize - 1/*4*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); - - WriteUvlc( - bitstreamPtr, - scsPtr->maxDpbSize - 1/*3*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); - - WriteUvlc( - bitstreamPtr, - 0); - } - - // "log2_min_coding_block_size_minus3" - // Log2(Min CU Size) - 3 - WriteUvlc( - bitstreamPtr, - Log2f(scsPtr->lcuSize) - (scsPtr->maxLcuDepth - 1) - 3); - - // Max CU Depth - // "log2_diff_max_min_coding_block_size" - WriteUvlc( - bitstreamPtr, - scsPtr->maxLcuDepth - 1); - - // "log2_min_transform_block_size_minus2" - WriteUvlc( - bitstreamPtr, - 2 - 2); - - // "log2_diff_max_min_transform_block_size" - WriteUvlc( - bitstreamPtr, - 5 - 2); - - // "max_transform_hierarchy_depth_inter" - WriteUvlc( - bitstreamPtr, - 3 - 1); - - // "max_transform_hierarchy_depth_intra" - WriteUvlc( - bitstreamPtr, - 3 - 1); - - // "scaling_list_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "asymmetric_motion_partitions_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - EB_FALSE); - - //// SAO - // "sample_adaptive_offset_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->staticConfig.enableSaoFlag); - - // "pcm_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // RPS related - // No RPS to send in SPS when dynamic GOP is ON - WriteUvlc( - bitstreamPtr, - 0); - - // "long_term_ref_pics_present_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->predStructPtr->longTermEnableFlag); - - if (scsPtr->predStructPtr->longTermEnableFlag) { - // Note: Add code here related to Long term reference pics - - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR11); - - } - - // "sps_temporal_mvp_enable_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->enableTmvpSps); - - // "sps_strong_intra_smoothing_enable_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->enableStrongIntraSmoothing); - - // "vui_parameters_present_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->staticConfig.videoUsabilityInfo); - - if (scsPtr->staticConfig.videoUsabilityInfo) { - CodeVUI( - bitstreamPtr, - scsPtr->videoUsabilityInfoPtr, - scsPtr->maxTemporalLayers, - NULL /*encodeContextPtr*/); - } - - // "sps_extension_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - return; -} + numNonZero = 0; // Number of nonzero coefficients in current subblock -static void CodePPS( - OutputBitstreamUnit_t *bitstreamPtr, - SequenceControlSet_t *scsPtr, - EbPPSConfig_t *ppsConfig) -{ - //SequenceControlSet_t *scsPtr = (SequenceControlSet_t*)pcsPtr->sequenceControlSetWrapperPtr->objectPtr; + // Use do {} while(0) loop to avoid goto statement (early exit) + do + { + EB_S32 scanPosSig; + EB_S32 sigMap = subblockSigmap[subSetIndex]; + EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; + EB_S32 subPosition2 = subPosition; - EB_BOOL disableDlfFlag = scsPtr->staticConfig.disableDlfFlag; - EB_BOOL tileMode = (scsPtr->staticConfig.tileColumnCount > 1 || scsPtr->staticConfig.tileRowCount > 1) ? EB_TRUE : EB_FALSE; + if (subSetIndex == lastScanSet) + { + absCoeff[0] = linearCoeffBufferPtr[scanPosLast]; + numNonZero = 1; + if (sigMap == 1) + { + // Nothing else to do here (only "DC" coeff within subblock) + break; + } + scanPosSig = scanPosLast - 1; + sigMap <<= 31 - (scanPosSig & 15); + } + else + { + if (sigMap == 1 && subSetIndex != 0) + { + subPosition2++; + absCoeff[0] = linearCoeffBufferPtr[subPosition]; + numNonZero = 1; + } + scanPosSig = subPosition + 15; + sigMap <<= 16; + } - // uiFirstByte - //codeNALUnitHeader( NAL_UNIT_PPS, NAL_REF_IDC_PRIORITY_HIGHEST ); - CodeNALUnitHeader( - bitstreamPtr, - NAL_UNIT_PPS, - 0); + if (logBlockSize == 2) + { + tempOffset = 0; + contextIndexMapPtr = contextIndexMap4[scanIndex]; + } + else + { + tempOffset = (logBlockSize == 3) ? (scanIndex == SCAN_DIAG2 ? 9 : 15) : (!isChroma ? 21 : 12); + tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; + contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; + } + // Loop over coefficients + do + { + EB_U32 sigContextIndex; + EB_S32 sigCoeffFlag = sigMap < 0; - // "pps_pic_parameter_set_id" + sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - // Code PPS ID - WriteUvlc( - bitstreamPtr, - ppsConfig->ppsId); + // Add bits for sig_coeff_flag + //CHKN coeffBits += CabacEstimatedBits[ sigCoeffFlag ^ cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[ significantFlagContextOffset+sigContextIndex ] ]; - // "pps_seq_parameter_set_id" + ctxModelPtr = &(UpdatedCoeffCtxModel->significanceFlagContextModel[significantFlagContextOffset + sigContextIndex]); + coeffBits += CabacEstimatedBits[sigCoeffFlag ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(sigCoeffFlag, ctxModelPtr); - // Code SPS ID - WriteUvlc( - bitstreamPtr, - 0); + if (sigCoeffFlag) + { + absCoeff[numNonZero] = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; + numNonZero++; + } - // "dependent_slice_segments_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); + sigMap <<= 1; + scanPosSig--; + } while (scanPosSig >= subPosition2); + } while (0); - // "output_flag_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); + // 3. Coefficient level values + golombRiceParam = 0; - // "num_extra_slice_header_bits" - WriteCodeCavlc( - bitstreamPtr, - 0, - 3); + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; + contextSet += (contextOffset1 == 0); + contextOffset1 = 1; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - // "sign_data_hiding_flag" - WriteFlagCavlc( - bitstreamPtr, - EB_FALSE); + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - // "cabac_init_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); + { + coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) + } - // "num_ref_idx_l0_default_active_minus1" - WriteUvlc( - bitstreamPtr, - 0);// pcsPtr->ParentPcsPtr->predStructPtr->defaultRefPicsList0TotalCountMinus1); + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 - // "num_ref_idx_l1_default_active_minus1" - WriteUvlc( - bitstreamPtr, - 0);//pcsPtr->ParentPcsPtr->predStructPtr->defaultRefPicsList1TotalCountMinus1); + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; + // Add bits for coeff_abs_level_greater1_flag + //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[ contextOffset+contextOffset1 ] ]; - // "pic_init_qp_minus26" - WriteSvlc( - bitstreamPtr, - 0); - // "constrained_intra_pred_flag" - WriteFlagCavlc( - bitstreamPtr, - ppsConfig->constrainedFlag); + ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanOneContextModel[contextOffset + contextOffset1]); + coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); - //constrained = 1; - // "transform_skip_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); + if (symbolValue) + { + symbolValue = absVal > 2; - // "cu_qp_delta_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - scsPtr->staticConfig.improveSharpness || scsPtr->staticConfig.bitRateReduction || scsPtr->staticConfig.segmentOvEnabled);// pcsPtr->useDeltaQp); + // Add bits for coeff_abs_level_greater2_flag + //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[ contextOffset2 ] ]; - if (scsPtr->staticConfig.improveSharpness || scsPtr->staticConfig.bitRateReduction || scsPtr->staticConfig.segmentOvEnabled) { //pcsPtr->useDeltaQp) { - // "diff_cu_qp_delta_depth" - WriteUvlc( - bitstreamPtr, - scsPtr->inputResolution < INPUT_SIZE_1080p_RANGE ? 2 : 3);// pcsPtr->difCuDeltaQpDepth); - //0); // max cu deltaqp depth - } + ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanTwoContextModel[contextOffset2]); + coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); - // "pps_cb_qp_offset" - WriteSvlc( - bitstreamPtr, - 0);// pcsPtr->cbQpOffset); - // "pps_cr_qp_offset" - WriteSvlc( - bitstreamPtr, - 0);//pcsPtr->crQpOffset); + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); + golombRiceParam = (absVal > 3); + } - // "pps_slice_chroma_qp_offsets_present_flag" - WriteFlagCavlc( - bitstreamPtr, - EB_TRUE);// pcsPtr->sliceLevelChromaQpFlag); + index++; + contextOffset1 = 0; - // "weighted_pred_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "weighted_bipred_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "transquant_bypass_enable_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - // "tiles_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - tileMode); + // Exit loop early as remaining coefficients are coded differently + break; + } - // "entropy_coding_sync_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); + if (contextOffset1 < 3) + { + contextOffset1++; + } + } - if (tileMode == EB_TRUE) { + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Tiles Number of Columns - WriteUvlc( - bitstreamPtr, - scsPtr->staticConfig.tileColumnCount - 1); + // Add bits for >1 flag + //CHKN coeffBits += CabacEstimatedBits[ symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[ contextOffset ] ]; - // Tiles Number of Rows - WriteUvlc( - bitstreamPtr, - scsPtr->staticConfig.tileRowCount - 1); + ctxModelPtr = &(UpdatedCoeffCtxModel->greaterThanOneContextModel[contextOffset]); + coeffBits += CabacEstimatedBits[symbolValue ^ ctxModelPtr[0]]; + ctxModelPtr[0] = UPDATE_CONTEXT_MODEL(symbolValue, ctxModelPtr); - // Tiles Uniform Spacing Flag - WriteCodeCavlc( - bitstreamPtr, -// scsPtr->tileUniformSpacing, - 1, - 1); -#if 0 - if (scsPtr->staticConfig.tileUniformSpacing == 0) { - int syntaxItr; + if (symbolValue) + { + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 2, golombRiceParam); - // Tile Column Width - for (syntaxItr = 0; syntaxItr < (scsPtr->staticConfig.tileColumnCount - 1); ++syntaxItr) { - // "column_width_minus1" - WriteUvlc( - bitstreamPtr, - scsPtr->tileColumnWidthArray[syntaxItr] - 1); + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; } + } - // Tile Row Height - for (syntaxItr = 0; syntaxItr < (scsPtr->tileRowCount - 1); ++syntaxItr) { - // "row_height_minus1" - WriteUvlc( - bitstreamPtr, - scsPtr->tileRowHeightArray[syntaxItr] - 1); - } + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < numNonZero; index++) + { + EB_S32 absVal = absCoeff[index]; + + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 1, golombRiceParam); + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; } -#endif - // Loop filter across tiles - //if(scsPtr->staticConfig.tileColumnCount != 1 || scsPtr->staticConfig.tileRowCount > 1) { - WriteFlagCavlc( - bitstreamPtr, - 0); - //} - } + } while (--subSetIndex >= 0); - // "loop_filter_across_slices_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "deblocking_filter_control_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 1); - - //if(pcPPS->getDeblockingFilterControlPresentFlag()) - { - - // "deblocking_filter_override_enabled_flag" - WriteFlagCavlc( - bitstreamPtr, - 1); - - // "pps_disable_deblocking_filter_flag" - WriteFlagCavlc( - bitstreamPtr, - disableDlfFlag); - - if (!disableDlfFlag) { - // "pps_beta_offset_div2" - WriteSvlc( - bitstreamPtr, - 0); - - // "pps_tc_offset_div2" - WriteSvlc( - bitstreamPtr, - 0); - } - } - - // "pps_scaling_list_data_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "lists_modification_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "log2_parallel_merge_level_minus2" - WriteUvlc( - bitstreamPtr, - 0); // Note: related to mv merge/skip parallel processing - - // "slice_header_extension_present_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - // "pps_extension_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - - return; + // Add local bit counter to global bit counter + *coeffBitsLong += coeffBits; + (void)CabacCost; + return return_error; } -static EB_U32 GetEntropyCoderGetBitstreamSize(EntropyCoder_t *entropyCoderPtr) +EB_ERRORTYPE EstimateQuantizedCoefficients_generic( + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong) { - CabacEncodeContext_t *cabacEncCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; - OutputBitstreamUnit_t *bitstreamPtr = &cabacEncCtxPtr->bacEncContext.m_pcTComBitIf; - unsigned payloadBytes = (cabacEncCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount) >> 3; - FlushBitstream(bitstreamPtr); + EB_ERRORTYPE return_error = EB_ErrorNone; - unsigned char *buf = (unsigned char *)bitstreamPtr->bufferBegin; - unsigned int emulationCount = 0; + EB_U32 isChroma = componentType != COMPONENT_LUMA; + EB_U32 logBlockSize = Log2f(size); + EB_U32 coeffBits = 0; - //Count emulation counts 0x000001 and 0x000002 - if (payloadBytes >= 3) { - for (unsigned i = 0; i <= payloadBytes - 3; i++) { - if (buf[i] == 0 && buf[i+1] == 0 && (buf[i+2] <= 3)) { - emulationCount++; - i++; - } - } - } + EB_S32 absVal; + EB_U32 symbolValue; + EB_U32 contextOffset; + EB_U32 contextOffset2; - return (payloadBytes + emulationCount); -} + EB_U32 scanIndex; -static void CodeSliceHeader( - EB_U32 firstLcuAddr, - EB_U32 pictureQp, - OutputBitstreamUnit_t *bitstreamPtr, - PictureControlSet_t *pcsPtr) -{ - EB_S32 numBitesUsedByLcuAddr; - EB_S32 lcuTotalCount = pcsPtr->lcuTotalCount; + EB_U16 linearCoeff[MAX_TU_SIZE * MAX_TU_SIZE]; + EB_U16 *linearCoeffBufferPtr = linearCoeff; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pcsPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EB_U16 subblockSigmap[MAX_TU_SIZE * MAX_TU_SIZE / (4 * 4)]; - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pcsPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_S32 lastScanSet = -1; + EB_S32 subSetIndex; + EB_U32 coeffGroupPosition; + EB_S32 coeffGroupPositionY; + EB_S32 coeffGroupPositionX; - EB_BOOL disableDlfFlag = sequenceControlSetPtr->staticConfig.disableDlfFlag; - PictureParentControlSet_t *ppcsPtr = pcsPtr->ParentPcsPtr; + EB_S16 *subblockPtr; - EB_U32 sliceType = (pcsPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : pcsPtr->sliceType; - EB_BOOL tileMode = (ppcsPtr->tileColumnCount > 1 || ppcsPtr->tileRowCount > 1) ? EB_TRUE : EB_FALSE; + EB_S16 k; + EB_S32 sigmap; + EB_U32 num; - EB_U32 refPicsTotalCount = - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->negativeRefPicsTotalCount + - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->positiveRefPicsTotalCount; - - EB_U32 rpsSyntaxIndex; - EB_S32 numBits; - - NalUnitType nalUnit = pcsPtr->ParentPcsPtr->nalUnit; - - // here someone can add an appropriated NalRefIdc type - //CodeNALUnitHeader (pcSlice->getNalUnitType(), NAL_REF_IDC_PRIORITY_HIGHEST, 1, true); - - // *Note - there seems to be a bug with the temporal layers in the NALU or I don't - // understand what the issue is. Hardcoding to 0 for now... - - // Note - The NAL unit type has to be more sophisticated than this - CodeNALUnitHeader( - bitstreamPtr, - nalUnit, - pcsPtr->temporalId); - - // "first_slice_segment_in_pic_flag" - WriteFlagCavlc( - bitstreamPtr, - firstLcuAddr == 0); - - if (nalUnit == NAL_UNIT_CODED_SLICE_IDR_W_RADL - || nalUnit == NAL_UNIT_CODED_SLICE_IDR_N_LP - || nalUnit == NAL_UNIT_CODED_SLICE_BLA_N_LP - || nalUnit == NAL_UNIT_CODED_SLICE_BLA_W_RADL - || nalUnit == NAL_UNIT_CODED_SLICE_BLA_W_LP - || nalUnit == NAL_UNIT_CODED_SLICE_CRA) - { - - // "no_output_of_prior_pics_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - } - - // "slice_pic_parameter_set_id" - // PPS ID - WriteUvlc( - bitstreamPtr, - (pcsPtr->constrainedIntraFlag == EB_FALSE ? 0 : 1)); - - if (firstLcuAddr > 0) { - numBitesUsedByLcuAddr = 0; - while (lcuTotalCount > (1 << numBitesUsedByLcuAddr)) - { - ++numBitesUsedByLcuAddr; - } - - // "slice_address" - WriteCodeCavlc( - bitstreamPtr, - firstLcuAddr, - numBitesUsedByLcuAddr); - } - - // "slice_type" - - // Slice Type - WriteUvlc( - bitstreamPtr, - sliceType); - - if (pcsPtr->ParentPcsPtr->idrFlag != EB_TRUE) { - - EB_U64 pocNumber = (EB_U32)(((EB_S32)(pcsPtr->ParentPcsPtr->pictureNumber - pcsPtr->ParentPcsPtr->lastIdrPicture) + (1 << sequenceControlSetPtr->bitsForPictureOrderCount)) & ((1 << sequenceControlSetPtr->bitsForPictureOrderCount) - 1)); - WriteCodeCavlc( - bitstreamPtr, - (EB_U32)pocNumber, - (EB_U32)sequenceControlSetPtr->bitsForPictureOrderCount); - - // "short_term_ref_pic_set_sps_flag" - WriteFlagCavlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->useRpsInSps); - - // Short Term RPS - if (pcsPtr->ParentPcsPtr->useRpsInSps == EB_FALSE) { - - CodeShortTermRPS( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex], - RPS_DEFAULT_VALUE, - RPS_DEFAULT_VALUE, - 0, // No RPS to send in SPS when dynamic GOP is ON - pcsPtr->ParentPcsPtr->openGopCraFlag); - - - } - else { - - numBits = 0; - while ((1 << numBits) < (EB_S32)sequenceControlSetPtr->predStructPtr->predStructEntryCount) { - numBits++; - } - - if (numBits > 0) { - // "short_term_ref_pic_set_idx" - WriteCodeCavlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructIndex, - numBits); - } - } - - // Long Term RPS - if (pcsPtr->ParentPcsPtr->predStructPtr->longTermEnableFlag) { - - //NOTE: long term references are not handled properly. This below code needs to be modified - - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR11); - - } - - if (sequenceControlSetPtr->enableTmvpSps) { - // "slice_temporal_mvp_enable_flag" - WriteFlagCavlc( - bitstreamPtr, - !pcsPtr->ParentPcsPtr->disableTmvpFlag); - } - } - - if (sequenceControlSetPtr->staticConfig.enableSaoFlag) // Note: SAO is enabled - { - // "slice_sao_luma_flag" - WriteFlagCavlc( - bitstreamPtr, - pcsPtr->saoFlag[0]); - - // "slice_sao_chroma_flag" - WriteFlagCavlc( - bitstreamPtr, - pcsPtr->saoFlag[1]); - } - - // RPS List Construction - if (sliceType != EB_I_PICTURE) { - - // "num_ref_idx_active_override_flag" - WriteFlagCavlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsOverrideTotalCountFlag); - - if (pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsOverrideTotalCountFlag) { - - // "num_ref_idx_l0_active_minus1" - WriteUvlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsList0TotalCountMinus1); - - if (sliceType == EB_B_PICTURE){ - // "num_ref_idx_l1_active_minus1" - WriteUvlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsList1TotalCountMinus1); - } - } - } - - // RPS List Modification - if (sliceType != EB_I_PICTURE) { // rd, Note: This needs to be changed - - // if( pcSlice->getPPS()->getListsModificationPresentFlag() && pcSlice->getNumRpsCurrTempList() > 1) - if (pcsPtr->ParentPcsPtr->predStructPtr->listsModificationEnableFlag == EB_TRUE && refPicsTotalCount > 1){ - - // "ref_pic_list_modification_flag_l0" - WriteFlagCavlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list0ModificationFlag); - - if (pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list0ModificationFlag) { - - for (rpsSyntaxIndex = 0; rpsSyntaxIndex < refPicsTotalCount; rpsSyntaxIndex++) { - // "list_entry_l0" - WriteCodeCavlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list0ModIndex[rpsSyntaxIndex], - refPicsTotalCount); - } - } - - if (sliceType == EB_B_PICTURE){ - // "ref_pic_list_modification_flag_l1" - WriteFlagCavlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list1ModificationFlag); - - if (pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list1ModificationFlag) { - - for (rpsSyntaxIndex = 0; rpsSyntaxIndex < refPicsTotalCount; rpsSyntaxIndex++) { - // "list_entry_l1" - WriteCodeCavlc( - bitstreamPtr, - pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list1ModIndex[rpsSyntaxIndex], - refPicsTotalCount); - } - } - } - } - } - - if (sliceType == EB_B_PICTURE){ - // "mvd_l1_zero_flag" - WriteFlagCavlc( - bitstreamPtr, - 0); - } - - if (!pcsPtr->ParentPcsPtr->disableTmvpFlag){ - if (pcsPtr->sliceType == EB_B_PICTURE){ - WriteFlagCavlc( - bitstreamPtr, - pcsPtr->colocatedPuRefList == REF_LIST_0); - } - } - - if (sliceType != EB_I_PICTURE) { - // "five_minus_max_num_merge_cand" - WriteUvlc( - bitstreamPtr, - 0); // This has to be handled properly with mev merge being present - } - - //Int iCode = pcSlice->getSliceQp() - ( pcSlice->getPPS()->getPicInitQPMinus26() + 26 ); - //WRITE_SVLC( iCode, "slice_qp_delta" ); - WriteSvlc( - bitstreamPtr, - pictureQp - 26); - - if (pcsPtr->sliceLevelChromaQpFlag) { - // WRITE_SVLC( iCode, "slice_qp_delta_cb" ); - WriteSvlc( - bitstreamPtr, - pcsPtr->sliceCbQpOffset); - // WRITE_SVLC( iCode, "slice_qp_delta_cr" ); - WriteSvlc( - bitstreamPtr, - pcsPtr->sliceCrQpOffset); - } - - // Note: dlf override enable flag has been disabled (set to 0) - //"deblocking_filter_override_flag" - WriteFlagCavlc( - bitstreamPtr, - 1); - //"slice_deblocking_filter_disabled_flag" - WriteFlagCavlc( - bitstreamPtr, - disableDlfFlag); - - - if (!disableDlfFlag){ - - //"slice_beta_offset_div2" - WriteSvlc( - bitstreamPtr, - (pcsPtr->betaOffset >> 1)); - - //"slice_tc_offset_div2" - WriteSvlc( - bitstreamPtr, - (pcsPtr->tcOffset >> 1)); - } - - //if (!disableDlfFlag || (sequenceControlSetPtr->staticConfig.enableSaoFlag && (pcsPtr->saoFlag[0] || pcsPtr->saoFlag[1]))) { - // // "slice_loop_filter_across_slices_enabled_flag" - // WriteFlagCavlc( - // bitstreamPtr, - // 1); - //} + EB_U32 val; + EB_U32 isNonZero; - if (tileMode) { - unsigned tileColumnNumMinus1 = ppcsPtr->tileColumnCount - 1; - unsigned tileRowNumMinus1 = ppcsPtr->tileRowCount - 1; - unsigned num_entry_point_offsets = sequenceControlSetPtr->staticConfig.tileSliceMode == 0 ? (ppcsPtr->tileColumnCount * ppcsPtr->tileRowCount - 1) : 0; + EB_U32 posLast; + EB_S32 scanPosLast; + EB_S32 lastSigXPos; + EB_S32 lastSigYPos; - if (tileColumnNumMinus1 > 0 || tileRowNumMinus1 > 0) { - EB_U32 maxOffset = 0; - EB_U32 offset[EB_TILE_MAX_COUNT]; - for (unsigned tileIdx = 0; tileIdx < num_entry_point_offsets; tileIdx++) { - offset[tileIdx] = GetEntropyCoderGetBitstreamSize(pcsPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr); - if (offset[tileIdx] > maxOffset) { - maxOffset = offset[tileIdx]; - } - //printf("tile %d, size %d\n", tileIdx, offset[tileIdx]); - } + EB_U32 significantFlagContextOffset; - EB_U32 offsetLenMinus1 = 0; - while (maxOffset >= (1u << (offsetLenMinus1 + 1))) { - offsetLenMinus1++; - //assert(offsetLenMinus1 + 1 < 32); - } + EB_U32 contextOffset1; - // "num_entry_point_offsets" - WriteUvlc( - bitstreamPtr, - num_entry_point_offsets); + EB_S32 numNonZero; // Number of nonzero coefficients in current subblock + EB_S32 absCoeff[16] = { 0 }; // Array containing list of nonzero coefficients (size given by numNonZero) - if (num_entry_point_offsets > 0) { - WriteUvlc( - bitstreamPtr, - offsetLenMinus1); + // Memory for 4x4 subblock-level significance flag + // Bits 0-7 are for current diagonal + // Bits 16-23 are for previous diagonal + EB_U32 sbSigMemory; - for (unsigned tileIdx = 0; tileIdx < num_entry_point_offsets; tileIdx++) { - //EB_U32 offset = GetEntropyCoderGetBitstreamSize(pcsPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr); - WriteCodeCavlc(bitstreamPtr, offset[tileIdx] - 1, offsetLenMinus1 + 1); - } + // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) + EB_S32 sbPrevDiagIdx; + EB_S32 sbDiagIdx; + + EB_U32 tempOffset; + const EB_U8 *contextIndexMapPtr; + + EB_U32 golombRiceParam; + EB_S32 index; + EB_U32 contextSet; + EB_S32 numCoeffWithCodedGt1Flag; // Number of coefficients for which >1 flag is coded + + // DC-only fast track + if (numNonZeroCoeffs == 1 && coeffBufferPtr[0] != 0) + { + EB_S32 blockSizeOffset; + blockSizeOffset = isChroma ? NUMBER_OF_LAST_SIG_XY_CONTEXT_MODELS : ((logBlockSize - 2) * 3 + ((logBlockSize - 1) >> 2)); + + coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigXContextModel[blockSizeOffset]]; + coeffBits += CabacEstimatedBits[0 ^ cabacEncodeCtxPtr->contextModelEncContext.lastSigYContextModel[blockSizeOffset]]; + + absVal = ABS(coeffBufferPtr[0]); + symbolValue = absVal > 1; + + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS; + + // Add bits for coeff_abs_level_greater1_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + 1]]; + + if (symbolValue) + { + symbolValue = absVal > 2; + + // Add bits for coeff_abs_level_greater2_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; + + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); } } + + coeffBits += ONE_BIT; // Sign bit + // Add local bit counter to global bit counter + *coeffBitsLong += coeffBits; + + return return_error; } - // Byte Alignment + // Compute the scanning type + // optimized this if statement later + scanIndex = SCAN_DIAG2; - //pcBitstreamOut->write( 1, 1 ); - OutputBitstreamWrite( - bitstreamPtr, - 1, - 1); + if (type == INTRA_MODE) + { + // The test on partition size should be commented out to get conformance for Intra 4x4 ! + //if (partitionSize == SIZE_2Nx2N) + { + // note that for Intra 2Nx2N, each CU is one PU. So this mode is the same as + // the mode of upper-left corner of current CU + //intraLumaMode = candidatePtr->intraLumaMode[0]; + //intraChromaMode = candidatePtr->intraChromaMode[0]; - //pcBitstreamOut->writeAlignZero(); - OutputBitstreamWriteAlignZero( - bitstreamPtr); + if (logBlockSize <= 3 - isChroma) + { + EB_S32 tempIntraChromaMode = chromaMappingTable[intraChromaMode]; + EB_S32 intraMode = (!isChroma || tempIntraChromaMode == EB_INTRA_CHROMA_DM) ? (EB_S32)intraLumaMode : tempIntraChromaMode; -} + if (ABS(8 - ((intraMode - 2) & 15)) <= 4) + { + scanIndex = (intraMode & 16) ? SCAN_HOR2 : SCAN_VER2; + } + } + } + } -EB_ERRORTYPE EncodeTileFinish( - EntropyCoder_t *entropyCoderPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + //------------------------------------------------------------------------------------------------------------------- + // Coefficients ordered according to scan order (absolute values) + // Significance map for each 4x4 subblock + // 1 bit per coefficient + // i-th bit corresponds to i-th coefficient in forward scan order - // Add tile terminate bit (0x1) - BacEncContextTerminate( - &(cabacEncodeCtxPtr->bacEncContext), - 1); + // Loop through subblocks to reorder coefficients according to scan order + // Also derive significance map for each subblock, and determine last subblock that contains nonzero coefficients + subSetIndex = 0; + while (1) + { + // determine position of subblock within transform block + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; - BacEncContextFinish(&(cabacEncodeCtxPtr->bacEncContext)); + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(coeffGroupPositionX, coeffGroupPositionY); + } - OutputBitstreamWrite( - &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf), - 1, - 1); + subblockPtr = coeffBufferPtr + 4 * coeffGroupPositionY * coeffStride + 4 * coeffGroupPositionX; - OutputBitstreamWriteAlignZero( - &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf)); + sigmap = 0; + num = 0; - return return_error; -} + for (k = 0; k < 16; k++) + { + EB_U32 position = scans4[scanIndex != SCAN_DIAG2][k]; + EB_U32 positionY = position >> 2; + EB_U32 positionX = position & 3; + if (scanIndex == SCAN_HOR2) + { + // Subblock scan is mirrored for horizontal scan + SWAP(positionX, positionY); + } -EB_ERRORTYPE EncodeLcuSaoParameters( - LargestCodingUnit_t *tbPtr, - EntropyCoder_t *entropyCoderPtr, - EB_BOOL saoLumaSliceEnable, - EB_BOOL saoChromaSliceEnable, - EB_U8 bitdepth) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + val = ABS(subblockPtr[coeffStride * positionY + positionX]); + linearCoeff[16 * subSetIndex + k] = (EB_U16)val; + isNonZero = val != 0; + num += isNonZero; + sigmap |= isNonZero << k; + } - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + subblockSigmap[subSetIndex] = (EB_U16)sigmap; - // Note: Merge should be disabled across tiles and slices - // This needs to be revisited when there is more than one slice per tile - // Code Luma SAO parameters - // Code Luma SAO parameters - if (tbPtr->lcuEdgeInfoPtr->tileLeftEdgeFlag == EB_FALSE) { - EncodeSaoMerge( - cabacEncodeCtxPtr, - tbPtr->saoParams.saoMergeLeftFlag); - } else { - tbPtr->saoParams.saoMergeLeftFlag = EB_FALSE; - } - - if (tbPtr->saoParams.saoMergeLeftFlag == 0) { - if (tbPtr->lcuEdgeInfoPtr->tileTopEdgeFlag == EB_FALSE) { - EncodeSaoMerge( - cabacEncodeCtxPtr, - tbPtr->saoParams.saoMergeUpFlag); - } else { - tbPtr->saoParams.saoMergeUpFlag = EB_FALSE; - } - } - - if (tbPtr->saoParams.saoMergeLeftFlag == 0 && tbPtr->saoParams.saoMergeUpFlag == 0) { - - // Luma - if (saoLumaSliceEnable) { - EncodeSaoOffsets( - cabacEncodeCtxPtr, - 0, // Y - tbPtr->saoParams.saoTypeIndex, - tbPtr->saoParams.saoOffset[0], - tbPtr->saoParams.saoBandPosition[0], - bitdepth); - } - - // Chroma - if (saoChromaSliceEnable) { - // Cb - EncodeSaoOffsets( - cabacEncodeCtxPtr, - 1, // Cb - tbPtr->saoParams.saoTypeIndex, - tbPtr->saoParams.saoOffset[1], - tbPtr->saoParams.saoBandPosition[1], - bitdepth); - // Cr - EncodeSaoOffsets( - cabacEncodeCtxPtr, - 2, // Cr - tbPtr->saoParams.saoTypeIndex, - tbPtr->saoParams.saoOffset[2], - tbPtr->saoParams.saoBandPosition[2], - bitdepth); - } - - } - - return return_error; -} + if (sigmap != 0) + { + lastScanSet = subSetIndex; -/******************************************* -* Entropy Coding - Assign Delta Qp -*******************************************/ -static void EntropyCodingUpdateQp( - CodingUnit_t *cuPtr, - EB_BOOL availableCoeff, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - EB_U32 cuSize, - EB_U32 lcuSize, - EB_BOOL isDeltaQpEnable, - EB_BOOL *isDeltaQpNotCoded, - EB_U32 difCuDeltaQpDepth, - EB_U8 *prevCodedQp, - EB_U8 *prevQuantGroupCodedQp, - EB_U8 lcuQp, + numNonZeroCoeffs -= num; + if (numNonZeroCoeffs == 0) + { + break; + } + } - PictureControlSet_t *pictureControlSetPtr, - EB_U32 pictureOriginX, - EB_U32 pictureOriginY) -{ - EB_U8 refQp; - EB_U8 qp; - EB_U32 log2MinCuQpDeltaSize = Log2f(lcuSize) - difCuDeltaQpDepth; - EB_S32 qpTopNeighbor = 0; - EB_S32 qpLeftNeighbor = 0; - EB_BOOL newQuantGroup; - EB_U32 quantGroupX = cuOriginX - (cuOriginX & ((1 << log2MinCuQpDeltaSize) - 1)); - EB_U32 quantGroupY = cuOriginY - (cuOriginY & ((1 << log2MinCuQpDeltaSize) - 1)); - EB_BOOL sameLcuCheckTop = (((quantGroupY - 1) >> Log2f(MAX_LCU_SIZE)) == ((quantGroupY) >> Log2f(MAX_LCU_SIZE))) ? EB_TRUE : EB_FALSE; - EB_BOOL sameLcuCheckLeft = (((quantGroupX - 1) >> Log2f(MAX_LCU_SIZE)) == ((quantGroupX) >> Log2f(MAX_LCU_SIZE))) ? EB_TRUE : EB_FALSE; - - // Neighbor Array - EB_U32 qpLeftNeighborIndex = 0; - EB_U32 qpTopNeighborIndex = 0; - - // CU larger than the quantization group - if (Log2f(cuSize) >= log2MinCuQpDeltaSize){ - *isDeltaQpNotCoded = EB_TRUE; - } - - // At the beginning of a new quantization group - if (((cuOriginX & ((1 << log2MinCuQpDeltaSize) - 1)) == 0) && - ((cuOriginY & ((1 << log2MinCuQpDeltaSize) - 1)) == 0)) - { - *isDeltaQpNotCoded = EB_TRUE; - newQuantGroup = EB_TRUE; - } - else { - newQuantGroup = EB_FALSE; - } - - // setting the previous Quantization Group QP - if (newQuantGroup == EB_TRUE) { - *prevCodedQp = *prevQuantGroupCodedQp; - } - - if ((quantGroupY>pictureOriginY) && sameLcuCheckTop) { - qpTopNeighborIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - quantGroupX, - quantGroupY - 1, - pictureControlSetPtr->qpArrayStride); - qpTopNeighbor = pictureControlSetPtr->entropyQpArray[qpTopNeighborIndex]; - } - else { - qpTopNeighbor = *prevCodedQp; - } - - if ((quantGroupX > pictureOriginX) && sameLcuCheckLeft) { - qpLeftNeighborIndex = - LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( - quantGroupX - 1, - quantGroupY, - pictureControlSetPtr->qpArrayStride); - - qpLeftNeighbor = pictureControlSetPtr->entropyQpArray[qpLeftNeighborIndex]; - } - else { - qpLeftNeighbor = *prevCodedQp; - } - refQp = (EB_U8)(qpLeftNeighbor + qpTopNeighbor + 1) >> 1; - - qp = cuPtr->qp; - - // Update the State info - if (isDeltaQpEnable) { - if (*isDeltaQpNotCoded) { - if (availableCoeff){ - qp = cuPtr->qp; - *prevCodedQp = qp; - *prevQuantGroupCodedQp = qp; - *isDeltaQpNotCoded = EB_FALSE; - } - else{ - qp = refQp; - *prevQuantGroupCodedQp = qp; - } - } - } - else{ - qp = lcuQp; - } - cuPtr->qp = qp; - cuPtr->refQp = refQp; - - return; -} + subSetIndex++; -/********************************************************************* -* Intra4x4CheckAndCodeDeltaQp -* Check the conditions and codes the change in the QP indicated by delta QP -* -* cabacEncContextPtr -* pointer to the CABAC structure passed as input -* -* cuPtr -* input pointer to the coding unit -* -* tuPtr -* input pointer to the transform unit -*********************************************************************/ -EB_ERRORTYPE Intra4x4CheckAndCodeDeltaQp( - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - TransformUnit_t *tuPtr, - EB_BOOL isDeltaQpEnable, - EB_BOOL *isdeltaQpNotCoded) -{ + } - EB_ERRORTYPE return_error = EB_ErrorNone; + //------------------------------------------------------------------------------------------------------------------- + // Obtain the last significant X and Y positions and compute their bit cost + + // subblock position + coeffGroupPosition = sbScans[logBlockSize - 2][lastScanSet]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; + lastSigYPos = 4 * coeffGroupPositionY; + lastSigXPos = 4 * coeffGroupPositionX; + scanPosLast = 16 * lastScanSet; + + // position within subblock + posLast = Log2f(subblockSigmap[lastScanSet]); + coeffGroupPosition = scans4[scanIndex != SCAN_DIAG2][posLast]; + lastSigYPos += coeffGroupPosition >> 2; + lastSigXPos += coeffGroupPosition & 3; + scanPosLast += posLast; + + // Should swap row/col for SCAN_HOR and SCAN_VER: + // - SCAN_HOR because the subscan order is mirrored (compared to SCAN_DIAG) + // - SCAN_VER because of equation (7-66) in H.265 (04/2013) + // Note that the scans4 array is adjusted to reflect this + if (scanIndex != SCAN_DIAG2) + { + SWAP(lastSigXPos, lastSigYPos); + } - if (isDeltaQpEnable) { - EB_BOOL cbfChroma = 0; - if (cabacEncodeCtxPtr->colorFormat == EB_YUV444) { - cbfChroma = tuPtr->cbCbf || tuPtr->crCbf; - } else if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { - cbfChroma = (cuPtr->transformUnitArray[1].cbCbf || - cuPtr->transformUnitArray[1].crCbf || - cuPtr->transformUnitArray[3].cbCbf || - cuPtr->transformUnitArray[3].crCbf); - } else { - cbfChroma = (cuPtr->transformUnitArray[1].cbCbf || - cuPtr->transformUnitArray[1].crCbf); - } - if (tuPtr->lumaCbf || cbfChroma) { - if (*isdeltaQpNotCoded){ - EB_S32 deltaQp; - deltaQp = cuPtr->qp - cuPtr->refQp; + // Encode the position of last significant coefficient + coeffBits += EstimateLastSignificantXY(cabacEncodeCtxPtr, lastSigXPos, lastSigYPos, size, logBlockSize, isChroma); - EncodeDeltaQp( - cabacEncodeCtxPtr, - deltaQp); + //------------------------------------------------------------------------------------------------------------------- + // Encode Coefficient levels - *isdeltaQpNotCoded = EB_FALSE; - } - } - } + significantFlagContextOffset = (!isChroma) ? 0 : NUMBER_OF_SIG_FLAG_LUMA_CONTEXT_MODELS; - return return_error; -} + contextOffset1 = 1; -static EB_ERRORTYPE Intra4x4EncodeLumaCoeff( - EB_U8 intraLumaMode, - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - TransformUnit_t *tuPtr, - EB_U32 tuOriginX, - EB_U32 tuOriginY, - EbPictureBufferDesc_t *coeffPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + // Memory for 4x4 subblock-level significance flag + // Bits 0-7 are for current diagonal + // Bits 16-23 are for previous diagonal + sbSigMemory = 0; - EB_S16 *coeffBuffer; - EB_U32 coeffLocation; - EB_U32 countNonZeroCoeffs = 0; + // Subblock diagonal index for previous 4x4 subblock (diagonal index is row+col) + sbPrevDiagIdx = -1; - coeffLocation = tuOriginX + (tuOriginY * coeffPtr->strideY); - coeffBuffer = (EB_S16*)&coeffPtr->bufferY[coeffLocation * sizeof(EB_S16)]; + // Loop over subblocks + subSetIndex = lastScanSet; + do + { + // 1. Subblock-level significance flag - if (tuPtr->lumaCbf){ + // Assign default value that works for first and last subblock + EB_S32 significantFlagContextPattern = sbSigMemory & 3; - ComputeNumofSigCoefficients( - coeffBuffer, - coeffPtr->strideY, - MIN_PU_SIZE, - &countNonZeroCoeffs); + if (subSetIndex != 0) + { + coeffGroupPosition = sbScans[logBlockSize - 2][subSetIndex]; + coeffGroupPositionY = coeffGroupPosition >> 4; + coeffGroupPositionX = coeffGroupPosition & 15; - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - MIN_PU_SIZE, - (EB_MODETYPE)cuPtr->predictionModeFlag, - intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideY, - COMPONENT_LUMA, - tuPtr); - } + sbDiagIdx = coeffGroupPositionY + coeffGroupPositionX; + if (sbDiagIdx != sbPrevDiagIdx) + { + sbSigMemory = sbSigMemory << 16; + sbPrevDiagIdx = sbDiagIdx; + } - return return_error; -} + if (subSetIndex != lastScanSet) + { + EB_U32 sigCoeffGroupContextIndex; + EB_U32 significanceFlag; -static EB_ERRORTYPE Intra4x4EncodeChromaCoeff( - EB_U8 intraLumaMode, - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - EB_U32 tuOriginX, - EB_U32 tuOriginY, - EB_U32 tuIndex, //For 444 case, 422/420 can ignore this flag - EbPictureBufferDesc_t *coeffPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + significantFlagContextPattern = (sbSigMemory >> (16 + coeffGroupPositionY)) & 3; + sigCoeffGroupContextIndex = significantFlagContextPattern != 0; + sigCoeffGroupContextIndex += isChroma * NUMBER_OF_COEFF_GROUP_SIG_FLAG_CONTEXT_MODELS; - TransformUnit_t *tuPtr = NULL; - EB_S16 *coeffBuffer; - EB_U32 coeffLocation; - EB_U32 countNonZeroCoeffs = 0; - const EB_U16 subWidthCMinus1 = (cabacEncodeCtxPtr->colorFormat == EB_YUV444 ? 1 : 2) - 1; - const EB_U16 subHeightCMinus1 = (cabacEncodeCtxPtr->colorFormat >= EB_YUV422 ? 1 : 2) - 1; + significanceFlag = (subblockSigmap[subSetIndex] != 0); - // cb - for (int tIdx = 0; tIdx < (cabacEncodeCtxPtr->colorFormat == EB_YUV422 ? 2 : 1); tIdx++) { - // Get the correct TU block for 444, not always the 1st one - tuPtr=&cuPtr->transformUnitArray[tuIndex + 1 + 2 * tIdx]; //1,3 for 422 chroma - coeffLocation = (tuOriginX >> subWidthCMinus1) + - (((tuOriginY + MIN_PU_SIZE * tIdx) * coeffPtr->strideCb) >> subHeightCMinus1); - coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[coeffLocation * sizeof(EB_S16)]; + // Add bits for coded_sub_block_flag + coeffBits += CabacEstimatedBits[significanceFlag ^ cabacEncodeCtxPtr->contextModelEncContext.coeffGroupSigFlagContextModel[sigCoeffGroupContextIndex]]; - if (tuPtr->cbCbf){ - ComputeNumofSigCoefficients( - coeffBuffer, - coeffPtr->strideCb, - MIN_PU_SIZE, - &countNonZeroCoeffs); + if (!significanceFlag) + { + // Nothing else to do for this subblock since all coefficients in it are zero + continue; + } + } - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - MIN_PU_SIZE, - (EB_MODETYPE)cuPtr->predictionModeFlag, - intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideCb, - COMPONENT_CHROMA_CB, - tuPtr); + // Memorize that current subblock is nonzero + sbSigMemory += 1 << coeffGroupPositionY; } - } - // cr - for (int tIdx=0; tIdx<(cabacEncodeCtxPtr->colorFormat==EB_YUV422?2:1); tIdx++) { - tuPtr=&cuPtr->transformUnitArray[tuIndex + 1 + 2 * tIdx]; //1,3 for 422 chroma - //coeffLocation = ((tuOriginX + ((tuOriginY+MIN_PU_SIZE*tIdx) * coeffPtr->strideCb)) >> 1); - coeffLocation = (tuOriginX >> subWidthCMinus1) + - (((tuOriginY + MIN_PU_SIZE * tIdx) * coeffPtr->strideCb) >> subHeightCMinus1); - coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[coeffLocation * sizeof(EB_S16)]; + // 2. Coefficient significance flags - if (tuPtr->crCbf){ - ComputeNumofSigCoefficients( - coeffBuffer, - coeffPtr->strideCr, - MIN_PU_SIZE, - &countNonZeroCoeffs); + numNonZero = 0; // Number of nonzero coefficients in current subblock - EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( - cabacEncodeCtxPtr, - MIN_PU_SIZE, - (EB_MODETYPE)cuPtr->predictionModeFlag, - intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideCr, - COMPONENT_CHROMA_CR, - tuPtr); - } - } + // Use do {} while(0) loop to avoid goto statement (early exit) + do + { + EB_S32 scanPosSig; + EB_S32 sigMap = subblockSigmap[subSetIndex]; + EB_S32 subPosition = subSetIndex << LOG2_SCAN_SET_SIZE; + EB_S32 subPosition2 = subPosition; - return return_error; -} + if (subSetIndex == lastScanSet) + { + absCoeff[0] = linearCoeffBufferPtr[scanPosLast]; + numNonZero = 1; + if (sigMap == 1) + { + // Nothing else to do here (only "DC" coeff within subblock) + break; + } + scanPosSig = scanPosLast - 1; + sigMap <<= 31 - (scanPosSig & 15); + } + else + { + if (sigMap == 1 && subSetIndex != 0) + { + subPosition2++; + absCoeff[0] = linearCoeffBufferPtr[subPosition]; + numNonZero = 1; + } + scanPosSig = subPosition + 15; + sigMap <<= 16; + } -static EB_ERRORTYPE Intra4x4EncodeCoeff( - LargestCodingUnit_t *tbPtr, - CabacEncodeContext_t *cabacEncodeCtxPtr, - CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_U32 *cuQuantizedCoeffsBits, - EB_BOOL isDeltaQpEnable, - EB_BOOL *isdeltaQpNotCoded) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + if (logBlockSize == 2) + { + tempOffset = 0; + contextIndexMapPtr = contextIndexMap4[scanIndex]; + } + else + { + tempOffset = (logBlockSize == 3) ? (scanIndex == SCAN_DIAG2 ? 9 : 15) : (!isChroma ? 21 : 12); + tempOffset += (!isChroma && subSetIndex != 0) ? 3 : 0; + contextIndexMapPtr = contextIndexMap8[scanIndex != SCAN_DIAG2][significantFlagContextPattern] - subPosition; + } - TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStatsPtr; - EB_U32 tuIndex; - EB_U32 tuOriginX; - EB_U32 tuOriginY; + // Loop over coefficients + do + { + EB_U32 sigContextIndex; + EB_S32 sigCoeffFlag = sigMap < 0; - EB_U32 cbfContext; - EB_U32 puIndex; + sigContextIndex = (scanPosSig == 0) ? 0 : contextIndexMapPtr[scanPosSig] + tempOffset; - //rate Control - EB_U32 writtenBitsBeforeQuantizedCoeff; - EB_U32 writtenBitsAfterQuantizedCoeff; - EB_BOOL sum_cbCbf; - EB_BOOL sum_crCbf; + // Add bits for sig_coeff_flag + coeffBits += CabacEstimatedBits[sigCoeffFlag ^ cabacEncodeCtxPtr->contextModelEncContext.significanceFlagContextModel[significantFlagContextOffset + sigContextIndex]]; - //store the number of written bits before coding quantized coeffs (flush is not called yet): - // The total number of bits is - // number of written bits - // + 32 - bits remaining in interval Low Value - // + number of buffered byte * 8 - // This should be only for coeffs not any flag - writtenBitsBeforeQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + - 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + - (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); + if (sigCoeffFlag) + { + absCoeff[numNonZero] = scanPosSig >= 0 ? linearCoeffBufferPtr[scanPosSig] : 0; + numNonZero++; + } - // Get Chroma Cbf context - cbfContext = 0; + sigMap <<= 1; + scanPosSig--; + } while (scanPosSig >= subPosition2); + } while (0); - sum_cbCbf = (cabacEncodeCtxPtr->colorFormat != EB_YUV444) ? - (&cuPtr->transformUnitArray[1])->cbCbf : - ((&cuPtr->transformUnitArray[1])->cbCbf | - (&cuPtr->transformUnitArray[2])->cbCbf | - (&cuPtr->transformUnitArray[3])->cbCbf | - (&cuPtr->transformUnitArray[4])->cbCbf); + // 3. Coefficient level values + golombRiceParam = 0; - sum_crCbf = (cabacEncodeCtxPtr->colorFormat != EB_YUV444) ? - (&cuPtr->transformUnitArray[1])->crCbf : - ((&cuPtr->transformUnitArray[1])->crCbf | - (&cuPtr->transformUnitArray[2])->crCbf | - (&cuPtr->transformUnitArray[3])->crCbf | - (&cuPtr->transformUnitArray[4])->crCbf); + contextSet = (subSetIndex != 0 && !isChroma) ? 2 : 0; + contextSet += (contextOffset1 == 0); + contextOffset1 = 1; + contextOffset = isChroma * NUMBER_OF_GREATER_ONE_COEFF_LUMA_CONTEXT_MODELS + 4 * contextSet; + contextOffset2 = isChroma * NUMBER_OF_GREATER_TWO_COEFF_LUMA_CONTEXT_MODELS + contextSet; - // Cb CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - sum_cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + numCoeffWithCodedGt1Flag = MIN(GREATER_THAN1_MAX_NUMBER, numNonZero); - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (&cuPtr->transformUnitArray[3])->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } - // Cr CBF - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - sum_crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - (&cuPtr->transformUnitArray[3])->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - } + { + coeffBits += ONE_BIT * numNonZero; // Add bits for coeff_sign_flag (all coefficients in subblock) + } + + // Loop over coefficients until base value of Exp-Golomb coding changes + // Base value changes after either + // - 8th coefficient + // - a coefficient larger than 1 + + for (index = 0; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - // Get Luma Cbf context + // Add bits for coeff_abs_level_greater1_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset + contextOffset1]]; - // Encode Intra 4x4 data - for (puIndex = 0; puIndex < 4; puIndex++) { - tuIndex = puIndex + 1; - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - tuStatsPtr = GetTransformUnitStats(tuIndex); - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); + if (symbolValue) + { + symbolValue = absVal > 2; - if (cabacEncodeCtxPtr->colorFormat == EB_YUV444) { - cbfContext = 1; - if (sum_cbCbf) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->cbCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + // Add bits for coeff_abs_level_greater2_flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanTwoContextModel[contextOffset2]]; + + if (symbolValue) + { + // Golomb Rice parameter is known to be 0 here + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 3, 0); + golombRiceParam = (absVal > 3); + } + + index++; + contextOffset1 = 0; + + // Exit loop early as remaining coefficients are coded differently + break; } - if (sum_crCbf) { - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->crCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + if (contextOffset1 < 3) + { + contextOffset1++; } } - cbfContext = 0; - EncodeOneBin( - &(cabacEncodeCtxPtr->bacEncContext), - tuPtr->lumaCbf, - &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); + // Loop over coefficients after first one that was > 1 but before 8th one + // Base value is know to be equal to 2 + for (; index < numCoeffWithCodedGt1Flag; index++) + { + EB_S32 absVal = absCoeff[index]; + EB_U32 symbolValue = absVal > 1; - //EncodeDeltaQp - Intra4x4CheckAndCodeDeltaQp( - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - isDeltaQpEnable, - isdeltaQpNotCoded); + // Add bits for >1 flag + coeffBits += CabacEstimatedBits[symbolValue ^ cabacEncodeCtxPtr->contextModelEncContext.greaterThanOneContextModel[contextOffset]]; - // Encode Luma coeff - Intra4x4EncodeLumaCoeff( - tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuPtr->leafIndex] - 21) << 2) + puIndex], - cabacEncodeCtxPtr, - cuPtr, - tuPtr, - tuOriginX, - tuOriginY, - coeffPtr); + if (symbolValue) + { + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 2, golombRiceParam); - if (cabacEncodeCtxPtr->colorFormat == EB_YUV444) { - // residual coding for Cb/Cr - Intra4x4EncodeChromaCoeff( - tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuPtr->leafIndex] - 21) << 2) + puIndex], - cabacEncodeCtxPtr, - cuPtr, - tuOriginX, - tuOriginY, - puIndex, - coeffPtr); + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } } - } - if (cabacEncodeCtxPtr->colorFormat != EB_YUV444) { - // Encode Chroma coeff for non-444 case, - // Jing TODO: see if can move to above loop - tuStatsPtr = GetTransformUnitStats(1); - tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); - tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); + // Loop over remaining coefficients (8th and beyond) + // Base value is known to be equal to 1 + for (; index < numNonZero; index++) + { + EB_S32 absVal = absCoeff[index]; - Intra4x4EncodeChromaCoeff( - tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuPtr->leafIndex] - 21) << 2)], - cabacEncodeCtxPtr, - cuPtr, - tuOriginX, - tuOriginY, + coeffBits += EstimateRemainingCoeffExponentialGolombCode(absVal - 1, golombRiceParam); + + // Update Golomb-Rice parameter + if (golombRiceParam < 4 && absVal >(3 << golombRiceParam)) golombRiceParam++; + } + } while (--subSetIndex >= 0); + + // Add local bit counter to global bit counter + *coeffBitsLong += coeffBits; + (void)CabacCost; + return return_error; +} + +/********************************************************************* +* EncodeDeltaQp +* Encodes the change in the QP indicated by delta QP +* +* cabacEncContextPtr +* pointer to the CABAC structure passed as input +* +*********************************************************************/ +// The functionality of coding delta Qp is implemented for HM 7.0 and needs to be updated for HM 8.0 +EB_ERRORTYPE EncodeDeltaQp( + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_S32 deltaQp) +{ + + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_BOOL lastBin; + EB_U32 absDeltaQp; + EB_U32 tuValue; + EB_U32 tuValueTemp; + EB_U32 signDeltaQp = 0; + + absDeltaQp = ABS(deltaQp); + tuValue = MIN((EB_S32)absDeltaQp, CU_DELTA_QP_CMAX); + tuValueTemp = tuValue; + + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuValueTemp ? 1 : 0, + &(cabacEncodeCtxPtr->contextModelEncContext.deltaQpContextModel[0])); + + + if (tuValueTemp) { + lastBin = + (CU_DELTA_QP_CMAX > tuValueTemp) ? EB_TRUE : EB_FALSE; + + while (--tuValueTemp) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + 1, + &(cabacEncodeCtxPtr->contextModelEncContext.deltaQpContextModel[1])); + } + + if (lastBin) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), 0, - coeffPtr); + &(cabacEncodeCtxPtr->contextModelEncContext.deltaQpContextModel[1])); + } } - //store the number of written bits after coding quantized coeffs (flush is not called yet): - // The total number of bits is - // number of written bits - // + 32 - bits remaining in interval Low Value - // + number of buffered byte * 8 - writtenBitsAfterQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + - 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + - (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); + if (absDeltaQp >= CU_DELTA_QP_CMAX){ + ExponentialGolombCode( + cabacEncodeCtxPtr, + absDeltaQp - CU_DELTA_QP_CMAX, + CU_DELTA_QP_EGK); + } - *cuQuantizedCoeffsBits = writtenBitsAfterQuantizedCoeff - writtenBitsBeforeQuantizedCoeff; + if (absDeltaQp > 0){ + signDeltaQp = (deltaQp > 0 ? 0 : 1); + EncodeBypassOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + signDeltaQp); + } - return return_error; + return return_error; } -/********************************************** -* Encode Lcu -**********************************************/ -EB_ERRORTYPE EncodeLcu( - LargestCodingUnit_t *tbPtr, - EB_U32 lcuOriginX, - EB_U32 lcuOriginY, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 lcuSize, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffPtr, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *leafDepthNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, - NeighborArrayUnit_t *skipFlagNeighborArray, - EB_U16 tileIdx, - EB_U32 pictureOriginX, - EB_U32 pictureOriginY) +/********************************************************************* +* CheckAndCodeDeltaQp +* Check the conditions and codes the change in the QP indicated by delta QP +* +* cabacEncContextPtr +* pointer to the CABAC structure passed as input +* +* cuPtr +* input pointer to the coding unit +* +* tuPtr +* input pointer to the transform unit +*********************************************************************/ +EB_ERRORTYPE CheckAndCodeDeltaQp( + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + TransformUnit_t *tuPtr, + EB_BOOL isDeltaQpEnable, + EB_BOOL *isdeltaQpNotCoded) { - EB_ERRORTYPE return_error = EB_ErrorNone; - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EB_ERRORTYPE return_error = EB_ErrorNone; - // CU Varaiables - const CodedUnitStats_t *cuStatsPtr; - CodingUnit_t *cuPtr; - EB_U32 cuIndex = 0; - EB_REFLIST refList; - EB_U32 maxRefList; - EB_U32 cuOriginX; - EB_U32 cuOriginY; - EB_U32 cuSize; - EB_U8 cuDepth; - EB_BOOL availableCoeff; - cabacEncodeCtxPtr->colorFormat = pictureControlSetPtr->colorFormat; + if (isDeltaQpEnable) { + if (tuPtr->lumaCbf || tuPtr->cbCbf || tuPtr->crCbf || tuPtr->cbCbf2 || tuPtr->crCbf2){ + if (*isdeltaQpNotCoded){ + EB_S32 deltaQp; + deltaQp = cuPtr->qp - cuPtr->refQp; - // PU Varaiables - PredictionUnit_t *puPtr; - EB_U32 cuQuantizedCoeffsBits; - EB_U32 log2MinCuQpDeltaSize = Log2f(MAX_LCU_SIZE) - pictureControlSetPtr->difCuDeltaQpDepth; + EncodeDeltaQp( + cabacEncodeCtxPtr, + deltaQp); - tbPtr->quantizedCoeffsBits = 0; - EB_BOOL entropyDeltaQpNotCoded = EB_TRUE; - EB_BOOL deltaQpNotCoded = EB_TRUE; - EB_BOOL checkCuOutOfBound = EB_FALSE; - LcuParams_t * lcuParam = &sequenceControlSetPtr->lcuParamsArray[tbPtr->index]; - if (!(lcuParam->isCompleteLcu)){ - checkCuOutOfBound = EB_TRUE; + *isdeltaQpNotCoded = EB_FALSE; + } + } } - do { - EB_BOOL codeCuCond = EB_TRUE; // Code cu only if it is inside the picture - cuPtr = tbPtr->codedLeafArrayPtr[cuIndex]; - if (checkCuOutOfBound) - codeCuCond = (EB_BOOL)lcuParam->rasterScanCuValidity[MD_SCAN_TO_RASTER_SCAN[cuIndex]]; // check if cu is inside the picture + return return_error; +} - if (codeCuCond){ - // CU Stats - cuStatsPtr = GetCodedUnitStats(cuIndex); - cuSize = cuStatsPtr->size; - cuOriginX = lcuOriginX + cuStatsPtr->originX; - cuOriginY = lcuOriginY + cuStatsPtr->originY; - cuDepth = (EB_U8)cuStatsPtr->depth; +/************************************ +******* EncodeCoeff +**************************************/ +static EB_ERRORTYPE EncodeCoeff( + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + TransformUnit_t *tuPtr, + EB_U32 tuSize, + EB_U32 tuOriginX, + EB_U32 tuOriginY, + EbPictureBufferDesc_t *coeffPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; - // Code Split Flag - EncodeSplitFlag( - cabacEncodeCtxPtr, - cuDepth, - pictureControlSetPtr->lcuMaxDepth, - (EB_BOOL)cuPtr->splitFlag, - cuOriginX, - cuOriginY, - modeTypeNeighborArray, - leafDepthNeighborArray); - if (cuStatsPtr->sizeLog2 >= log2MinCuQpDeltaSize){ - deltaQpNotCoded = EB_TRUE; - } - if (((cuStatsPtr->originY & ((1 << log2MinCuQpDeltaSize) - 1)) == 0) && - ((cuStatsPtr->originX & ((1 << log2MinCuQpDeltaSize) - 1)) == 0)){ - deltaQpNotCoded = EB_TRUE; - } + EB_S16 *coeffBuffer; + EB_U32 coeffLocation; + const EB_U16 subWidthCMinus1 = (cabacEncodeCtxPtr->colorFormat == EB_YUV444 ? 1 : 2) - 1; + const EB_U16 subHeightCMinus1 = (cabacEncodeCtxPtr->colorFormat >= EB_YUV422 ? 1 : 2) - 1; + EB_U32 tuChromaSize = (tuSize == 4) ? 4 : (tuSize >> subWidthCMinus1); + coeffLocation = tuOriginX + (tuOriginY * coeffPtr->strideY); + coeffBuffer = (EB_S16*)&coeffPtr->bufferY[coeffLocation * sizeof(EB_S16)]; + + if (tuPtr->lumaCbf) { + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + tuSize, + (EB_MODETYPE)cuPtr->predictionModeFlag, + (&cuPtr->predictionUnitArray[0])->intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideY, + COMPONENT_LUMA, + tuPtr);//tuPtr->nzCoefCount[0]); + } - if (cuPtr->splitFlag == EB_FALSE){ - if (cuPtr->predictionModeFlag == INTRA_MODE && - cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4) { - availableCoeff = ( - cuPtr->transformUnitArray[1].lumaCbf || - cuPtr->transformUnitArray[2].lumaCbf || - cuPtr->transformUnitArray[3].lumaCbf || - cuPtr->transformUnitArray[4].lumaCbf || - cuPtr->transformUnitArray[1].crCbf || - cuPtr->transformUnitArray[1].cbCbf || - cuPtr->transformUnitArray[2].crCbf || - cuPtr->transformUnitArray[2].cbCbf || - cuPtr->transformUnitArray[3].crCbf || - cuPtr->transformUnitArray[3].cbCbf || - cuPtr->transformUnitArray[4].crCbf || // 422 case will use 3rd 4x4 for the 2nd chroma - cuPtr->transformUnitArray[4].cbCbf) ? EB_TRUE : EB_FALSE; - } else { - availableCoeff = (cuPtr->predictionModeFlag == INTER_MODE) ? (EB_BOOL)cuPtr->rootCbf : - (cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].lumaCbf || - cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].crCbf || - cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].crCbf2 || - cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].cbCbf || - cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].cbCbf2) ? EB_TRUE : EB_FALSE; - } + // Chroma case when cusize 8x8 and tudepth == 1 OR 16x16 and tudepth == 2 + //tuOriginX = (cuPtr->size == MIN_CU_SIZE ) || ( (cuPtr->size == 16 ) && ((Log2f(cuPtr->size) - tuSizeLog2) == 2))? tuPtr->tuNode->originX: tuOriginX; + //tuOriginY = (cuPtr->size == MIN_CU_SIZE ) || ( (cuPtr->size == 16 ) && ((Log2f(cuPtr->size) - tuSizeLog2) == 2))? tuPtr->tuNode->originY: tuOriginY; - EntropyCodingUpdateQp( - cuPtr, - availableCoeff, - cuOriginX, - cuOriginY, - cuSize, - sequenceControlSetPtr->lcuSize, - sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction || sequenceControlSetPtr->staticConfig.segmentOvEnabled ? EB_TRUE : EB_FALSE, - &entropyDeltaQpNotCoded, - pictureControlSetPtr->difCuDeltaQpDepth, - &pictureControlSetPtr->prevCodedQp[tileIdx], - &pictureControlSetPtr->prevQuantGroupCodedQp[tileIdx], - tbPtr->qp, - pictureControlSetPtr, - pictureOriginX, - pictureOriginY); + // cb + coeffLocation = (tuOriginX >> subWidthCMinus1) + ((tuOriginY * coeffPtr->strideCb) >> subHeightCMinus1); + coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[coeffLocation * sizeof(EB_S16)]; - // Assign DLF QP - entropySetQpArrayBasedOnCU( - pictureControlSetPtr, - cuOriginX, - cuOriginY, - cuSize, - cuSize, - cuPtr->qp); + if (tuSize > 4){ + if (tuPtr->cbCbf) { + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + tuChromaSize, + (EB_MODETYPE)cuPtr->predictionModeFlag, + (&cuPtr->predictionUnitArray[0])->intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideCb, + COMPONENT_CHROMA_CB, + tuPtr);//tuPtr->nzCoefCount[1]); + } - // Code the skip flag - if (pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) - { - EncodeSkipFlag( - cabacEncodeCtxPtr, - (EB_BOOL)cuPtr->skipFlag, - cuOriginX, - cuOriginY, - modeTypeNeighborArray, - skipFlagNeighborArray); - } + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && tuPtr->cbCbf2) { + coeffLocation = (tuOriginX >> 1) + ((tuOriginY+tuChromaSize) * coeffPtr->strideCb); + coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[coeffLocation * sizeof(EB_S16)]; + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + tuChromaSize, + (EB_MODETYPE)cuPtr->predictionModeFlag, + (&cuPtr->predictionUnitArray[0])->intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer,// Jing: check here + coeffPtr->strideCb, + COMPONENT_CHROMA_CB2, + tuPtr);//tuPtr->nzCoefCount[1]); + } + } else if (tuPtr->tuIndex - ((tuPtr->tuIndex >> 2) << 2) == 0) { + // Never be here + if (tuPtr->cbCbf) { + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + tuChromaSize, + (EB_MODETYPE)cuPtr->predictionModeFlag, + (&cuPtr->predictionUnitArray[0])->intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideCb, + COMPONENT_CHROMA_CB, + tuPtr);//tuPtr->nzCoefCount[1]); - if (cuPtr->skipFlag) - { - // Merge Index - EncodeMergeIndex( - cabacEncodeCtxPtr, - &cuPtr->predictionUnitArray[0]); - } - else - { - // Code CU pred mode (I, P, B, etc.) - // (not needed for Intra Slice) - if (pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) - { - EncodePredictionMode( - cabacEncodeCtxPtr, - cuPtr); - } + } + } - switch (cuPtr->predictionModeFlag) { - case INTRA_MODE: - if (cuPtr->predictionModeFlag == INTRA_MODE && - cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4) { - // Code Partition Size - EncodeIntra4x4PartitionSize( - cabacEncodeCtxPtr, - cuPtr, - pictureControlSetPtr->lcuMaxDepth); + // cr + coeffLocation = (tuOriginX >> subWidthCMinus1) + ((tuOriginY * coeffPtr->strideCr) >> subHeightCMinus1); + coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[coeffLocation * sizeof(EB_S16)]; - // Get the PU Ptr - puPtr = cuPtr->predictionUnitArray; + if (tuSize > 4){ + if (tuPtr->crCbf) { + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + tuChromaSize, + (EB_MODETYPE)cuPtr->predictionModeFlag, + (&cuPtr->predictionUnitArray[0])->intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideCr, + COMPONENT_CHROMA_CR, + tuPtr);//tuPtr->nzCoefCount[2]); + } + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && tuPtr->crCbf2) { + coeffLocation = (tuOriginX >> 1) + ((tuOriginY+tuChromaSize) * coeffPtr->strideCr); + coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[coeffLocation * sizeof(EB_S16)]; + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + tuChromaSize, + (EB_MODETYPE)cuPtr->predictionModeFlag, + (&cuPtr->predictionUnitArray[0])->intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideCr, + COMPONENT_CHROMA_CR2, + tuPtr);//tuPtr->nzCoefCount[2]); + } + } + else if (tuPtr->tuIndex - ((tuPtr->tuIndex >> 2) << 2) == 0) { - EB_U8 partitionIndex; + if (tuPtr->crCbf) { + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + tuChromaSize, + (EB_MODETYPE)cuPtr->predictionModeFlag, + (&cuPtr->predictionUnitArray[0])->intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideCr, + COMPONENT_CHROMA_CR, + tuPtr);//tuPtr->nzCoefCount[2]); - EB_U8 intraLumaLeftModeArray[4]; - EB_U8 intraLumaTopModeArray[4]; + } + } - EB_U8 intraLumaLeftMode; - EB_U8 intraLumaTopMode; + return return_error; +} - // Partition Loop - for (partitionIndex = 0; partitionIndex < 4; partitionIndex++) { +/************************************ +******* EncodeTuCoeff +**************************************/ +static EB_ERRORTYPE EncodeTuCoeff( + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + const CodedUnitStats_t *cuStatsPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_BOOL isDeltaQpEnable, + EB_BOOL *isdeltaQpNotCoded) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 subDivContext; + EB_U32 cbfContext; + TransformUnit_t *tuPtr; + const TransformUnitStats_t *tuStatsPtr; + EB_U32 tuSize; + EB_U32 tuOriginX; + EB_U32 tuOriginY; + EB_U32 tuIndex; + EB_U32 tuIndexDepth2; + EB_U32 tuSizeDepth2; + + tuPtr = &cuPtr->transformUnitArray[0]; + tuStatsPtr = GetTransformUnitStats(0); + tuSize = cuStatsPtr->size >> tuStatsPtr->depth; + cbfContext = tuPtr->chromaCbfContext; + subDivContext = 5 - Log2f(tuSize); + + if (GetCodedUnitStats(cuPtr->leafIndex)->size != 64) { + // Encode split flag + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->splitFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.transSubDivFlagContextModel[subDivContext])); + } - EB_U8 intraLumaMode = tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuIndex] - 21) << 2) + partitionIndex]; - EB_U8 predictionModeFlag = INTRA_MODE; + if (tuPtr->splitFlag) { + // Jing: only comes here for inter 64x64 - EB_U32 partitionOriginX = cuOriginX + INTRA_4x4_OFFSET_X[partitionIndex]; - EB_U32 partitionOriginY = cuOriginY + INTRA_4x4_OFFSET_Y[partitionIndex]; + // Cb CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (tuPtr->cbCbf | tuPtr->cbCbf2), + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); - // Code Luma Mode for Intra First Stage - EncodeIntraLumaModeFirstStage( - cabacEncodeCtxPtr, - partitionOriginX, - partitionOriginY, - lcuSize, - &intraLumaLeftMode, - &intraLumaTopMode, - intraLumaMode, - modeTypeNeighborArray, - intraLumaModeNeighborArray); + // Cr CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (tuPtr->crCbf | tuPtr->crCbf2), + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + + //for(tuIndex = 1; tuIndex < 5; tuIndex++) { + for (tuIndex = 1; tuIndex < 5; tuIndex ++ ) { + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + tuStatsPtr = GetTransformUnitStats(tuIndex); + tuSize = cuStatsPtr->size >> tuStatsPtr->depth; + + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); + + if (GetCodedUnitStats(cuPtr->leafIndex)->size != 8) { + subDivContext = 5 - Log2f(tuSize); + // Encode split flag + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->splitFlag, + &(cabacEncodeCtxPtr->contextModelEncContext.transSubDivFlagContextModel[subDivContext])); + } - intraLumaLeftModeArray[partitionIndex] = intraLumaLeftMode; - intraLumaTopModeArray[partitionIndex] = intraLumaTopMode; + if (tuPtr->splitFlag) { + // Jing: seems never comes here for now + cbfContext = tuPtr->chromaCbfContext; - NeighborArrayUnitModeWrite( - intraLumaModeNeighborArray, - (EB_U8*)&intraLumaMode, - partitionOriginX, - partitionOriginY, - MIN_PU_SIZE, - MIN_PU_SIZE, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + if (cuPtr->transformUnitArray[0].cbCbf | cuPtr->transformUnitArray[0].cbCbf2) { + // Cb CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - NeighborArrayUnitModeWrite( - modeTypeNeighborArray, - &predictionModeFlag, - partitionOriginX, - partitionOriginY, - MIN_PU_SIZE, - MIN_PU_SIZE, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + if (cuPtr->transformUnitArray[0].crCbf | cuPtr->transformUnitArray[0].crCbf2){ + // Cr CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - } + // Transform depth 2 + //tuIndexDepth2 = tuIndex*4 + 1; + tuIndexDepth2 = tuIndex + 1; - for (partitionIndex = 0; partitionIndex < 4; partitionIndex++) { - EB_U8 intraLumaMode = tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuIndex] - 21) << 2) + partitionIndex]; + tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; + cbfContext = tuPtr->chromaCbfContext; - // Code Luma Mode for Intra Second Stage - EncodeIntraLumaModeSecondStage( - cabacEncodeCtxPtr, - intraLumaLeftModeArray[partitionIndex], - intraLumaTopModeArray[partitionIndex], - intraLumaMode); - } + tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); + tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - // Code Chroma Mode for Intra - for (partitionIndex = 0; - partitionIndex < ((cabacEncodeCtxPtr->colorFormat == EB_YUV444) ? 4 : 1); - partitionIndex++) { - EncodeIntraChromaMode(cabacEncodeCtxPtr); - } + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - // Encode Transform Unit Split & CBFs - Intra4x4EncodeCoeff( - tbPtr, - cabacEncodeCtxPtr, - cuPtr, - cuStatsPtr, - coeffPtr, - &cuQuantizedCoeffsBits, - (EB_BOOL)pictureControlSetPtr->useDeltaQp, - &deltaQpNotCoded); + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - tbPtr->quantizedCoeffsBits += cuQuantizedCoeffsBits; - } else { - // Code Partition Size - EncodePartitionSize( - cabacEncodeCtxPtr, - cuPtr, - pictureControlSetPtr->lcuMaxDepth); + cbfContext = tuPtr->lumaCbfContext; + // Luma CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->lumaCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - EB_U8 intraLumaLeftMode; - EB_U8 intraLumaTopMode; - EB_U8 intraLumaMode; - // Get the PU Ptr - puPtr = cuPtr->predictionUnitArray; - // Code Luma Mode for Intra First Stage - EncodeIntraLumaModeFirstStage( - cabacEncodeCtxPtr, - cuOriginX, - cuOriginY, - lcuSize, - &intraLumaLeftMode, - &intraLumaTopMode, - puPtr->intraLumaMode, - modeTypeNeighborArray, - intraLumaModeNeighborArray); + //EncodeDeltaQp + CheckAndCodeDeltaQp( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); - intraLumaMode = (EB_U8)puPtr->intraLumaMode; + EncodeCoeff( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + tuSizeDepth2, + tuOriginX, + tuOriginY, + coeffPtr); - NeighborArrayUnitModeWrite( - intraLumaModeNeighborArray, - (EB_U8*)&intraLumaMode, - cuOriginX, - cuOriginY, - cuSize, - cuSize, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + tuIndexDepth2++; - { - EB_U8 predictionModeFlag = (EB_U8)cuPtr->predictionModeFlag; - NeighborArrayUnitModeWrite( - modeTypeNeighborArray, - &predictionModeFlag, - cuOriginX, - cuOriginY, - cuSize, - cuSize, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); - } + tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; + cbfContext = tuPtr->chromaCbfContext; - // Get PU Ptr - puPtr = &cuPtr->predictionUnitArray[0]; + tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); + tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - // Code Luma Mode for Intra Second Stage - EncodeIntraLumaModeSecondStage( - cabacEncodeCtxPtr, - intraLumaLeftMode, - intraLumaTopMode, - puPtr->intraLumaMode); + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - // Code Chroma Mode for Intra - EncodeIntraChromaMode( - cabacEncodeCtxPtr); - EncodeTuSplitCoeff( - cabacEncodeCtxPtr, - cuPtr, - cuStatsPtr, - coeffPtr, - &cuQuantizedCoeffsBits, - (EB_BOOL)pictureControlSetPtr->useDeltaQp, - &deltaQpNotCoded); + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - tbPtr->quantizedCoeffsBits += cuQuantizedCoeffsBits; - } - break; + cbfContext = tuPtr->lumaCbfContext; - case INTER_MODE: - { + // Luma CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->lumaCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - // Code Partition Size - EncodePartitionSize( - cabacEncodeCtxPtr, - cuPtr, - pictureControlSetPtr->lcuMaxDepth); + //EncodeDeltaQp + CheckAndCodeDeltaQp( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); - puPtr = cuPtr->predictionUnitArray; - // mv merge Flag - EncodeMergeFlag( - cabacEncodeCtxPtr, - puPtr); + EncodeCoeff( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + tuSizeDepth2, + tuOriginX, + tuOriginY, + coeffPtr); - if (puPtr->mergeFlag) { - // mv merge index - EncodeMergeIndex( - cabacEncodeCtxPtr, - cuPtr->predictionUnitArray); - } - else { - // Inter Prediction Direction - if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ - EncodePredictionDirection( - cabacEncodeCtxPtr, - puPtr, - cuPtr); - } - refList = puPtr->interPredDirectionIndex == UNI_PRED_LIST_1 ? REF_LIST_1 : REF_LIST_0; - maxRefList = (EB_U32)refList + (puPtr->interPredDirectionIndex == BI_PRED ? 2 : 1); - { - EB_U32 refIndex = refList; - for (; (EB_U32)refIndex < maxRefList; ++refIndex){ - // Reference Index - refList = (EB_REFLIST)refIndex; - // Reference Index - EncodeReferencePictureIndex( - cabacEncodeCtxPtr, - refList, - pictureControlSetPtr); + tuIndexDepth2++; + tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; + cbfContext = tuPtr->chromaCbfContext; - // Motion Vector Difference - EncodeMvd( - cabacEncodeCtxPtr, - puPtr, - refList); + tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); + tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); - // Motion Vector Prediction Index - EncodeMvpIndex( - cabacEncodeCtxPtr, - puPtr, - refList); - } - } - } - } + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - // Encode Transform Unit Split & CBFs - EncodeTuSplitCoeff( - cabacEncodeCtxPtr, - cuPtr, - cuStatsPtr, - coeffPtr, - &cuQuantizedCoeffsBits, - (EB_BOOL)pictureControlSetPtr->useDeltaQp, - &deltaQpNotCoded); + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - tbPtr->quantizedCoeffsBits += cuQuantizedCoeffsBits; + cbfContext = tuPtr->lumaCbfContext; + // Luma CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->lumaCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); - break; - default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR3); - break; - } + //EncodeDeltaQp + CheckAndCodeDeltaQp( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); + + EncodeCoeff( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + tuSizeDepth2, + tuOriginX, + tuOriginY, + coeffPtr); + + + tuIndexDepth2++; + + tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; + cbfContext = tuPtr->chromaCbfContext; + + tuStatsPtr = GetTransformUnitStats(tuIndexDepth2); + tuSizeDepth2 = cuStatsPtr->size >> tuStatsPtr->depth; + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); + + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); } - // Update the Leaf Depth Neighbor Array - NeighborArrayUnitModeWrite( - leafDepthNeighborArray, - &cuDepth, - cuOriginX, - cuOriginY, - cuSize, - cuSize, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } - // Update the Mode Type Neighbor Array - { - EB_U8 predictionModeFlag = (EB_U8)cuPtr->predictionModeFlag; - NeighborArrayUnitModeWrite( - modeTypeNeighborArray, - &predictionModeFlag, - cuOriginX, - cuOriginY, - cuSize, - cuSize, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + cbfContext = tuPtr->lumaCbfContext; + // Luma CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->lumaCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); + + + //EncodeDeltaQp + CheckAndCodeDeltaQp( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); + + EncodeCoeff( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + tuSizeDepth2, + tuOriginX, + tuOriginY, + coeffPtr); + + } + else { + + cbfContext = tuPtr->chromaCbfContext; + + // Cb CBF + if (cuPtr->transformUnitArray[0].cbCbf | cuPtr->transformUnitArray[0].cbCbf2) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf2, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } } - // Update the Skip Flag Neighbor Array - { - EB_U8 skipFlag = (EB_U8)cuPtr->skipFlag; - NeighborArrayUnitModeWrite( - skipFlagNeighborArray, - (EB_U8*)&skipFlag, - cuOriginX, - cuOriginY, - cuSize, - cuSize, - NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + // Cr CBF + if (cuPtr->transformUnitArray[0].crCbf | cuPtr->transformUnitArray[0].crCbf2) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf2, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } } - } - if (cuPtr->splitFlag == EB_FALSE) - cuIndex += DepthOffset[cuDepth]; - else - ++cuIndex; + cbfContext = tuPtr->lumaCbfContext; + + // Luma CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->lumaCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); + + + //EncodeDeltaQp + + CheckAndCodeDeltaQp( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); + + EncodeCoeff( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + tuSize, + tuOriginX, + tuOriginY, + coeffPtr); + + } + } + + } + else { + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); + + // Cb CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf2, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } + + // Cr CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf2, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } + // Luma CBF + + // In the Inter case, if the RootCbf is 1 and the Chroma Cbfs are 0, then we can infer that the + // luma Cbf is true, so there is no need to code it. + if ((cuPtr->predictionModeFlag == INTRA_MODE) || tuPtr->cbCbf || tuPtr->crCbf || + (cabacEncodeCtxPtr->colorFormat == EB_YUV422 && (tuPtr->cbCbf2 || tuPtr->crCbf2))) { + + //cbfContext = ((cuPtr->size == tuPtr->size) || (tuPtr->size == TRANSFORM_MAX_SIZE)); + cbfContext = tuPtr->lumaCbfContext; + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->lumaCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); + } + + //EncodeDeltaQp + CheckAndCodeDeltaQp( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); + + EncodeCoeff( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + tuSize, + tuOriginX, + tuOriginY, + coeffPtr); + + } + + return return_error; +} + +/********************************************************************* +* EncodeTuSplitCoeff +* Encodes the TU split flags and coded block flags +* +* cabacEncContextPtr +* pointer to the CABAC structure passed as input +* +* puPtr +* input pointer to the prediction unit +*********************************************************************/ +static EB_ERRORTYPE EncodeTuSplitCoeff( + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + const CodedUnitStats_t *cuStatsPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_U32 *cuQuantizedCoeffsBits, + EB_BOOL isDeltaQpEnable, + EB_BOOL *isdeltaQpNotCoded) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 rootCbf; + + //rate Control + EB_U32 writtenBitsBeforeQuantizedCoeff; + EB_U32 writtenBitsAfterQuantizedCoeff; + + //store the number of written bits before coding quantized coeffs (flush is not called yet): + // The total number of bits is + // number of written bits + // + 32 - bits remaining in interval Low Value + // + number of buffered byte * 8 + writtenBitsBeforeQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + + 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + + (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); + // Root CBF + rootCbf = cuPtr->rootCbf; + if (cuPtr->predictionModeFlag != INTRA_MODE && + !((&cuPtr->predictionUnitArray[0])->mergeFlag)) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + rootCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.rootCbfContextModel[0])); + } + + if ((cuPtr->predictionModeFlag == INTRA_MODE) || + ((cuPtr->predictionModeFlag == INTER_MODE) && (rootCbf > 0))) { + EncodeTuCoeff( + cabacEncodeCtxPtr, + cuPtr, + cuStatsPtr, + coeffPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); + } + + //store the number of written bits after coding quantized coeffs (flush is not called yet): + // The total number of bits is + // number of written bits + // + 32 - bits remaining in interval Low Value + // + number of buffered byte * 8 + writtenBitsAfterQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + + 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + + (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); + + *cuQuantizedCoeffsBits = writtenBitsAfterQuantizedCoeff - writtenBitsBeforeQuantizedCoeff; + + + return return_error; +} + +/************************************************** +* ConvertToSigned32 +**************************************************/ +inline static EB_U32 ConvertToSigned32( + EB_S32 signedNum) +{ + return (signedNum <= 0) ? -signedNum << 1 : (signedNum << 1) - 1; +} + +/************************************************** +* WriteCodeCavlc +**************************************************/ +inline static void WriteCodeCavlc( + OutputBitstreamUnit_t *bitstreamPtr, + EB_U32 bits, + EB_U32 numberOfBits) +{ + OutputBitstreamWrite( + bitstreamPtr, + bits, + numberOfBits); +} + + +/************************************************** +* WriteUvlc +**************************************************/ +static void WriteUvlc( + OutputBitstreamUnit_t *bitstreamPtr, + EB_U32 bits) +{ + EB_U32 numberOfBits = 1; + EB_U32 tempBits = ++bits; + + while (tempBits > 1) + { + tempBits >>= 1; + numberOfBits += 2; + } + + if(numberOfBits<32) { + OutputBitstreamWrite( + bitstreamPtr, + bits, + numberOfBits); + } else + { + OutputBitstreamWrite( + bitstreamPtr, + 0, + numberOfBits>>1); + OutputBitstreamWrite( + bitstreamPtr, + bits, + (numberOfBits+1)>>1); + } +} + +/************************************************** +* WriteSvlc +**************************************************/ +inline static void WriteSvlc( + OutputBitstreamUnit_t *bitstreamPtr, + EB_S32 signedBits) +{ + EB_U32 bits; + + bits = ConvertToSigned32(signedBits); + WriteUvlc( + bitstreamPtr, + bits); + +} + +/************************************************** +* WriteFlagCavlc +**************************************************/ +inline static void WriteFlagCavlc( + OutputBitstreamUnit_t *bitstreamPtr, + EB_U32 bits) +{ + OutputBitstreamWrite( + bitstreamPtr, + bits, + 1); +} + +static void CodeNALUnitHeader( + OutputBitstreamUnit_t *bitstreamPtr, + NalUnitType eNalUnitType, + unsigned int TemporalId) +{ + bitstreamPtr->sliceLocation[bitstreamPtr->sliceNum++] = (bitstreamPtr->writtenBitsCount >> 3); + + // Write Start Code + WriteCodeCavlc( + bitstreamPtr, + 1, + 32); + + //bsNALUHeader.write(0,1); // forbidden_zero_bit + //bsNALUHeader.write(nalu.m_nalUnitType, 6); // nal_unit_type + //bsNALUHeader.write(0, 6); // nuh_reserved_zero_6bits + //bsNALUHeader.write(nalu.m_temporalId+1, 3); // nuh_temporal_id_plus1 + + WriteCodeCavlc(bitstreamPtr, 0, 1); // forbidden_zero_bit + WriteCodeCavlc(bitstreamPtr, eNalUnitType, 6); // nal_unit_type + WriteCodeCavlc(bitstreamPtr, 0, 6); // nuh_reserved_zero_6bits + WriteCodeCavlc(bitstreamPtr, TemporalId + 1, 3); // nuh_temporal_id_plus1 + +} +/************************************************** +* CodeShortTermRPS +* Note - A value of -1 used for numberOfNegativeReferences +* denotes that the default value should be used. +**************************************************/ +static void CodeShortTermRPS( + OutputBitstreamUnit_t *bitstreamPtr, + PredictionStructureEntry_t *predStructEntryPtr, + EB_U32 numberOfNegativeReferences, + EB_U32 numberOfPositiveReferences, + EB_U32 rpsCurrentIndex, + EB_BOOL openGopCraFlag) +{ + // difference between poc value of current picture and the picture used for inter prediction + //EB_S32 deltaPocRps; + EB_U32 rpsSyntaxIndex; + EB_BOOL usedByCurrFlag; + + if (rpsCurrentIndex > 0) { + + // "inter_ref_pic_set_prediction_flag" + WriteFlagCavlc( + bitstreamPtr, + predStructEntryPtr->interRpsPredictionFlag); + } + + { + // Update Number of Negative and Positive References + + numberOfNegativeReferences = (numberOfNegativeReferences == RPS_DEFAULT_VALUE || numberOfNegativeReferences > predStructEntryPtr->negativeRefPicsTotalCount) ? + predStructEntryPtr->negativeRefPicsTotalCount : + numberOfNegativeReferences; + numberOfPositiveReferences = (numberOfPositiveReferences == RPS_DEFAULT_VALUE || numberOfPositiveReferences > predStructEntryPtr->positiveRefPicsTotalCount) ? + predStructEntryPtr->positiveRefPicsTotalCount : + numberOfPositiveReferences; + + // "num_negative_pics" + WriteUvlc( + bitstreamPtr, + numberOfNegativeReferences); + + // "num_positive_pics" + WriteUvlc( + bitstreamPtr, + numberOfPositiveReferences); + + for (rpsSyntaxIndex = 0; rpsSyntaxIndex < numberOfNegativeReferences; ++rpsSyntaxIndex) { + + //"delta_poc_s0_minus1" + WriteUvlc( + bitstreamPtr, + predStructEntryPtr->deltaNegativeGopPosMinus1[rpsSyntaxIndex]); + + usedByCurrFlag = (openGopCraFlag == EB_TRUE) ? + EB_FALSE : + predStructEntryPtr->usedByNegativeCurrPicFlag[rpsSyntaxIndex]; + + // "used_by_curr_pic_s0_flag" + WriteFlagCavlc( + bitstreamPtr, + usedByCurrFlag); + } + + for (rpsSyntaxIndex = 0; rpsSyntaxIndex < numberOfPositiveReferences; ++rpsSyntaxIndex) { + + // "delta_poc_s0_minus1" + WriteUvlc( + bitstreamPtr, + predStructEntryPtr->deltaPositiveGopPosMinus1[rpsSyntaxIndex]); + + // "used_by_curr_pic_s0_flag" + WriteFlagCavlc( + bitstreamPtr, + predStructEntryPtr->usedByPositiveCurrPicFlag[rpsSyntaxIndex]); + } + } + + return; +} + +/************************************************** +* CodeProfileTier +**************************************************/ +static void CodeProfileTier( + OutputBitstreamUnit_t *bitstreamPtr, + SequenceControlSet_t *scsPtr) +{ + EB_U32 index; + + // "XXX_profile_space[]" + WriteCodeCavlc( + bitstreamPtr, + 0, + 2); + + //"XXX_tier_flag[]" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->tierIdc); + + // "XXX_profile_idc[]" + WriteCodeCavlc( + bitstreamPtr, + scsPtr->profileIdc, + 5); + + // "XXX_profile_compatibility_flag[][j]" + for (index = 0; index < 32; index++) { + + // "XXX_profile_compatibility_flag[][j]" + WriteFlagCavlc( + bitstreamPtr, + (EB_U32)(index == scsPtr->profileIdc)); + } + + // "general_progressive_source_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->generalProgressiveSourceFlag); + + // "general_interlaced_source_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->generalInterlacedSourceFlag); + + // "general_non_packed_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "general_frame_only_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->generalFrameOnlyConstraintFlag); + + if(scsPtr->profileIdc < 4) + { + // "XXX_reserved_zero_44bits[0..15]" + WriteCodeCavlc( + bitstreamPtr, + 0, + 16); + } else + { + // "general_max_12bit_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + (scsPtr->encoderBitDepth <= EB_12BIT)); + + // "general_max_10bit_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + (scsPtr->encoderBitDepth <= EB_10BIT)); + + // "general_max_8bit_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + (scsPtr->encoderBitDepth <= EB_8BIT)); + + // "general_max_422chroma_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + (scsPtr->chromaFormatIdc <= EB_YUV422)); + + // "general_max_420chroma_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + (scsPtr->chromaFormatIdc <= EB_YUV420)); + + // "general_max_monochrome_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + (scsPtr->chromaFormatIdc <= EB_YUV400)); + + // "general_intra_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + (scsPtr->intraPeriodLength == 0)); + + // "general_one_picture_only_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "general_lower_bit_rate_constraint_flag" + WriteFlagCavlc( + bitstreamPtr, + 1); + + // "XXX_reserved_zero_44bits[9..15]" + WriteCodeCavlc( + bitstreamPtr, + 0, + 7); + } + + // "XXX_reserved_zero_44bits[16..31]" + WriteCodeCavlc( + bitstreamPtr, + 0, + 16); + + // "XXX_reserved_zero_44bits[32..43]" + WriteCodeCavlc( + bitstreamPtr, + 0, + 12); + + return; +} +/************************************************** +* ComputeProfileTierLevelInfo +**************************************************/ +EB_ERRORTYPE ComputeProfileTierLevelInfo( + SequenceControlSet_t *scsPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + // Profile, level, tier calculation + + EB_U64 lumaPictureSize; + EB_U64 lumaWidthSquare; + EB_U64 lumaHeightSquare; + EB_U64 lumaSampleRate; + + lumaWidthSquare = scsPtr->lumaWidth* scsPtr->lumaWidth; + lumaHeightSquare = scsPtr->lumaHeight* scsPtr->lumaHeight; + lumaPictureSize = (((scsPtr->lumaWidth + (MAX_LCU_SIZE - 1)) >> MAX_LOG2_LCU_SIZE) << MAX_LOG2_LCU_SIZE) * (((scsPtr->lumaHeight + (MAX_LCU_SIZE - 1)) >> MAX_LOG2_LCU_SIZE) << MAX_LOG2_LCU_SIZE); + lumaSampleRate = (lumaPictureSize*scsPtr->frameRate) >> 16; + + // profile calculation + // profile is obatined from config file (needs to be modified later) + scsPtr->profileIdc = scsPtr->staticConfig.profile; + + + if (scsPtr->staticConfig.rateControlMode == 0){ + // level calculation + if ((lumaSampleRate <= maxLumaSampleRate[0]) && (lumaPictureSize <= maxLumaPictureSize[0]) && (lumaWidthSquare <= maxLumaPictureSize[0] * 8) && (lumaHeightSquare <= maxLumaPictureSize[0] * 8)) + scsPtr->levelIdc = 30; //1*30 + else if ((lumaSampleRate <= maxLumaSampleRate[1]) && (lumaPictureSize <= maxLumaPictureSize[1]) && (lumaWidthSquare <= maxLumaPictureSize[1] * 8) && (lumaHeightSquare <= maxLumaPictureSize[1] * 8)) + scsPtr->levelIdc = 60;//2*30 + else if ((lumaSampleRate <= maxLumaSampleRate[2]) && (lumaPictureSize <= maxLumaPictureSize[2]) && (lumaWidthSquare <= maxLumaPictureSize[2] * 8) && (lumaHeightSquare <= maxLumaPictureSize[2] * 8)) + scsPtr->levelIdc = 63;//2.1*30 + else if ((lumaSampleRate <= maxLumaSampleRate[3]) && (lumaPictureSize <= maxLumaPictureSize[3]) && (lumaWidthSquare <= maxLumaPictureSize[3] * 8) && (lumaHeightSquare <= maxLumaPictureSize[3] * 8)) + scsPtr->levelIdc = 90;//3*30 + else if ((lumaSampleRate <= maxLumaSampleRate[4]) && (lumaPictureSize <= maxLumaPictureSize[4]) && (lumaWidthSquare <= maxLumaPictureSize[4] * 8) && (lumaHeightSquare <= maxLumaPictureSize[4] * 8)) + scsPtr->levelIdc = 93;//3.1*30 + else if ((lumaSampleRate <= maxLumaSampleRate[5]) && (lumaPictureSize <= maxLumaPictureSize[5]) && (lumaWidthSquare <= maxLumaPictureSize[5] * 8) && (lumaHeightSquare <= maxLumaPictureSize[5] * 8)) + scsPtr->levelIdc = 120;//4*30 + else if ((lumaSampleRate <= maxLumaSampleRate[6]) && (lumaPictureSize <= maxLumaPictureSize[6]) && (lumaWidthSquare <= maxLumaPictureSize[6] * 8) && (lumaHeightSquare <= maxLumaPictureSize[6] * 8)) + scsPtr->levelIdc = 123;//4.1*30 + else if ((lumaSampleRate <= maxLumaSampleRate[7]) && (lumaPictureSize <= maxLumaPictureSize[7]) && (lumaWidthSquare <= maxLumaPictureSize[7] * 8) && (lumaHeightSquare <= maxLumaPictureSize[7] * 8)) + scsPtr->levelIdc = 150;//5*30 + else if ((lumaSampleRate <= maxLumaSampleRate[8]) && (lumaPictureSize <= maxLumaPictureSize[8]) && (lumaWidthSquare <= maxLumaPictureSize[8] * 8) && (lumaHeightSquare <= maxLumaPictureSize[8] * 8)) + scsPtr->levelIdc = 153;//5.1*30 + else if ((lumaSampleRate <= maxLumaSampleRate[9]) && (lumaPictureSize <= maxLumaPictureSize[9]) && (lumaWidthSquare <= maxLumaPictureSize[9] * 8) && (lumaHeightSquare <= maxLumaPictureSize[9] * 8)) + scsPtr->levelIdc = 156;//5.2*30 + else if ((lumaSampleRate <= maxLumaSampleRate[10]) && (lumaPictureSize <= maxLumaPictureSize[10]) && (lumaWidthSquare <= maxLumaPictureSize[10] * 8) && (lumaHeightSquare <= maxLumaPictureSize[10] * 8)) + scsPtr->levelIdc = 180;//6*30 + else if ((lumaSampleRate <= maxLumaSampleRate[11]) && (lumaPictureSize <= maxLumaPictureSize[11]) && (lumaWidthSquare <= maxLumaPictureSize[11] * 8) && (lumaHeightSquare <= maxLumaPictureSize[11] * 8)) + scsPtr->levelIdc = 183;//6.1*30 + else if ((lumaSampleRate <= maxLumaSampleRate[12]) && (lumaPictureSize <= maxLumaPictureSize[12]) && (lumaWidthSquare <= maxLumaPictureSize[12] * 8) && (lumaHeightSquare <= maxLumaPictureSize[12] * 8)) + scsPtr->levelIdc = 186;///6.2*30 + + // Tier calculation + // tier is hardcoded to 0 + scsPtr->tierIdc = 0; + } + else{ + // level calculation + if ((lumaSampleRate <= maxLumaSampleRate[0]) && (lumaPictureSize <= maxLumaPictureSize[0]) && (lumaWidthSquare <= maxLumaPictureSize[0] * 8) && (lumaHeightSquare <= maxLumaPictureSize[0] * 8) + && ((scsPtr->staticConfig.targetBitRate*2) <= highTierMaxBitrate[0]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[0])){ + scsPtr->levelIdc = 30; //1*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[0]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[0])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[1]) && (lumaPictureSize <= maxLumaPictureSize[1]) && (lumaWidthSquare <= maxLumaPictureSize[1] * 8) && (lumaHeightSquare <= maxLumaPictureSize[1] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[1]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[1])){ + scsPtr->levelIdc = 60;//2*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[1]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[1])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[2]) && (lumaPictureSize <= maxLumaPictureSize[2]) && (lumaWidthSquare <= maxLumaPictureSize[2] * 8) && (lumaHeightSquare <= maxLumaPictureSize[2] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[2]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[2])){ + scsPtr->levelIdc = 63;//2.1*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[2]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[2])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[3]) && (lumaPictureSize <= maxLumaPictureSize[3]) && (lumaWidthSquare <= maxLumaPictureSize[3] * 8) && (lumaHeightSquare <= maxLumaPictureSize[3] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[3]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[3])){ + scsPtr->levelIdc = 90;//3*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[3]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[3])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[4]) && (lumaPictureSize <= maxLumaPictureSize[4]) && (lumaWidthSquare <= maxLumaPictureSize[4] * 8) && (lumaHeightSquare <= maxLumaPictureSize[4] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[4]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[4])){ + scsPtr->levelIdc = 93;//3.1*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[4]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[4])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[5]) && (lumaPictureSize <= maxLumaPictureSize[5]) && (lumaWidthSquare <= maxLumaPictureSize[5] * 8) && (lumaHeightSquare <= maxLumaPictureSize[5] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[5]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[5])){ + scsPtr->levelIdc = 120;//4*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[5]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[5])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[6]) && (lumaPictureSize <= maxLumaPictureSize[6]) && (lumaWidthSquare <= maxLumaPictureSize[6] * 8) && (lumaHeightSquare <= maxLumaPictureSize[6] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[6]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[6])){ + scsPtr->levelIdc = 123;//4.1*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[6]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[6])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[7]) && (lumaPictureSize <= maxLumaPictureSize[7]) && (lumaWidthSquare <= maxLumaPictureSize[7] * 8) && (lumaHeightSquare <= maxLumaPictureSize[7] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[7]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[7])){ + scsPtr->levelIdc = 150;//5*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[7]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[7])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[8]) && (lumaPictureSize <= maxLumaPictureSize[8]) && (lumaWidthSquare <= maxLumaPictureSize[8] * 8) && (lumaHeightSquare <= maxLumaPictureSize[8] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[8]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[8])){ + scsPtr->levelIdc = 153;//5.1*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[8]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[8])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[9]) && (lumaPictureSize <= maxLumaPictureSize[9]) && (lumaWidthSquare <= maxLumaPictureSize[9] * 8) && (lumaHeightSquare <= maxLumaPictureSize[9] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[9]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[9])){ + scsPtr->levelIdc = 156;//5.2*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[9]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[9])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[10]) && (lumaPictureSize <= maxLumaPictureSize[10]) && (lumaWidthSquare <= maxLumaPictureSize[10] * 8) && (lumaHeightSquare <= maxLumaPictureSize[10] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[10]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[10])){ + scsPtr->levelIdc = 180;//6*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[10]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[10])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[11]) && (lumaPictureSize <= maxLumaPictureSize[11]) && (lumaWidthSquare <= maxLumaPictureSize[11] * 8) && (lumaHeightSquare <= maxLumaPictureSize[11] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[11]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[11])){ + scsPtr->levelIdc = 183;//6.1*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[11]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[11])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + else if ((lumaSampleRate <= maxLumaSampleRate[12]) && (lumaPictureSize <= maxLumaPictureSize[12]) && (lumaWidthSquare <= maxLumaPictureSize[12] * 8) && (lumaHeightSquare <= maxLumaPictureSize[12] * 8) + && ((scsPtr->staticConfig.targetBitRate * 2) <= highTierMaxBitrate[12]) && ((scsPtr->staticConfig.targetBitRate * 3) <= highTierMaxCPBsize[12])){ + scsPtr->levelIdc = 186;///6.2*30 + + if (((scsPtr->staticConfig.targetBitRate * 2) <= mainTierMaxBitrate[12]) && ((scsPtr->staticConfig.targetBitRate * 3) <= mainTierMaxCPBsize[12])) + scsPtr->tierIdc = 0; + else + scsPtr->tierIdc = 1; + } + + } + + if(scsPtr->staticConfig.tileColumnCount > 1 || scsPtr->staticConfig.tileRowCount > 1) { + unsigned int levelIdx = 0; + const unsigned int general_level_idc[13] = {30, 60, 63, 90, 93, 120, 123, 150, 153, 156, 180, 183, 186}; + while (scsPtr->levelIdc != general_level_idc[levelIdx]) levelIdx++; + while(scsPtr->staticConfig.tileColumnCount > maxTileColumn[levelIdx] || scsPtr->staticConfig.tileRowCount > maxTileRow[levelIdx]) levelIdx++; + if (levelIdx>12) { + return_error = EB_ErrorBadParameter; + return return_error; + } + scsPtr->levelIdc = general_level_idc[levelIdx]; + } + + // Use Level and Tier info if set in config + if (scsPtr->staticConfig.level != 0) { + scsPtr->levelIdc = scsPtr->staticConfig.level * 3; + } + // This needs to be modified later + scsPtr->tierIdc = scsPtr->staticConfig.tier; + + return return_error; +} +/************************************************** +* ComputeMaxDpbBuffer +**************************************************/ +EB_ERRORTYPE ComputeMaxDpbBuffer( + SequenceControlSet_t *scsPtr){ + + EB_U64 maxLumaPicSize = 0, frameSize = (scsPtr->lumaWidth * scsPtr->lumaHeight); + EB_ERRORTYPE return_error = EB_ErrorNone; + + switch (scsPtr->levelIdc){ + case 30: + maxLumaPicSize = maxLumaPictureSize[0]; + break; + case 60: + maxLumaPicSize = maxLumaPictureSize[1]; + break; + case 63: + maxLumaPicSize = maxLumaPictureSize[2]; + break; + case 90: + maxLumaPicSize = maxLumaPictureSize[3]; + break; + case 93: + maxLumaPicSize = maxLumaPictureSize[4]; + break; + case 120: + maxLumaPicSize = maxLumaPictureSize[5]; + break; + case 123: + maxLumaPicSize = maxLumaPictureSize[6]; + break; + case 150: + maxLumaPicSize = maxLumaPictureSize[7]; + break; + case 153: + maxLumaPicSize = maxLumaPictureSize[8]; + break; + case 156: + maxLumaPicSize = maxLumaPictureSize[9]; + break; + case 180: + maxLumaPicSize = maxLumaPictureSize[10]; + break; + case 183: + maxLumaPicSize = maxLumaPictureSize[11]; + break; + case 186: + maxLumaPicSize = maxLumaPictureSize[12]; + break; + default: + CHECK_REPORT_ERROR_NC(scsPtr->encodeContextPtr->appCallbackPtr, EB_ENC_EC_ERROR26) + break; + } + + if (frameSize <= maxLumaPicSize >> 2) + scsPtr->maxDpbSize = 16; // MaxDpbSize = Min( 4 * maxDpbPicBuf, 16 ) \ maxDpbPicBuf = 6 + else if (frameSize <= maxLumaPicSize >> 1) + scsPtr->maxDpbSize = 12; // MaxDpbSize = Min( 2 * maxDpbPicBuf, 16 ) \ maxDpbPicBuf = 6 + else if (frameSize <= (3 * maxLumaPicSize) >> 2) + scsPtr->maxDpbSize = 8; // MaxDpbSize = Min( ( 4 * maxDpbPicBuf ) / 3, 16 ) \ maxDpbPicBuf = 6 + else + scsPtr->maxDpbSize = 6; // MaxDpbSize = maxDpbPicBuf \ maxDpbPicBuf = 6 + + return return_error; +} +/************************************************** +* CodeProfileTierLevel +**************************************************/ +static void CodeProfileTierLevel( + OutputBitstreamUnit_t *bitstreamPtr, + SequenceControlSet_t *scsPtr, + EB_BOOL profilePresentFlag, + EB_U32 maxSubLayersMinus1) +{ + EB_U32 index; + + if (profilePresentFlag) { + CodeProfileTier(bitstreamPtr, scsPtr); // general profile tier + } + + //"general_level_idc" + WriteCodeCavlc( + bitstreamPtr, + scsPtr->levelIdc, + 8); + + for (index = 0; index < maxSubLayersMinus1; index++) { + if (profilePresentFlag) { + // sub_layer_profile_present_flag[i] + WriteFlagCavlc( + bitstreamPtr, + 0); + } + //sub_layer_level_present_flag[i] + WriteFlagCavlc( + bitstreamPtr, + 0); + } + + if (maxSubLayersMinus1 > 0) { + for (index = maxSubLayersMinus1; index < 8; index++) { + // reserved_zero_2bits + WriteCodeCavlc( + bitstreamPtr, + 0, + 2); + } + } + + return; +} + +/************************************************** +* CodeVPS +**************************************************/ +static void CodeVPS( + OutputBitstreamUnit_t *bitstreamPtr, + SequenceControlSet_t *scsPtr) +{ + + EB_U32 temporalLayersMinus1 = scsPtr->staticConfig.enableTemporalId ? scsPtr->maxTemporalLayers + : 0; + + // uiFirstByte + //codeNALUnitHeader( NAL_UNIT_SPS, NAL_REF_IDC_PRIORITY_HIGHEST ); + CodeNALUnitHeader( + bitstreamPtr, + NAL_UNIT_VPS, + 0); + + // Note: This function is currently hard coded, needs to have a proper structure + + // "vps_video_parameter_set_id" + WriteCodeCavlc( + bitstreamPtr, + scsPtr->vpsId, + 4); + + // "vps_reserved_three_2bits" + WriteCodeCavlc( + bitstreamPtr, + 3, + 2); + + // "vps_reserved_zero_6bits" + WriteCodeCavlc( + bitstreamPtr, + 0, + 6); + + // "vps_max_sub_layers_minus1" + WriteCodeCavlc( + bitstreamPtr, + temporalLayersMinus1,//scsPtr->maxTemporalLayers - 1, + 3); + + // "vps_temporal_id_nesting_flag" + WriteFlagCavlc( + bitstreamPtr, + temporalLayersMinus1 == 0 ? 1 : 0); + + // "vps_reserved_ffff_16bits" + WriteCodeCavlc( + bitstreamPtr, + 0xffff, + 16); + + CodeProfileTierLevel( + bitstreamPtr, + scsPtr, + EB_TRUE, + temporalLayersMinus1); + + // "vps_sub_layer_ordering_info_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + { + // Supports Main Profile Level 5 (Max Picture resolution 4Kx2K, up to 6 Hierarchy Levels) + // Max Dec Pic Buffering [i] + WriteUvlc( + bitstreamPtr, + scsPtr->maxDpbSize - 1/*4*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); + + WriteUvlc( + bitstreamPtr, + scsPtr->maxDpbSize - 1/*3*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); + + WriteUvlc( + bitstreamPtr, + 0); + } + + // "vps_max_nuh_reserved_zero_layer_id" + WriteCodeCavlc( + bitstreamPtr, + 0, + 6); + + // "vps_max_op_sets_minus1" + WriteUvlc( + bitstreamPtr, + 0); + + // "vps_timing_info_present_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->staticConfig.fpsInVps == 1 ? EB_TRUE : EB_FALSE); + + if (scsPtr->staticConfig.fpsInVps == 1) { + if (scsPtr->staticConfig.frameRateDenominator != 0 && scsPtr->staticConfig.frameRateNumerator != 0) { + + // vps_num_units_in_tick + WriteCodeCavlc( + bitstreamPtr, + scsPtr->staticConfig.frameRateDenominator, + 32); + + // vps_time_scale + WriteCodeCavlc( + bitstreamPtr, + scsPtr->staticConfig.frameRateNumerator, + 32); + } + else { + // vps_num_units_in_tick + WriteCodeCavlc( + bitstreamPtr, + 1 << 16, + 32); + + // vps_time_scale + WriteCodeCavlc( + bitstreamPtr, + scsPtr->frameRate > 1000 ? scsPtr->frameRate : scsPtr->frameRate << 16, + 32); + } + + // vps_poc_proportional_to_timing_flag + WriteFlagCavlc( + bitstreamPtr, + 0); + + // vps_num_hrd_parameters + WriteUvlc( + bitstreamPtr, + 0); + } + + + // "vps_extension_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + return; + +} +static void CodeHrdParameters( + OutputBitstreamUnit_t *bitstreamPtr, + AppHrdParameters_t *hrdParamterPtr, + EB_BOOL commonInfoPresentFlag, + EB_U32 maxTemporalLayersM1, + EncodeContext_t *encodeContextPtr) +{ + EB_U32 layerIndex; + EB_U32 cpbIndex; + EB_U32 nalOrVclIndex; // 0 --- Nal; 1 --- VCL + + (void)encodeContextPtr; + + if (commonInfoPresentFlag){ + // nal_hrd_parameters_present_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->nalHrdParametersPresentFlag); + + // vcl_hrd_parameters_present_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->vclHrdParametersPresentFlag); + + if (hrdParamterPtr->nalHrdParametersPresentFlag || hrdParamterPtr->vclHrdParametersPresentFlag){ + // sub_pic_cpb_params_present_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->subPicCpbParamsPresentFlag); + + if (hrdParamterPtr->subPicCpbParamsPresentFlag){ + // tick_divisor_minus2 + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->tickDivisorMinus2, + 8); + + // du_cpb_removal_delay_length_minus1 + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->duCpbRemovalDelayLengthMinus1, + 5); + + // sub_pic_cpb_params_in_pic_timing_sei_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->subPicCpbParamsPicTimingSeiFlag); + + // dpb_output_delay_du_length_minus1 + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->dpbOutputDelayDuLengthMinus1, + 5); + } + + // bit_rate_scale + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->bitRateScale, + 4); + + // cpb_size_scale + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->cpbSizeScale, + 4); + + if (hrdParamterPtr->subPicCpbParamsPresentFlag){ + // du_cpb_size_scale + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->duCpbSizeScale, + 4); + } + + // initial_cpb_removal_delay_length_minus1 + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->initialCpbRemovalDelayLengthMinus1, + 5); + + // au_cpb_removal_delay_length_minus1 + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->auCpbRemovalDelayLengthMinus1, + 5); + + // dpb_output_delay_length_minus1 + WriteCodeCavlc( + bitstreamPtr, + hrdParamterPtr->dpbOutputDelayLengthMinus1, + 5); + + } + } + + for (layerIndex = 0; layerIndex <= maxTemporalLayersM1; ++layerIndex){ + // fixed_pic_rate_general_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->fixedPicRateGeneralFlag[layerIndex]); + + if (!hrdParamterPtr->fixedPicRateGeneralFlag[layerIndex]){ + // fixed_pic_rate_within_cvs_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->fixedPicRateWithinCvsFlag[layerIndex]); + } + + if (hrdParamterPtr->fixedPicRateWithinCvsFlag[layerIndex]){ + // elemental_duration_in_tc_minus1 + WriteUvlc( + bitstreamPtr, + hrdParamterPtr->elementalDurationTcMinus1[layerIndex]); + } + else{ + // low_delay_hrd_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->lowDelayHrdFlag[layerIndex]); + } + + if (!hrdParamterPtr->lowDelayHrdFlag[layerIndex]){ + // cpb_cnt_minus1 + WriteUvlc( + bitstreamPtr, + hrdParamterPtr->cpbCountMinus1[layerIndex]); + } + + for (nalOrVclIndex = 0; nalOrVclIndex < 2; ++nalOrVclIndex){ + if ((nalOrVclIndex == 0 && hrdParamterPtr->nalHrdParametersPresentFlag) || + (nalOrVclIndex == 1 && hrdParamterPtr->vclHrdParametersPresentFlag)){ + + //CHECK_REPORT_ERROR( + // (hrdParamterPtr->cpbCountMinus1[layerIndex] < MAX_CPB_COUNT), + // encodeContextPtr->appCallbackPtr, + // EB_ENC_EC_ERROR14); + + for (cpbIndex = 0; cpbIndex <= hrdParamterPtr->cpbCountMinus1[layerIndex]; ++cpbIndex){ + // bit_rate_value_minus1 + WriteUvlc( + bitstreamPtr, + hrdParamterPtr->bitRateValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); + + // cpb_size_value_minus1 + WriteUvlc( + bitstreamPtr, + hrdParamterPtr->cpbSizeValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); + + if (hrdParamterPtr->subPicCpbParamsPresentFlag){ + // bit_rate_du_value_minus1 + WriteUvlc( + bitstreamPtr, + hrdParamterPtr->bitRateDuValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); + + // cpb_size_du_value_minus1 + WriteUvlc( + bitstreamPtr, + hrdParamterPtr->cpbSizeDuValueMinus1[layerIndex][nalOrVclIndex][cpbIndex]); + } + + // cbr_flag + WriteFlagCavlc( + bitstreamPtr, + hrdParamterPtr->cbrFlag[layerIndex][nalOrVclIndex][cpbIndex]); + } + } + } + } + + return; +} + + +/************************************************** +* CodeVUI +**************************************************/ +static void CodeVUI( + OutputBitstreamUnit_t *bitstreamPtr, + AppVideoUsabilityInfo_t *vuiPtr, + EB_U32 maxTemporalLayersM1, + EncodeContext_t *encodeContextPtr) +{ + // aspect_ratio_info_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->aspectRatioInfoPresentFlag); + + if (vuiPtr->aspectRatioInfoPresentFlag) + { + // aspect_ratio_idc + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->aspectRatioIdc, + 8); + + if (vuiPtr->aspectRatioIdc == 255) { + // sar_width + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->sarWidth, + 16); + + // sar_height + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->sarHeight, + 16); + } + } + + // overscan_info_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->overscanInfoPresentFlag); + + if (vuiPtr->overscanInfoPresentFlag) { + // overscan_appropriate_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->overscanApproriateFlag); + } + + // video_signal_type_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->videoSignalTypePresentFlag); + + if (vuiPtr->videoSignalTypePresentFlag) { + + // video_format + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->videoFormat, + 3); + + // video_full_range_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->videoFullRangeFlag); + + // colour_description_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->colorDescriptionPresentFlag); + + if (vuiPtr->colorDescriptionPresentFlag) { + + // colour_primaries + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->colorPrimaries, + 8); + + // transfer_characteristics + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->transferCharacteristics, + 8); + + // matrix_coefficients + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->matrixCoeffs, + 8); + } + } + + // chroma_loc_info_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->chromaLocInfoPresentFlag); + + if (vuiPtr->chromaLocInfoPresentFlag) { + + // chroma_sample_loc_type_top_field + WriteUvlc( + bitstreamPtr, + vuiPtr->chromaSampleLocTypeTopField); + + // chroma_sample_loc_type_bottom_field + WriteUvlc( + bitstreamPtr, + vuiPtr->chromaSampleLocTypeBottomField); + } + + // neutral_chroma_indication_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->neutralChromaIndicationFlag); + + // field_seq_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->fieldSeqFlag); + + // frame_field_info_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->frameFieldInfoPresentFlag); + + // default_display_window_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->defaultDisplayWindowFlag); + + if (vuiPtr->defaultDisplayWindowFlag) + { + // def_disp_win_left_offset + WriteUvlc( + bitstreamPtr, + vuiPtr->defaultDisplayWinLeftOffset); + + // def_disp_win_right_offset + WriteUvlc( + bitstreamPtr, + vuiPtr->defaultDisplayWinRightOffset); + + // def_disp_win_top_offset + WriteUvlc( + bitstreamPtr, + vuiPtr->defaultDisplayWinTopOffset); + + // def_disp_win_bottom_offset + WriteUvlc( + bitstreamPtr, + vuiPtr->defaultDisplayWinBottomOffset); + } + + // vui_timing_info_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->vuiTimingInfoPresentFlag); + + if (vuiPtr->vuiTimingInfoPresentFlag) { + + // vui_num_units_in_tick + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->vuiNumUnitsInTick, + 32); + + // vui_time_scale + WriteCodeCavlc( + bitstreamPtr, + vuiPtr->vuiTimeScale, + 32); + + // vui_poc_proportional_to_timing_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->vuiPocPropotionalTimingFlag); + + if (vuiPtr->vuiPocPropotionalTimingFlag) { + // vui_num_ticks_poc_diff_one_minus1 + WriteUvlc( + bitstreamPtr, + vuiPtr->vuiNumTicksPocDiffOneMinus1); + } + + // hrd_parameters_present_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->vuiHrdParametersPresentFlag); + + if (vuiPtr->vuiHrdParametersPresentFlag) { + CodeHrdParameters( + bitstreamPtr, + vuiPtr->hrdParametersPtr, + EB_TRUE, + maxTemporalLayersM1, + encodeContextPtr); + } + } + + + // bitstream_restriction_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->bitstreamRestrictionFlag); + + if (vuiPtr->bitstreamRestrictionFlag) { + // tiles_fixed_structure_flag + WriteFlagCavlc( + bitstreamPtr, + 0); + + // motion_vectors_over_pic_boundaries_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->motionVectorsOverPicBoundariesFlag); + + // restricted_ref_pic_lists_flag + WriteFlagCavlc( + bitstreamPtr, + vuiPtr->restrictedRefPicListsFlag); + + // min_spatial_segmentation_idc + WriteUvlc( + bitstreamPtr, + vuiPtr->minSpatialSegmentationIdc); + + // max_bytes_per_pic_denom + WriteUvlc( + bitstreamPtr, + vuiPtr->maxBytesPerPicDenom); + + // max_bits_per_mincu_denom + WriteUvlc( + bitstreamPtr, + vuiPtr->maxBitsPerMinCuDenom); + + // log2_max_mv_length_horizontal + WriteUvlc( + bitstreamPtr, + vuiPtr->log2MaxMvLengthHorizontal); + + // log2_max_mv_length_vertical + WriteUvlc( + bitstreamPtr, + vuiPtr->log2MaxMvLengthVertical); + } +} + +/************************************************** +* CodeSPS +**************************************************/ +static void CodeSPS( + OutputBitstreamUnit_t *bitstreamPtr, + SequenceControlSet_t *scsPtr) +{ + + EncodeContext_t *encodeContextPtr = scsPtr->encodeContextPtr; + + EB_U32 temporalLayersMinus1 = scsPtr->staticConfig.enableTemporalId ? scsPtr->maxTemporalLayers + : 0; + CodeNALUnitHeader( + bitstreamPtr, + NAL_UNIT_SPS, + 0); + + // "sps_video_parameter_set_id" + WriteCodeCavlc( + bitstreamPtr, + scsPtr->vpsId, + 4); + + // "sps_max_sub_layers_minus1" + WriteCodeCavlc( + bitstreamPtr, + temporalLayersMinus1,//scsPtr->maxTemporalLayers - 1, + 3); + + // "sps_temporal_id_nesting_flag" + WriteFlagCavlc( + bitstreamPtr, + temporalLayersMinus1 == 0 ? 1 : 0); + + CodeProfileTierLevel( + bitstreamPtr, + scsPtr, + EB_TRUE, + temporalLayersMinus1); + + // "sps_seq_parameter_set_id" + WriteUvlc( + bitstreamPtr, + scsPtr->spsId); + + // "chroma_format_idc" + WriteUvlc( + bitstreamPtr, + scsPtr->chromaFormatIdc); + + if (scsPtr->chromaFormatIdc == EB_YUV444) { + WriteFlagCavlc(bitstreamPtr, 0); //separate_colour_plane_flag=0 + } + + // "pic_width_in_luma_samples" + WriteUvlc( + bitstreamPtr, + scsPtr->lumaWidth); + + // "pic_height_in_luma_samples" + WriteUvlc( + bitstreamPtr, + scsPtr->lumaHeight); + + // "conformance_window_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->conformanceWindowFlag); + + + if (scsPtr->conformanceWindowFlag) { + + // "conf_win_left_offset" + WriteUvlc( + bitstreamPtr, + scsPtr->croppingLeftOffset >> 1); + + // "conf_win_right_offset" + WriteUvlc( + bitstreamPtr, + scsPtr->croppingRightOffset >> 1); + + // "conf_win_top_offset" + WriteUvlc( + bitstreamPtr, + scsPtr->croppingTopOffset >> 1); + + // "conf_win_bottom_offset" + WriteUvlc( + bitstreamPtr, + scsPtr->croppingBottomOffset >> 1); + } + + + // Luma Bit Increment + // "bit_depth_luma_minus8" + WriteUvlc( + bitstreamPtr, + scsPtr->staticConfig.encoderBitDepth - 8);//2);// + + // Chroma Bit Increment + // "bit_depth_chroma_minus8" + WriteUvlc( + bitstreamPtr, + scsPtr->staticConfig.encoderBitDepth - 8);// 2);// + + // "log2_max_pic_order_cnt_lsb_minus4" + WriteUvlc( + bitstreamPtr, + (EB_U32)(scsPtr->bitsForPictureOrderCount - 4)); + + // "sps_sub_layer_ordering_info_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + + { + + // Supports Main Profile Level 5 (Max Picture resolution 4Kx2K, up to 6 Hierarchy Levels) + WriteUvlc( + bitstreamPtr, + scsPtr->maxDpbSize - 1/*4*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); + + WriteUvlc( + bitstreamPtr, + scsPtr->maxDpbSize - 1/*3*/);//(1 << (scsPtr->maxTemporalLayers-syntaxItr))); + + WriteUvlc( + bitstreamPtr, + 0); + } + + // "log2_min_coding_block_size_minus3" + // Log2(Min CU Size) - 3 + WriteUvlc( + bitstreamPtr, + Log2f(scsPtr->lcuSize) - (scsPtr->maxLcuDepth - 1) - 3); + + // Max CU Depth + // "log2_diff_max_min_coding_block_size" + WriteUvlc( + bitstreamPtr, + scsPtr->maxLcuDepth - 1); + + // "log2_min_transform_block_size_minus2" + WriteUvlc( + bitstreamPtr, + 2 - 2); + + // "log2_diff_max_min_transform_block_size" + WriteUvlc( + bitstreamPtr, + 5 - 2); + + // "max_transform_hierarchy_depth_inter" + WriteUvlc( + bitstreamPtr, + 3 - 1); + + // "max_transform_hierarchy_depth_intra" + WriteUvlc( + bitstreamPtr, + 3 - 1); + + // "scaling_list_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "asymmetric_motion_partitions_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + EB_FALSE); + + //// SAO + // "sample_adaptive_offset_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->staticConfig.enableSaoFlag); + + // "pcm_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // RPS related + // No RPS to send in SPS when dynamic GOP is ON + WriteUvlc( + bitstreamPtr, + 0); + + // "long_term_ref_pics_present_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->predStructPtr->longTermEnableFlag); + + if (scsPtr->predStructPtr->longTermEnableFlag) { + // Note: Add code here related to Long term reference pics + + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR11); + + } + + // "sps_temporal_mvp_enable_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->enableTmvpSps); + + // "sps_strong_intra_smoothing_enable_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->enableStrongIntraSmoothing); + + // "vui_parameters_present_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->staticConfig.videoUsabilityInfo); + + if (scsPtr->staticConfig.videoUsabilityInfo) { + CodeVUI( + bitstreamPtr, + scsPtr->videoUsabilityInfoPtr, + scsPtr->maxTemporalLayers, + NULL /*encodeContextPtr*/); + } + + // "sps_extension_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + return; +} + +static void CodePPS( + OutputBitstreamUnit_t *bitstreamPtr, + SequenceControlSet_t *scsPtr, + EbPPSConfig_t *ppsConfig) +{ + //SequenceControlSet_t *scsPtr = (SequenceControlSet_t*)pcsPtr->sequenceControlSetWrapperPtr->objectPtr; + + EB_BOOL disableDlfFlag = scsPtr->staticConfig.disableDlfFlag; + EB_BOOL tileMode = (scsPtr->staticConfig.tileColumnCount > 1 || scsPtr->staticConfig.tileRowCount > 1) ? EB_TRUE : EB_FALSE; + + // uiFirstByte + //codeNALUnitHeader( NAL_UNIT_PPS, NAL_REF_IDC_PRIORITY_HIGHEST ); + CodeNALUnitHeader( + bitstreamPtr, + NAL_UNIT_PPS, + 0); + + + // "pps_pic_parameter_set_id" + + // Code PPS ID + WriteUvlc( + bitstreamPtr, + ppsConfig->ppsId); + + // "pps_seq_parameter_set_id" + + // Code SPS ID + WriteUvlc( + bitstreamPtr, + 0); + + // "dependent_slice_segments_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "output_flag_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "num_extra_slice_header_bits" + WriteCodeCavlc( + bitstreamPtr, + 0, + 3); + + // "sign_data_hiding_flag" + WriteFlagCavlc( + bitstreamPtr, + EB_FALSE); + + // "cabac_init_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "num_ref_idx_l0_default_active_minus1" + WriteUvlc( + bitstreamPtr, + 0);// pcsPtr->ParentPcsPtr->predStructPtr->defaultRefPicsList0TotalCountMinus1); + + // "num_ref_idx_l1_default_active_minus1" + WriteUvlc( + bitstreamPtr, + 0);//pcsPtr->ParentPcsPtr->predStructPtr->defaultRefPicsList1TotalCountMinus1); + + + // "pic_init_qp_minus26" + WriteSvlc( + bitstreamPtr, + 0); + + // "constrained_intra_pred_flag" + WriteFlagCavlc( + bitstreamPtr, + ppsConfig->constrainedFlag); + + //constrained = 1; + + // "transform_skip_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "cu_qp_delta_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + scsPtr->staticConfig.improveSharpness || scsPtr->staticConfig.bitRateReduction || scsPtr->staticConfig.segmentOvEnabled);// pcsPtr->useDeltaQp); + + if (scsPtr->staticConfig.improveSharpness || scsPtr->staticConfig.bitRateReduction || scsPtr->staticConfig.segmentOvEnabled) { //pcsPtr->useDeltaQp) { + // "diff_cu_qp_delta_depth" + WriteUvlc( + bitstreamPtr, + scsPtr->inputResolution < INPUT_SIZE_1080p_RANGE ? 2 : 3);// pcsPtr->difCuDeltaQpDepth); + //0); // max cu deltaqp depth + } + + // "pps_cb_qp_offset" + WriteSvlc( + bitstreamPtr, + 0);// pcsPtr->cbQpOffset); + + // "pps_cr_qp_offset" + WriteSvlc( + bitstreamPtr, + 0);//pcsPtr->crQpOffset); + + // "pps_slice_chroma_qp_offsets_present_flag" + WriteFlagCavlc( + bitstreamPtr, + EB_TRUE);// pcsPtr->sliceLevelChromaQpFlag); + + // "weighted_pred_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "weighted_bipred_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "transquant_bypass_enable_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + // "tiles_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + tileMode); + + // "entropy_coding_sync_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + if (tileMode == EB_TRUE) { + + // Tiles Number of Columns + WriteUvlc( + bitstreamPtr, + scsPtr->staticConfig.tileColumnCount - 1); + + // Tiles Number of Rows + WriteUvlc( + bitstreamPtr, + scsPtr->staticConfig.tileRowCount - 1); + + // Tiles Uniform Spacing Flag + WriteCodeCavlc( + bitstreamPtr, +// scsPtr->tileUniformSpacing, + 1, + 1); + +#if 0 + if (scsPtr->staticConfig.tileUniformSpacing == 0) { + int syntaxItr; + + // Tile Column Width + for (syntaxItr = 0; syntaxItr < (scsPtr->staticConfig.tileColumnCount - 1); ++syntaxItr) { + // "column_width_minus1" + WriteUvlc( + bitstreamPtr, + scsPtr->tileColumnWidthArray[syntaxItr] - 1); + } + + // Tile Row Height + for (syntaxItr = 0; syntaxItr < (scsPtr->tileRowCount - 1); ++syntaxItr) { + // "row_height_minus1" + WriteUvlc( + bitstreamPtr, + scsPtr->tileRowHeightArray[syntaxItr] - 1); + } + + } +#endif + // Loop filter across tiles + //if(scsPtr->staticConfig.tileColumnCount != 1 || scsPtr->staticConfig.tileRowCount > 1) { + WriteFlagCavlc( + bitstreamPtr, + 0); + //} + } + + // "loop_filter_across_slices_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "deblocking_filter_control_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 1); + + //if(pcPPS->getDeblockingFilterControlPresentFlag()) + { + + // "deblocking_filter_override_enabled_flag" + WriteFlagCavlc( + bitstreamPtr, + 1); + + // "pps_disable_deblocking_filter_flag" + WriteFlagCavlc( + bitstreamPtr, + disableDlfFlag); + + if (!disableDlfFlag) { + // "pps_beta_offset_div2" + WriteSvlc( + bitstreamPtr, + 0); + + // "pps_tc_offset_div2" + WriteSvlc( + bitstreamPtr, + 0); + } + } + + // "pps_scaling_list_data_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "lists_modification_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "log2_parallel_merge_level_minus2" + WriteUvlc( + bitstreamPtr, + 0); // Note: related to mv merge/skip parallel processing + + // "slice_header_extension_present_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + // "pps_extension_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + + return; +} + +static EB_U32 GetEntropyCoderGetBitstreamSize(EntropyCoder_t *entropyCoderPtr) +{ + CabacEncodeContext_t *cabacEncCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + OutputBitstreamUnit_t *bitstreamPtr = &cabacEncCtxPtr->bacEncContext.m_pcTComBitIf; + unsigned payloadBytes = (cabacEncCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount) >> 3; + FlushBitstream(bitstreamPtr); + + unsigned char *buf = (unsigned char *)bitstreamPtr->bufferBegin; + unsigned int emulationCount = 0; + + //Count emulation counts 0x000001 and 0x000002 + if (payloadBytes >= 3) { + for (unsigned i = 0; i <= payloadBytes - 3; i++) { + if (buf[i] == 0 && buf[i+1] == 0 && (buf[i+2] <= 3)) { + emulationCount++; + i++; + } + } + } + + return (payloadBytes + emulationCount); +} + +static void CodeSliceHeader( + EB_U32 firstLcuAddr, + EB_U32 pictureQp, + OutputBitstreamUnit_t *bitstreamPtr, + PictureControlSet_t *pcsPtr) +{ + EB_S32 numBitesUsedByLcuAddr; + EB_S32 lcuTotalCount = pcsPtr->lcuTotalCount; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pcsPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pcsPtr->sequenceControlSetWrapperPtr->objectPtr; + + EB_BOOL disableDlfFlag = sequenceControlSetPtr->staticConfig.disableDlfFlag; + PictureParentControlSet_t *ppcsPtr = pcsPtr->ParentPcsPtr; + + EB_U32 sliceType = (pcsPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : pcsPtr->sliceType; + EB_BOOL tileMode = (ppcsPtr->tileColumnCount > 1 || ppcsPtr->tileRowCount > 1) ? EB_TRUE : EB_FALSE; + + EB_U32 refPicsTotalCount = + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->negativeRefPicsTotalCount + + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->positiveRefPicsTotalCount; + + EB_U32 rpsSyntaxIndex; + EB_S32 numBits; + + NalUnitType nalUnit = pcsPtr->ParentPcsPtr->nalUnit; + + // here someone can add an appropriated NalRefIdc type + //CodeNALUnitHeader (pcSlice->getNalUnitType(), NAL_REF_IDC_PRIORITY_HIGHEST, 1, true); + + // *Note - there seems to be a bug with the temporal layers in the NALU or I don't + // understand what the issue is. Hardcoding to 0 for now... + + // Note - The NAL unit type has to be more sophisticated than this + CodeNALUnitHeader( + bitstreamPtr, + nalUnit, + pcsPtr->temporalId); + + // "first_slice_segment_in_pic_flag" + WriteFlagCavlc( + bitstreamPtr, + firstLcuAddr == 0); + + if (nalUnit == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || nalUnit == NAL_UNIT_CODED_SLICE_IDR_N_LP + || nalUnit == NAL_UNIT_CODED_SLICE_BLA_N_LP + || nalUnit == NAL_UNIT_CODED_SLICE_BLA_W_RADL + || nalUnit == NAL_UNIT_CODED_SLICE_BLA_W_LP + || nalUnit == NAL_UNIT_CODED_SLICE_CRA) + { + + // "no_output_of_prior_pics_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + } + + // "slice_pic_parameter_set_id" + // PPS ID + WriteUvlc( + bitstreamPtr, + (pcsPtr->constrainedIntraFlag == EB_FALSE ? 0 : 1)); + + if (firstLcuAddr > 0) { + numBitesUsedByLcuAddr = 0; + while (lcuTotalCount > (1 << numBitesUsedByLcuAddr)) + { + ++numBitesUsedByLcuAddr; + } + + // "slice_address" + WriteCodeCavlc( + bitstreamPtr, + firstLcuAddr, + numBitesUsedByLcuAddr); + } + + // "slice_type" + + // Slice Type + WriteUvlc( + bitstreamPtr, + sliceType); + + if (pcsPtr->ParentPcsPtr->idrFlag != EB_TRUE) { + + EB_U64 pocNumber = (EB_U32)(((EB_S32)(pcsPtr->ParentPcsPtr->pictureNumber - pcsPtr->ParentPcsPtr->lastIdrPicture) + (1 << sequenceControlSetPtr->bitsForPictureOrderCount)) & ((1 << sequenceControlSetPtr->bitsForPictureOrderCount) - 1)); + WriteCodeCavlc( + bitstreamPtr, + (EB_U32)pocNumber, + (EB_U32)sequenceControlSetPtr->bitsForPictureOrderCount); + + // "short_term_ref_pic_set_sps_flag" + WriteFlagCavlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->useRpsInSps); + + // Short Term RPS + if (pcsPtr->ParentPcsPtr->useRpsInSps == EB_FALSE) { + + CodeShortTermRPS( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex], + RPS_DEFAULT_VALUE, + RPS_DEFAULT_VALUE, + 0, // No RPS to send in SPS when dynamic GOP is ON + pcsPtr->ParentPcsPtr->openGopCraFlag); + + + } + else { + + numBits = 0; + while ((1 << numBits) < (EB_S32)sequenceControlSetPtr->predStructPtr->predStructEntryCount) { + numBits++; + } + + if (numBits > 0) { + // "short_term_ref_pic_set_idx" + WriteCodeCavlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructIndex, + numBits); + } + } + + // Long Term RPS + if (pcsPtr->ParentPcsPtr->predStructPtr->longTermEnableFlag) { + + //NOTE: long term references are not handled properly. This below code needs to be modified + + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR11); + + } + + if (sequenceControlSetPtr->enableTmvpSps) { + // "slice_temporal_mvp_enable_flag" + WriteFlagCavlc( + bitstreamPtr, + !pcsPtr->ParentPcsPtr->disableTmvpFlag); + } + } + + if (sequenceControlSetPtr->staticConfig.enableSaoFlag) // Note: SAO is enabled + { + // "slice_sao_luma_flag" + WriteFlagCavlc( + bitstreamPtr, + pcsPtr->saoFlag[0]); + + // "slice_sao_chroma_flag" + WriteFlagCavlc( + bitstreamPtr, + pcsPtr->saoFlag[1]); + } + + // RPS List Construction + if (sliceType != EB_I_PICTURE) { + + // "num_ref_idx_active_override_flag" + WriteFlagCavlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsOverrideTotalCountFlag); + + if (pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsOverrideTotalCountFlag) { + + // "num_ref_idx_l0_active_minus1" + WriteUvlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsList0TotalCountMinus1); + + if (sliceType == EB_B_PICTURE){ + // "num_ref_idx_l1_active_minus1" + WriteUvlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->refPicsList1TotalCountMinus1); + } + } + } + + // RPS List Modification + if (sliceType != EB_I_PICTURE) { // rd, Note: This needs to be changed + + // if( pcSlice->getPPS()->getListsModificationPresentFlag() && pcSlice->getNumRpsCurrTempList() > 1) + if (pcsPtr->ParentPcsPtr->predStructPtr->listsModificationEnableFlag == EB_TRUE && refPicsTotalCount > 1){ + + // "ref_pic_list_modification_flag_l0" + WriteFlagCavlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list0ModificationFlag); + + if (pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list0ModificationFlag) { + + for (rpsSyntaxIndex = 0; rpsSyntaxIndex < refPicsTotalCount; rpsSyntaxIndex++) { + // "list_entry_l0" + WriteCodeCavlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list0ModIndex[rpsSyntaxIndex], + refPicsTotalCount); + } + } + + if (sliceType == EB_B_PICTURE){ + // "ref_pic_list_modification_flag_l1" + WriteFlagCavlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list1ModificationFlag); + + if (pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list1ModificationFlag) { + + for (rpsSyntaxIndex = 0; rpsSyntaxIndex < refPicsTotalCount; rpsSyntaxIndex++) { + // "list_entry_l1" + WriteCodeCavlc( + bitstreamPtr, + pcsPtr->ParentPcsPtr->predStructPtr->predStructEntryPtrArray[pcsPtr->ParentPcsPtr->predStructIndex]->list1ModIndex[rpsSyntaxIndex], + refPicsTotalCount); + } + } + } + } + } + + if (sliceType == EB_B_PICTURE){ + // "mvd_l1_zero_flag" + WriteFlagCavlc( + bitstreamPtr, + 0); + } + + if (!pcsPtr->ParentPcsPtr->disableTmvpFlag){ + if (pcsPtr->sliceType == EB_B_PICTURE){ + WriteFlagCavlc( + bitstreamPtr, + pcsPtr->colocatedPuRefList == REF_LIST_0); + } + } + + if (sliceType != EB_I_PICTURE) { + // "five_minus_max_num_merge_cand" + WriteUvlc( + bitstreamPtr, + 0); // This has to be handled properly with mev merge being present + } + + //Int iCode = pcSlice->getSliceQp() - ( pcSlice->getPPS()->getPicInitQPMinus26() + 26 ); + //WRITE_SVLC( iCode, "slice_qp_delta" ); + WriteSvlc( + bitstreamPtr, + pictureQp - 26); + + if (pcsPtr->sliceLevelChromaQpFlag) { + // WRITE_SVLC( iCode, "slice_qp_delta_cb" ); + WriteSvlc( + bitstreamPtr, + pcsPtr->sliceCbQpOffset); + // WRITE_SVLC( iCode, "slice_qp_delta_cr" ); + WriteSvlc( + bitstreamPtr, + pcsPtr->sliceCrQpOffset); + } + + // Note: dlf override enable flag has been disabled (set to 0) + //"deblocking_filter_override_flag" + WriteFlagCavlc( + bitstreamPtr, + 1); + //"slice_deblocking_filter_disabled_flag" + WriteFlagCavlc( + bitstreamPtr, + disableDlfFlag); + + + if (!disableDlfFlag){ + + //"slice_beta_offset_div2" + WriteSvlc( + bitstreamPtr, + (pcsPtr->betaOffset >> 1)); + + //"slice_tc_offset_div2" + WriteSvlc( + bitstreamPtr, + (pcsPtr->tcOffset >> 1)); + } + + //if (!disableDlfFlag || (sequenceControlSetPtr->staticConfig.enableSaoFlag && (pcsPtr->saoFlag[0] || pcsPtr->saoFlag[1]))) { + // // "slice_loop_filter_across_slices_enabled_flag" + // WriteFlagCavlc( + // bitstreamPtr, + // 1); + //} + + if (tileMode) { + unsigned tileColumnNumMinus1 = ppcsPtr->tileColumnCount - 1; + unsigned tileRowNumMinus1 = ppcsPtr->tileRowCount - 1; + unsigned num_entry_point_offsets = sequenceControlSetPtr->staticConfig.tileSliceMode == 0 ? (ppcsPtr->tileColumnCount * ppcsPtr->tileRowCount - 1) : 0; + + if (tileColumnNumMinus1 > 0 || tileRowNumMinus1 > 0) { + EB_U32 maxOffset = 0; + EB_U32 offset[EB_TILE_MAX_COUNT]; + for (unsigned tileIdx = 0; tileIdx < num_entry_point_offsets; tileIdx++) { + offset[tileIdx] = GetEntropyCoderGetBitstreamSize(pcsPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr); + if (offset[tileIdx] > maxOffset) { + maxOffset = offset[tileIdx]; + } + //printf("tile %d, size %d\n", tileIdx, offset[tileIdx]); + } + + EB_U32 offsetLenMinus1 = 0; + while (maxOffset >= (1u << (offsetLenMinus1 + 1))) { + offsetLenMinus1++; + //assert(offsetLenMinus1 + 1 < 32); + } + + // "num_entry_point_offsets" + WriteUvlc( + bitstreamPtr, + num_entry_point_offsets); + + if (num_entry_point_offsets > 0) { + WriteUvlc( + bitstreamPtr, + offsetLenMinus1); + + for (unsigned tileIdx = 0; tileIdx < num_entry_point_offsets; tileIdx++) { + //EB_U32 offset = GetEntropyCoderGetBitstreamSize(pcsPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr); + WriteCodeCavlc(bitstreamPtr, offset[tileIdx] - 1, offsetLenMinus1 + 1); + } + } + } + } + + // Byte Alignment + + //pcBitstreamOut->write( 1, 1 ); + OutputBitstreamWrite( + bitstreamPtr, + 1, + 1); + + //pcBitstreamOut->writeAlignZero(); + OutputBitstreamWriteAlignZero( + bitstreamPtr); + +} + +EB_ERRORTYPE EncodeTileFinish( + EntropyCoder_t *entropyCoderPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + + // Add tile terminate bit (0x1) + BacEncContextTerminate( + &(cabacEncodeCtxPtr->bacEncContext), + 1); + + BacEncContextFinish(&(cabacEncodeCtxPtr->bacEncContext)); + + OutputBitstreamWrite( + &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf), + 1, + 1); + + OutputBitstreamWriteAlignZero( + &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf)); + + return return_error; +} + +EB_ERRORTYPE EncodeLcuSaoParameters( + LargestCodingUnit_t *tbPtr, + EntropyCoder_t *entropyCoderPtr, + EB_BOOL saoLumaSliceEnable, + EB_BOOL saoChromaSliceEnable, + EB_U8 bitdepth) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + + // Note: Merge should be disabled across tiles and slices + // This needs to be revisited when there is more than one slice per tile + // Code Luma SAO parameters + // Code Luma SAO parameters + if (tbPtr->lcuEdgeInfoPtr->tileLeftEdgeFlag == EB_FALSE) { + EncodeSaoMerge( + cabacEncodeCtxPtr, + tbPtr->saoParams.saoMergeLeftFlag); + } else { + tbPtr->saoParams.saoMergeLeftFlag = EB_FALSE; + } + + if (tbPtr->saoParams.saoMergeLeftFlag == 0) { + if (tbPtr->lcuEdgeInfoPtr->tileTopEdgeFlag == EB_FALSE) { + EncodeSaoMerge( + cabacEncodeCtxPtr, + tbPtr->saoParams.saoMergeUpFlag); + } else { + tbPtr->saoParams.saoMergeUpFlag = EB_FALSE; + } + } + + if (tbPtr->saoParams.saoMergeLeftFlag == 0 && tbPtr->saoParams.saoMergeUpFlag == 0) { + + // Luma + if (saoLumaSliceEnable) { + EncodeSaoOffsets( + cabacEncodeCtxPtr, + 0, // Y + tbPtr->saoParams.saoTypeIndex, + tbPtr->saoParams.saoOffset[0], + tbPtr->saoParams.saoBandPosition[0], + bitdepth); + } + + // Chroma + if (saoChromaSliceEnable) { + // Cb + EncodeSaoOffsets( + cabacEncodeCtxPtr, + 1, // Cb + tbPtr->saoParams.saoTypeIndex, + tbPtr->saoParams.saoOffset[1], + tbPtr->saoParams.saoBandPosition[1], + bitdepth); + // Cr + EncodeSaoOffsets( + cabacEncodeCtxPtr, + 2, // Cr + tbPtr->saoParams.saoTypeIndex, + tbPtr->saoParams.saoOffset[2], + tbPtr->saoParams.saoBandPosition[2], + bitdepth); + } + + } + + return return_error; +} + +/******************************************* +* Entropy Coding - Assign Delta Qp +*******************************************/ +static void EntropyCodingUpdateQp( + CodingUnit_t *cuPtr, + EB_BOOL availableCoeff, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + EB_U32 cuSize, + EB_U32 lcuSize, + EB_BOOL isDeltaQpEnable, + EB_BOOL *isDeltaQpNotCoded, + EB_U32 difCuDeltaQpDepth, + EB_U8 *prevCodedQp, + EB_U8 *prevQuantGroupCodedQp, + EB_U8 lcuQp, + + PictureControlSet_t *pictureControlSetPtr, + EB_U32 pictureOriginX, + EB_U32 pictureOriginY) +{ + EB_U8 refQp; + EB_U8 qp; + EB_U32 log2MinCuQpDeltaSize = Log2f(lcuSize) - difCuDeltaQpDepth; + EB_S32 qpTopNeighbor = 0; + EB_S32 qpLeftNeighbor = 0; + EB_BOOL newQuantGroup; + EB_U32 quantGroupX = cuOriginX - (cuOriginX & ((1 << log2MinCuQpDeltaSize) - 1)); + EB_U32 quantGroupY = cuOriginY - (cuOriginY & ((1 << log2MinCuQpDeltaSize) - 1)); + EB_BOOL sameLcuCheckTop = (((quantGroupY - 1) >> Log2f(MAX_LCU_SIZE)) == ((quantGroupY) >> Log2f(MAX_LCU_SIZE))) ? EB_TRUE : EB_FALSE; + EB_BOOL sameLcuCheckLeft = (((quantGroupX - 1) >> Log2f(MAX_LCU_SIZE)) == ((quantGroupX) >> Log2f(MAX_LCU_SIZE))) ? EB_TRUE : EB_FALSE; + + // Neighbor Array + EB_U32 qpLeftNeighborIndex = 0; + EB_U32 qpTopNeighborIndex = 0; + + // CU larger than the quantization group + if (Log2f(cuSize) >= log2MinCuQpDeltaSize){ + *isDeltaQpNotCoded = EB_TRUE; + } + + // At the beginning of a new quantization group + if (((cuOriginX & ((1 << log2MinCuQpDeltaSize) - 1)) == 0) && + ((cuOriginY & ((1 << log2MinCuQpDeltaSize) - 1)) == 0)) + { + *isDeltaQpNotCoded = EB_TRUE; + newQuantGroup = EB_TRUE; + } + else { + newQuantGroup = EB_FALSE; + } + + // setting the previous Quantization Group QP + if (newQuantGroup == EB_TRUE) { + *prevCodedQp = *prevQuantGroupCodedQp; + } + + if ((quantGroupY>pictureOriginY) && sameLcuCheckTop) { + qpTopNeighborIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + quantGroupX, + quantGroupY - 1, + pictureControlSetPtr->qpArrayStride); + qpTopNeighbor = pictureControlSetPtr->entropyQpArray[qpTopNeighborIndex]; + } + else { + qpTopNeighbor = *prevCodedQp; + } + + if ((quantGroupX > pictureOriginX) && sameLcuCheckLeft) { + qpLeftNeighborIndex = + LUMA_SAMPLE_PIC_WISE_LOCATION_TO_QP_ARRAY_IDX( + quantGroupX - 1, + quantGroupY, + pictureControlSetPtr->qpArrayStride); + + qpLeftNeighbor = pictureControlSetPtr->entropyQpArray[qpLeftNeighborIndex]; + } + else { + qpLeftNeighbor = *prevCodedQp; + } + refQp = (EB_U8)(qpLeftNeighbor + qpTopNeighbor + 1) >> 1; + + qp = cuPtr->qp; + + // Update the State info + if (isDeltaQpEnable) { + if (*isDeltaQpNotCoded) { + if (availableCoeff){ + qp = cuPtr->qp; + *prevCodedQp = qp; + *prevQuantGroupCodedQp = qp; + *isDeltaQpNotCoded = EB_FALSE; + } + else{ + qp = refQp; + *prevQuantGroupCodedQp = qp; + } + } + } + else{ + qp = lcuQp; + } + cuPtr->qp = qp; + cuPtr->refQp = refQp; + + return; +} + +/********************************************************************* +* Intra4x4CheckAndCodeDeltaQp +* Check the conditions and codes the change in the QP indicated by delta QP +* +* cabacEncContextPtr +* pointer to the CABAC structure passed as input +* +* cuPtr +* input pointer to the coding unit +* +* tuPtr +* input pointer to the transform unit +*********************************************************************/ +EB_ERRORTYPE Intra4x4CheckAndCodeDeltaQp( + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + TransformUnit_t *tuPtr, + EB_BOOL isDeltaQpEnable, + EB_BOOL *isdeltaQpNotCoded) +{ + + EB_ERRORTYPE return_error = EB_ErrorNone; + + if (isDeltaQpEnable) { + EB_BOOL cbfChroma = 0; + if (cabacEncodeCtxPtr->colorFormat == EB_YUV444) { + cbfChroma = tuPtr->cbCbf || tuPtr->crCbf; + } else if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { + cbfChroma = (cuPtr->transformUnitArray[1].cbCbf || + cuPtr->transformUnitArray[1].crCbf || + cuPtr->transformUnitArray[3].cbCbf || + cuPtr->transformUnitArray[3].crCbf); + } else { + cbfChroma = (cuPtr->transformUnitArray[1].cbCbf || + cuPtr->transformUnitArray[1].crCbf); + } + if (tuPtr->lumaCbf || cbfChroma) { + if (*isdeltaQpNotCoded){ + EB_S32 deltaQp; + deltaQp = cuPtr->qp - cuPtr->refQp; + + EncodeDeltaQp( + cabacEncodeCtxPtr, + deltaQp); + + *isdeltaQpNotCoded = EB_FALSE; + } + } + } + + return return_error; +} + +static EB_ERRORTYPE Intra4x4EncodeLumaCoeff( + EB_U8 intraLumaMode, + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + TransformUnit_t *tuPtr, + EB_U32 tuOriginX, + EB_U32 tuOriginY, + EbPictureBufferDesc_t *coeffPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_S16 *coeffBuffer; + EB_U32 coeffLocation; + EB_U32 countNonZeroCoeffs = 0; + + coeffLocation = tuOriginX + (tuOriginY * coeffPtr->strideY); + coeffBuffer = (EB_S16*)&coeffPtr->bufferY[coeffLocation * sizeof(EB_S16)]; + + if (tuPtr->lumaCbf){ + + ComputeNumofSigCoefficients( + coeffBuffer, + coeffPtr->strideY, + MIN_PU_SIZE, + &countNonZeroCoeffs); + + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + MIN_PU_SIZE, + (EB_MODETYPE)cuPtr->predictionModeFlag, + intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideY, + COMPONENT_LUMA, + tuPtr); + } + + return return_error; +} + +static EB_ERRORTYPE Intra4x4EncodeChromaCoeff( + EB_U8 intraLumaMode, + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + EB_U32 tuOriginX, + EB_U32 tuOriginY, + EB_U32 tuIndex, //For 444 case, 422/420 can ignore this flag + EbPictureBufferDesc_t *coeffPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + TransformUnit_t *tuPtr = NULL; + EB_S16 *coeffBuffer; + EB_U32 coeffLocation; + EB_U32 countNonZeroCoeffs = 0; + const EB_U16 subWidthCMinus1 = (cabacEncodeCtxPtr->colorFormat == EB_YUV444 ? 1 : 2) - 1; + const EB_U16 subHeightCMinus1 = (cabacEncodeCtxPtr->colorFormat >= EB_YUV422 ? 1 : 2) - 1; + + // cb + for (int tIdx = 0; tIdx < (cabacEncodeCtxPtr->colorFormat == EB_YUV422 ? 2 : 1); tIdx++) { + // Get the correct TU block for 444, not always the 1st one + tuPtr=&cuPtr->transformUnitArray[tuIndex + 1 + 2 * tIdx]; //1,3 for 422 chroma + coeffLocation = (tuOriginX >> subWidthCMinus1) + + (((tuOriginY + MIN_PU_SIZE * tIdx) * coeffPtr->strideCb) >> subHeightCMinus1); + coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[coeffLocation * sizeof(EB_S16)]; + + if (tuPtr->cbCbf){ + ComputeNumofSigCoefficients( + coeffBuffer, + coeffPtr->strideCb, + MIN_PU_SIZE, + &countNonZeroCoeffs); + + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + MIN_PU_SIZE, + (EB_MODETYPE)cuPtr->predictionModeFlag, + intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideCb, + COMPONENT_CHROMA_CB, + tuPtr); + } + } + + // cr + for (int tIdx=0; tIdx<(cabacEncodeCtxPtr->colorFormat==EB_YUV422?2:1); tIdx++) { + tuPtr=&cuPtr->transformUnitArray[tuIndex + 1 + 2 * tIdx]; //1,3 for 422 chroma + //coeffLocation = ((tuOriginX + ((tuOriginY+MIN_PU_SIZE*tIdx) * coeffPtr->strideCb)) >> 1); + coeffLocation = (tuOriginX >> subWidthCMinus1) + + (((tuOriginY + MIN_PU_SIZE * tIdx) * coeffPtr->strideCb) >> subHeightCMinus1); + coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[coeffLocation * sizeof(EB_S16)]; + + if (tuPtr->crCbf){ + ComputeNumofSigCoefficients( + coeffBuffer, + coeffPtr->strideCr, + MIN_PU_SIZE, + &countNonZeroCoeffs); + + EncodeQuantizedCoefficientsFuncArray[!!(ASM_TYPES & PREAVX2_MASK)]( + cabacEncodeCtxPtr, + MIN_PU_SIZE, + (EB_MODETYPE)cuPtr->predictionModeFlag, + intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideCr, + COMPONENT_CHROMA_CR, + tuPtr); + } + } + + return return_error; +} + +static EB_ERRORTYPE Intra4x4EncodeCoeff( + LargestCodingUnit_t *tbPtr, + CabacEncodeContext_t *cabacEncodeCtxPtr, + CodingUnit_t *cuPtr, + const CodedUnitStats_t *cuStatsPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_U32 *cuQuantizedCoeffsBits, + EB_BOOL isDeltaQpEnable, + EB_BOOL *isdeltaQpNotCoded) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + TransformUnit_t *tuPtr; + const TransformUnitStats_t *tuStatsPtr; + EB_U32 tuIndex; + EB_U32 tuOriginX; + EB_U32 tuOriginY; + + EB_U32 cbfContext; + EB_U32 puIndex; + + //rate Control + EB_U32 writtenBitsBeforeQuantizedCoeff; + EB_U32 writtenBitsAfterQuantizedCoeff; + EB_BOOL sum_cbCbf; + EB_BOOL sum_crCbf; + + //store the number of written bits before coding quantized coeffs (flush is not called yet): + // The total number of bits is + // number of written bits + // + 32 - bits remaining in interval Low Value + // + number of buffered byte * 8 + // This should be only for coeffs not any flag + writtenBitsBeforeQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + + 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + + (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); + + // Get Chroma Cbf context + cbfContext = 0; + + sum_cbCbf = (cabacEncodeCtxPtr->colorFormat != EB_YUV444) ? + (&cuPtr->transformUnitArray[1])->cbCbf : + ((&cuPtr->transformUnitArray[1])->cbCbf | + (&cuPtr->transformUnitArray[2])->cbCbf | + (&cuPtr->transformUnitArray[3])->cbCbf | + (&cuPtr->transformUnitArray[4])->cbCbf); + + sum_crCbf = (cabacEncodeCtxPtr->colorFormat != EB_YUV444) ? + (&cuPtr->transformUnitArray[1])->crCbf : + ((&cuPtr->transformUnitArray[1])->crCbf | + (&cuPtr->transformUnitArray[2])->crCbf | + (&cuPtr->transformUnitArray[3])->crCbf | + (&cuPtr->transformUnitArray[4])->crCbf); + + // Cb CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + sum_cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (&cuPtr->transformUnitArray[3])->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } + // Cr CBF + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + sum_crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + if (cabacEncodeCtxPtr->colorFormat == EB_YUV422) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + (&cuPtr->transformUnitArray[3])->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } + + // Get Luma Cbf context + + // Encode Intra 4x4 data + for (puIndex = 0; puIndex < 4; puIndex++) { + tuIndex = puIndex + 1; + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + tuStatsPtr = GetTransformUnitStats(tuIndex); + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); + + if (cabacEncodeCtxPtr->colorFormat == EB_YUV444) { + cbfContext = 1; + if (sum_cbCbf) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->cbCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } + + if (sum_crCbf) { + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->crCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext + NUMBER_OF_CBF_CONTEXT_MODELS])); + } + } + + cbfContext = 0; + EncodeOneBin( + &(cabacEncodeCtxPtr->bacEncContext), + tuPtr->lumaCbf, + &(cabacEncodeCtxPtr->contextModelEncContext.cbfContextModel[cbfContext])); + + //EncodeDeltaQp + Intra4x4CheckAndCodeDeltaQp( + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + isDeltaQpEnable, + isdeltaQpNotCoded); + + // Encode Luma coeff + Intra4x4EncodeLumaCoeff( + tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuPtr->leafIndex] - 21) << 2) + puIndex], + cabacEncodeCtxPtr, + cuPtr, + tuPtr, + tuOriginX, + tuOriginY, + coeffPtr); + + if (cabacEncodeCtxPtr->colorFormat == EB_YUV444) { + // residual coding for Cb/Cr + Intra4x4EncodeChromaCoeff( + tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuPtr->leafIndex] - 21) << 2) + puIndex], + cabacEncodeCtxPtr, + cuPtr, + tuOriginX, + tuOriginY, + puIndex, + coeffPtr); + } + } + + if (cabacEncodeCtxPtr->colorFormat != EB_YUV444) { + // Encode Chroma coeff for non-444 case, + // Jing TODO: see if can move to above loop + tuStatsPtr = GetTransformUnitStats(1); + tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatsPtr->offsetX); + tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatsPtr->offsetY); + + Intra4x4EncodeChromaCoeff( + tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuPtr->leafIndex] - 21) << 2)], + cabacEncodeCtxPtr, + cuPtr, + tuOriginX, + tuOriginY, + 0, + coeffPtr); + } + + //store the number of written bits after coding quantized coeffs (flush is not called yet): + // The total number of bits is + // number of written bits + // + 32 - bits remaining in interval Low Value + // + number of buffered byte * 8 + writtenBitsAfterQuantizedCoeff = cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf.writtenBitsCount + + 32 - cabacEncodeCtxPtr->bacEncContext.bitsRemainingNum + + (cabacEncodeCtxPtr->bacEncContext.tempBufferedBytesNum << 3); + + *cuQuantizedCoeffsBits = writtenBitsAfterQuantizedCoeff - writtenBitsBeforeQuantizedCoeff; + + + return return_error; +} + +/********************************************** +* Encode Lcu +**********************************************/ +EB_ERRORTYPE EncodeLcu( + LargestCodingUnit_t *tbPtr, + EB_U32 lcuOriginX, + EB_U32 lcuOriginY, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 lcuSize, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffPtr, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *leafDepthNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *skipFlagNeighborArray, + EB_U16 tileIdx, + EB_U32 pictureOriginX, + EB_U32 pictureOriginY) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + + // CU Varaiables + const CodedUnitStats_t *cuStatsPtr; + CodingUnit_t *cuPtr; + EB_U32 cuIndex = 0; + EB_REFLIST refList; + EB_U32 maxRefList; + EB_U32 cuOriginX; + EB_U32 cuOriginY; + EB_U32 cuSize; + EB_U8 cuDepth; + EB_BOOL availableCoeff; + cabacEncodeCtxPtr->colorFormat = pictureControlSetPtr->colorFormat; + + // PU Varaiables + PredictionUnit_t *puPtr; + EB_U32 cuQuantizedCoeffsBits; + EB_U32 log2MinCuQpDeltaSize = Log2f(MAX_LCU_SIZE) - pictureControlSetPtr->difCuDeltaQpDepth; + + tbPtr->quantizedCoeffsBits = 0; + EB_BOOL entropyDeltaQpNotCoded = EB_TRUE; + EB_BOOL deltaQpNotCoded = EB_TRUE; + EB_BOOL checkCuOutOfBound = EB_FALSE; + LcuParams_t * lcuParam = &sequenceControlSetPtr->lcuParamsArray[tbPtr->index]; + if (!(lcuParam->isCompleteLcu)){ + checkCuOutOfBound = EB_TRUE; + } + do { + EB_BOOL codeCuCond = EB_TRUE; // Code cu only if it is inside the picture + cuPtr = tbPtr->codedLeafArrayPtr[cuIndex]; + + if (checkCuOutOfBound) + codeCuCond = (EB_BOOL)lcuParam->rasterScanCuValidity[MD_SCAN_TO_RASTER_SCAN[cuIndex]]; // check if cu is inside the picture + + if (codeCuCond){ + // CU Stats + cuStatsPtr = GetCodedUnitStats(cuIndex); + cuSize = cuStatsPtr->size; + cuOriginX = lcuOriginX + cuStatsPtr->originX; + cuOriginY = lcuOriginY + cuStatsPtr->originY; + cuDepth = (EB_U8)cuStatsPtr->depth; + + // Code Split Flag + EncodeSplitFlag( + cabacEncodeCtxPtr, + cuDepth, + pictureControlSetPtr->lcuMaxDepth, + (EB_BOOL)cuPtr->splitFlag, + cuOriginX, + cuOriginY, + modeTypeNeighborArray, + leafDepthNeighborArray); + if (cuStatsPtr->sizeLog2 >= log2MinCuQpDeltaSize){ + deltaQpNotCoded = EB_TRUE; + } + if (((cuStatsPtr->originY & ((1 << log2MinCuQpDeltaSize) - 1)) == 0) && + ((cuStatsPtr->originX & ((1 << log2MinCuQpDeltaSize) - 1)) == 0)){ + deltaQpNotCoded = EB_TRUE; + } + + if (cuPtr->splitFlag == EB_FALSE){ + if (cuPtr->predictionModeFlag == INTRA_MODE && + cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4) { + availableCoeff = ( + cuPtr->transformUnitArray[1].lumaCbf || + cuPtr->transformUnitArray[2].lumaCbf || + cuPtr->transformUnitArray[3].lumaCbf || + cuPtr->transformUnitArray[4].lumaCbf || + cuPtr->transformUnitArray[1].crCbf || + cuPtr->transformUnitArray[1].cbCbf || + cuPtr->transformUnitArray[2].crCbf || + cuPtr->transformUnitArray[2].cbCbf || + cuPtr->transformUnitArray[3].crCbf || + cuPtr->transformUnitArray[3].cbCbf || + cuPtr->transformUnitArray[4].crCbf || // 422 case will use 3rd 4x4 for the 2nd chroma + cuPtr->transformUnitArray[4].cbCbf) ? EB_TRUE : EB_FALSE; + } else { + availableCoeff = (cuPtr->predictionModeFlag == INTER_MODE) ? (EB_BOOL)cuPtr->rootCbf : + (cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].lumaCbf || + cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].crCbf || + cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].crCbf2 || + cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].cbCbf || + cuPtr->transformUnitArray[cuSize == sequenceControlSetPtr->lcuSize ? 1 : 0].cbCbf2) ? EB_TRUE : EB_FALSE; + } + + EntropyCodingUpdateQp( + cuPtr, + availableCoeff, + cuOriginX, + cuOriginY, + cuSize, + sequenceControlSetPtr->lcuSize, + sequenceControlSetPtr->staticConfig.improveSharpness || sequenceControlSetPtr->staticConfig.bitRateReduction || sequenceControlSetPtr->staticConfig.segmentOvEnabled ? EB_TRUE : EB_FALSE, + &entropyDeltaQpNotCoded, + pictureControlSetPtr->difCuDeltaQpDepth, + &pictureControlSetPtr->prevCodedQp[tileIdx], + &pictureControlSetPtr->prevQuantGroupCodedQp[tileIdx], + tbPtr->qp, + pictureControlSetPtr, + pictureOriginX, + pictureOriginY); + + // Assign DLF QP + entropySetQpArrayBasedOnCU( + pictureControlSetPtr, + cuOriginX, + cuOriginY, + cuSize, + cuSize, + cuPtr->qp); + + // Code the skip flag + if (pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) + { + EncodeSkipFlag( + cabacEncodeCtxPtr, + (EB_BOOL)cuPtr->skipFlag, + cuOriginX, + cuOriginY, + modeTypeNeighborArray, + skipFlagNeighborArray); + } + + if (cuPtr->skipFlag) + { + // Merge Index + EncodeMergeIndex( + cabacEncodeCtxPtr, + &cuPtr->predictionUnitArray[0]); + } + else + { + // Code CU pred mode (I, P, B, etc.) + // (not needed for Intra Slice) + if (pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) + { + EncodePredictionMode( + cabacEncodeCtxPtr, + cuPtr); + } + + switch (cuPtr->predictionModeFlag) { + case INTRA_MODE: + if (cuPtr->predictionModeFlag == INTRA_MODE && + cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4) { + // Code Partition Size + EncodeIntra4x4PartitionSize( + cabacEncodeCtxPtr, + cuPtr, + pictureControlSetPtr->lcuMaxDepth); + + // Get the PU Ptr + puPtr = cuPtr->predictionUnitArray; + + + EB_U8 partitionIndex; + + EB_U8 intraLumaLeftModeArray[4]; + EB_U8 intraLumaTopModeArray[4]; + + EB_U8 intraLumaLeftMode; + EB_U8 intraLumaTopMode; + + // Partition Loop + for (partitionIndex = 0; partitionIndex < 4; partitionIndex++) { + + EB_U8 intraLumaMode = tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuIndex] - 21) << 2) + partitionIndex]; + EB_U8 predictionModeFlag = INTRA_MODE; + + EB_U32 partitionOriginX = cuOriginX + INTRA_4x4_OFFSET_X[partitionIndex]; + EB_U32 partitionOriginY = cuOriginY + INTRA_4x4_OFFSET_Y[partitionIndex]; + + // Code Luma Mode for Intra First Stage + EncodeIntraLumaModeFirstStage( + cabacEncodeCtxPtr, + partitionOriginX, + partitionOriginY, + lcuSize, + &intraLumaLeftMode, + &intraLumaTopMode, + intraLumaMode, + modeTypeNeighborArray, + intraLumaModeNeighborArray); + + intraLumaLeftModeArray[partitionIndex] = intraLumaLeftMode; + intraLumaTopModeArray[partitionIndex] = intraLumaTopMode; + + NeighborArrayUnitModeWrite( + intraLumaModeNeighborArray, + (EB_U8*)&intraLumaMode, + partitionOriginX, + partitionOriginY, + MIN_PU_SIZE, + MIN_PU_SIZE, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + + NeighborArrayUnitModeWrite( + modeTypeNeighborArray, + &predictionModeFlag, + partitionOriginX, + partitionOriginY, + MIN_PU_SIZE, + MIN_PU_SIZE, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + + } + + for (partitionIndex = 0; partitionIndex < 4; partitionIndex++) { + EB_U8 intraLumaMode = tbPtr->intra4x4Mode[((MD_SCAN_TO_RASTER_SCAN[cuIndex] - 21) << 2) + partitionIndex]; + + // Code Luma Mode for Intra Second Stage + EncodeIntraLumaModeSecondStage( + cabacEncodeCtxPtr, + intraLumaLeftModeArray[partitionIndex], + intraLumaTopModeArray[partitionIndex], + intraLumaMode); + } + + // Code Chroma Mode for Intra + for (partitionIndex = 0; + partitionIndex < ((cabacEncodeCtxPtr->colorFormat == EB_YUV444) ? 4 : 1); + partitionIndex++) { + EncodeIntraChromaMode(cabacEncodeCtxPtr); + } + + // Encode Transform Unit Split & CBFs + Intra4x4EncodeCoeff( + tbPtr, + cabacEncodeCtxPtr, + cuPtr, + cuStatsPtr, + coeffPtr, + &cuQuantizedCoeffsBits, + (EB_BOOL)pictureControlSetPtr->useDeltaQp, + &deltaQpNotCoded); + + tbPtr->quantizedCoeffsBits += cuQuantizedCoeffsBits; + } else { + // Code Partition Size + EncodePartitionSize( + cabacEncodeCtxPtr, + cuPtr, + pictureControlSetPtr->lcuMaxDepth); + + EB_U8 intraLumaLeftMode; + EB_U8 intraLumaTopMode; + EB_U8 intraLumaMode; + + // Get the PU Ptr + puPtr = cuPtr->predictionUnitArray; + // Code Luma Mode for Intra First Stage + EncodeIntraLumaModeFirstStage( + cabacEncodeCtxPtr, + cuOriginX, + cuOriginY, + lcuSize, + &intraLumaLeftMode, + &intraLumaTopMode, + puPtr->intraLumaMode, + modeTypeNeighborArray, + intraLumaModeNeighborArray); + + intraLumaMode = (EB_U8)puPtr->intraLumaMode; + + NeighborArrayUnitModeWrite( + intraLumaModeNeighborArray, + (EB_U8*)&intraLumaMode, + cuOriginX, + cuOriginY, + cuSize, + cuSize, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + + { + EB_U8 predictionModeFlag = (EB_U8)cuPtr->predictionModeFlag; + NeighborArrayUnitModeWrite( + modeTypeNeighborArray, + &predictionModeFlag, + cuOriginX, + cuOriginY, + cuSize, + cuSize, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + } + + // Get PU Ptr + puPtr = &cuPtr->predictionUnitArray[0]; + + // Code Luma Mode for Intra Second Stage + EncodeIntraLumaModeSecondStage( + cabacEncodeCtxPtr, + intraLumaLeftMode, + intraLumaTopMode, + puPtr->intraLumaMode); + + // Code Chroma Mode for Intra + EncodeIntraChromaMode( + cabacEncodeCtxPtr); + EncodeTuSplitCoeff( + cabacEncodeCtxPtr, + cuPtr, + cuStatsPtr, + coeffPtr, + &cuQuantizedCoeffsBits, + (EB_BOOL)pictureControlSetPtr->useDeltaQp, + &deltaQpNotCoded); + + tbPtr->quantizedCoeffsBits += cuQuantizedCoeffsBits; + } + break; + + case INTER_MODE: + { + + // Code Partition Size + EncodePartitionSize( + cabacEncodeCtxPtr, + cuPtr, + pictureControlSetPtr->lcuMaxDepth); + + puPtr = cuPtr->predictionUnitArray; + // mv merge Flag + EncodeMergeFlag( + cabacEncodeCtxPtr, + puPtr); + + if (puPtr->mergeFlag) { + // mv merge index + EncodeMergeIndex( + cabacEncodeCtxPtr, + cuPtr->predictionUnitArray); + } + else { + // Inter Prediction Direction + if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ + EncodePredictionDirection( + cabacEncodeCtxPtr, + puPtr, + cuPtr); + } + + refList = puPtr->interPredDirectionIndex == UNI_PRED_LIST_1 ? REF_LIST_1 : REF_LIST_0; + maxRefList = (EB_U32)refList + (puPtr->interPredDirectionIndex == BI_PRED ? 2 : 1); + { + EB_U32 refIndex = refList; + for (; (EB_U32)refIndex < maxRefList; ++refIndex){ + // Reference Index + refList = (EB_REFLIST)refIndex; + // Reference Index + EncodeReferencePictureIndex( + cabacEncodeCtxPtr, + refList, + pictureControlSetPtr); + + // Motion Vector Difference + EncodeMvd( + cabacEncodeCtxPtr, + puPtr, + refList); + + // Motion Vector Prediction Index + EncodeMvpIndex( + cabacEncodeCtxPtr, + puPtr, + refList); + } + } + } + } + + // Encode Transform Unit Split & CBFs + EncodeTuSplitCoeff( + cabacEncodeCtxPtr, + cuPtr, + cuStatsPtr, + coeffPtr, + &cuQuantizedCoeffsBits, + (EB_BOOL)pictureControlSetPtr->useDeltaQp, + &deltaQpNotCoded); + + tbPtr->quantizedCoeffsBits += cuQuantizedCoeffsBits; + + break; + default: + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR3); + break; + } + } + + // Update the Leaf Depth Neighbor Array + NeighborArrayUnitModeWrite( + leafDepthNeighborArray, + &cuDepth, + cuOriginX, + cuOriginY, + cuSize, + cuSize, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + + // Update the Mode Type Neighbor Array + { + EB_U8 predictionModeFlag = (EB_U8)cuPtr->predictionModeFlag; + NeighborArrayUnitModeWrite( + modeTypeNeighborArray, + &predictionModeFlag, + cuOriginX, + cuOriginY, + cuSize, + cuSize, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + } + + // Update the Skip Flag Neighbor Array + { + EB_U8 skipFlag = (EB_U8)cuPtr->skipFlag; + NeighborArrayUnitModeWrite( + skipFlagNeighborArray, + (EB_U8*)&skipFlag, + cuOriginX, + cuOriginY, + cuSize, + cuSize, + NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK); + } + + } + if (cuPtr->splitFlag == EB_FALSE) + cuIndex += DepthOffset[cuDepth]; + else + ++cuIndex; + } + else + ++cuIndex; + + } while (cuIndex < CU_MAX_COUNT); + + + return return_error; +} + +EB_ERRORTYPE TuEstimateCoeffBitsEncDec( + EB_U32 tuOriginIndex, + EB_U32 tuChromaOriginIndex, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffBufferTB, + EB_U32 countNonZeroCoeffs[3], + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_MODETYPE type, + CabacCost_t *CabacCost) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + + EB_S16 *coeffBuffer; + // Estimate Y Coeff bits + { + + coeffBuffer = (EB_S16*)&coeffBufferTB->bufferY[tuOriginIndex * sizeof(EB_S16)]; + + if (countNonZeroCoeffs[0]) { + + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + transformSize, + type, + EB_INTRA_MODE_INVALID, + EB_INTRA_CHROMA_INVALID, + coeffBuffer, + MAX_LCU_SIZE, + COMPONENT_LUMA, + countNonZeroCoeffs[0], + yTuCoeffBits); + + } + + *yTuCoeffBits = (*yTuCoeffBits >> 15); + } + + // Estimate U Coeff bits + { + coeffBuffer = (EB_S16*)&coeffBufferTB->bufferCb[tuChromaOriginIndex * sizeof(EB_S16)]; + + if (countNonZeroCoeffs[1]) { + + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + transformChromaSize, + type, + EB_INTRA_MODE_INVALID, + EB_INTRA_CHROMA_INVALID, + coeffBuffer, + MAX_LCU_SIZE >> 1, + COMPONENT_CHROMA_CB, + countNonZeroCoeffs[1], + cbTuCoeffBits); + } + + *cbTuCoeffBits = (*cbTuCoeffBits >> 15); + } + + // Estimate V Coeff bits + { + coeffBuffer = (EB_S16*)&coeffBufferTB->bufferCr[tuChromaOriginIndex * sizeof(EB_S16)]; + + if (countNonZeroCoeffs[2]) { + + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + transformChromaSize, + type, + EB_INTRA_MODE_INVALID, + EB_INTRA_CHROMA_INVALID, + coeffBuffer, + MAX_LCU_SIZE>>1, + COMPONENT_CHROMA_CR, + countNonZeroCoeffs[2], + crTuCoeffBits); + } + + *crTuCoeffBits = (*crTuCoeffBits >> 15); + } + + return return_error; +} + + +EB_ERRORTYPE TuEstimateCoeffBitsLuma( + EB_U32 tuOriginIndex, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_U32 yCountNonZeroCoeffs, + EB_U64 *yTuCoeffBits, + EB_U32 transformSize, + EB_MODETYPE type, + EB_U32 intraLumaMode, + EB_U32 partialFrequencyN2Flag, + EB_BOOL coeffCabacUpdate, + CoeffCtxtMdl_t *updatedCoeffCtxModel, + CabacCost_t *CabacCost) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + + EB_S16 *coeffBuffer; + + // Estimate Y Coeff bits + + coeffBuffer = (EB_S16*)&coeffPtr->bufferY[tuOriginIndex * sizeof(EB_S16)]; + + if (yCountNonZeroCoeffs) { + + if(coeffCabacUpdate) + EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( + updatedCoeffCtxModel, + CabacCost, + cabacEncodeCtxPtr, + (transformSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideY, + COMPONENT_LUMA, + yCountNonZeroCoeffs, + yTuCoeffBits); + else + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + (transformSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + EB_INTRA_CHROMA_DM, + coeffBuffer, + coeffPtr->strideY, + COMPONENT_LUMA, + yCountNonZeroCoeffs, + yTuCoeffBits); + } + + *yTuCoeffBits = (*yTuCoeffBits >> 15); + + + return return_error; +} + + + +EB_ERRORTYPE TuEstimateCoeffBits_R( + EB_U32 tuOriginIndex, + EB_U32 tuChromaOriginIndex, + EB_U32 componentMask, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_U32 yCountNonZeroCoeffs, + EB_U32 cbCountNonZeroCoeffs, + EB_U32 crCountNonZeroCoeffs, + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_MODETYPE type, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 partialFrequencyN2Flag, + EB_BOOL coeffCabacUpdate, + CoeffCtxtMdl_t *updatedCoeffCtxModel, + + CabacCost_t *CabacCost) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + + EB_S16 *coeffBuffer; + + //CHKN EB_U8 encoderModeIndex = (pictureControlSetPtr->ParentPcsPtr->encoderLevel == ENCODER_LEVEL_7) ? 0 : 1; + EB_U8 encoderModeIndex = 1; + + // Estimate Y Coeff bits + if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { + + coeffBuffer = (EB_S16*)&coeffPtr->bufferY[tuOriginIndex * sizeof(EB_S16)]; + + if (yCountNonZeroCoeffs) { + + if (coeffCabacUpdate) + EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( + updatedCoeffCtxModel, + CabacCost, + cabacEncodeCtxPtr, + (transformSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + intraChromaMode, + coeffBuffer, + coeffPtr->strideY, + COMPONENT_LUMA, + yCountNonZeroCoeffs, + yTuCoeffBits); + + else + + EstimateQuantizedCoefficients[encoderModeIndex][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + (transformSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + intraChromaMode, + coeffBuffer, + coeffPtr->strideY, + COMPONENT_LUMA, + yCountNonZeroCoeffs, + yTuCoeffBits); + + } + + *yTuCoeffBits = (*yTuCoeffBits >> 15); + } + + // Estimate U Coeff bits + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[tuChromaOriginIndex * sizeof(EB_S16)]; + + if (cbCountNonZeroCoeffs) { + + if (coeffCabacUpdate) + EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( + updatedCoeffCtxModel, + CabacCost, + cabacEncodeCtxPtr, + (transformChromaSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + intraChromaMode, + coeffBuffer, + coeffPtr->strideCb, + COMPONENT_CHROMA_CB, + cbCountNonZeroCoeffs, + cbTuCoeffBits); + else + + EstimateQuantizedCoefficients[encoderModeIndex][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + (transformChromaSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + intraChromaMode, + coeffBuffer, + coeffPtr->strideCb, + COMPONENT_CHROMA_CB, + cbCountNonZeroCoeffs, + cbTuCoeffBits); + + } + + *cbTuCoeffBits = (*cbTuCoeffBits >> 15); + } + + // Estimate V Coeff bits + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[tuChromaOriginIndex * sizeof(EB_S16)]; + + if (crCountNonZeroCoeffs) { + + if (coeffCabacUpdate) + EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( + updatedCoeffCtxModel, + CabacCost, + cabacEncodeCtxPtr, + (transformChromaSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + intraChromaMode, + coeffBuffer, + coeffPtr->strideCr, + COMPONENT_CHROMA_CR, + crCountNonZeroCoeffs, + crTuCoeffBits); + + else + + EstimateQuantizedCoefficients[encoderModeIndex][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + (transformChromaSize >> partialFrequencyN2Flag), + type, + intraLumaMode, + intraChromaMode, + coeffBuffer, + coeffPtr->strideCr, + COMPONENT_CHROMA_CR, + crCountNonZeroCoeffs, + crTuCoeffBits); + + } + + *crTuCoeffBits = (*crTuCoeffBits >> 15); + } + + return return_error; +} + +EB_ERRORTYPE EncodeSliceHeader( + EB_U32 firstLcuAddr, + EB_U32 pictureQp, + PictureControlSet_t *pcsPtr, + OutputBitstreamUnit_t *bitstreamPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CodeSliceHeader( + firstLcuAddr, + pictureQp, + bitstreamPtr, + pcsPtr); + + return return_error; +} + +EB_ERRORTYPE EncodeSliceFinish( + EntropyCoder_t *entropyCoderPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + + BacEncContextFinish(&(cabacEncodeCtxPtr->bacEncContext)); + // End of bitstream & byte align + + //pcBitstreamOut->write( 1, 1 ); + OutputBitstreamWrite( + &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf), + 1, + 1); + + //pcBitstreamOut->writeAlignZero(); + OutputBitstreamWriteAlignZero( + &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf)); + + return return_error; +} + +EB_ERRORTYPE EncodeTerminateLcu( + EntropyCoder_t *entropyCoderPtr, + EB_U32 lastLcuInSlice) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + + + BacEncContextTerminate( + &(cabacEncodeCtxPtr->bacEncContext), + lastLcuInSlice); + + return return_error; +} + +EB_ERRORTYPE ResetBitstream( + EB_PTR bitstreamPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr; + + OutputBitstreamReset( + outputBitstreamPtr); + + return return_error; +} + +EB_ERRORTYPE ResetEntropyCoder( + EncodeContext_t *encodeContextPtr, + EntropyCoder_t *entropyCoderPtr, + EB_U32 qp, + EB_PICTURE sliceType) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + CabacEncodeContext_t *cabacEncCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + ContextModelEncContext_t *cabacCtxModelArray = (ContextModelEncContext_t*)encodeContextPtr->cabacContextModelArray; + + // Increment the context model array pointer to point to the right address based on the QP and slice type + cabacCtxModelArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + qp; + + // Reset context models to initial values by copying from cabacContextModelArray + EB_MEMCPY(&(cabacEncCtxPtr->contextModelEncContext.splitFlagContextModel[0]), &(cabacCtxModelArray->splitFlagContextModel[0]), sizeof(EB_ContextModel)* TOTAL_NUMBER_OF_CABAC_CONTEXT_MODELS); + + // Reset Binary Arithmetic Coder (BAC) to initial values + ResetBacEnc( + &(cabacEncCtxPtr->bacEncContext)); + + return return_error; +} + +EB_ERRORTYPE FlushBitstream( + EB_PTR outputBitstreamPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + + OutputBitstreamFlushBuffer((OutputBitstreamUnit_t *)outputBitstreamPtr); + + return return_error; +} + +/************************************************** +* EncodeAUD +**************************************************/ +EB_ERRORTYPE EncodeAUD( + Bitstream_t *bitstreamPtr, + EB_PICTURE sliceType, + EB_U32 temporalId) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 picType; + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; + + picType = (sliceType == EB_I_PICTURE) ? 0 : + (sliceType == EB_P_PICTURE) ? 1 : + 2; + + CodeNALUnitHeader( + outputBitstreamPtr, + NAL_UNIT_ACCESS_UNIT_DELIMITER, + temporalId); + + // picture type + WriteCodeCavlc( + outputBitstreamPtr, + picType, + 3); + + // Byte Align the Bitstream: rbsp_trailing_bits + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); + + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); + + return return_error; +} + +/************************************************** +* EncodeVPS +**************************************************/ +EB_ERRORTYPE EncodeVPS( + Bitstream_t *bitstreamPtr, + SequenceControlSet_t *scsPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; + + CodeVPS( + outputBitstreamPtr, + scsPtr); + + // Byte Align the Bitstream + + //bs_SPS_PPS_SEI.write( 1, 1 ); + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); + + //bs_SPS_PPS_SEI.writeAlignZero(); + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); + + return return_error; +} + +/************************************************** +* EncodeSPS +**************************************************/ +EB_ERRORTYPE EncodeSPS( + Bitstream_t *bitstreamPtr, + SequenceControlSet_t *scsPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; + + CodeSPS( + outputBitstreamPtr, + scsPtr); + + // Byte Align the Bitstream + + //bs_SPS_PPS_SEI.write( 1, 1 ); + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); + + //bs_SPS_PPS_SEI.writeAlignZero(); + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); + + return return_error; +} +/************************************************** +* EncodePPS +**************************************************/ +EB_ERRORTYPE EncodePPS( + Bitstream_t *bitstreamPtr, + SequenceControlSet_t *scsPtr, + EbPPSConfig_t *ppsConfig) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; + + CodePPS( + outputBitstreamPtr, + scsPtr, + ppsConfig); + + // Byte Align the Bitstream + + //bs_SPS_PPS_SEI.write( 1, 1 ); + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); + + //bs_SPS_PPS_SEI.writeAlignZero(); + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); + + return return_error; +} + +EB_ERRORTYPE CodeBufferingPeriodSEI( + OutputBitstreamUnit_t *bitstreamPtr, + AppBufferingPeriodSei_t *bufferingPeriodPtr, + AppVideoUsabilityInfo_t *vuiPtr, + EncodeContext_t *encodeContextPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 nalVclIndex; + EB_U32 cpbIndex; + + // bp_seq_parameter_set_id + WriteUvlc( + bitstreamPtr, + bufferingPeriodPtr->bpSeqParameterSetId); + + if (!vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag){ + // rap_cpb_params_present_flag + WriteFlagCavlc( + bitstreamPtr, + bufferingPeriodPtr->rapCpbParamsPresentFlag); + } + + if (bufferingPeriodPtr->rapCpbParamsPresentFlag){ + // cpb_delay_offset + WriteCodeCavlc( + bitstreamPtr, + bufferingPeriodPtr->cpbDelayOffset, + vuiPtr->hrdParametersPtr->auCpbRemovalDelayLengthMinus1 + 1); + // dpb_delay_offset + WriteCodeCavlc( + bitstreamPtr, + bufferingPeriodPtr->dpbDelayOffset, + vuiPtr->hrdParametersPtr->dpbOutputDelayDuLengthMinus1 + 1); + } + + // concatenation_flag + WriteFlagCavlc( + bitstreamPtr, + bufferingPeriodPtr->concatenationFlag); + + // au_cpb_removal_delay_delta_minus1 + WriteCodeCavlc( + bitstreamPtr, + bufferingPeriodPtr->auCpbRemovalDelayDeltaMinus1, + vuiPtr->hrdParametersPtr->auCpbRemovalDelayLengthMinus1 + 1); + + for (nalVclIndex = 0; nalVclIndex < 2; ++nalVclIndex){ + if ((nalVclIndex == 0 && vuiPtr->hrdParametersPtr->nalHrdParametersPresentFlag) || + (nalVclIndex == 1 && vuiPtr->hrdParametersPtr->vclHrdParametersPresentFlag)){ + + CHECK_REPORT_ERROR( + (vuiPtr->hrdParametersPtr->cpbCountMinus1[0] < MAX_CPB_COUNT), + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR14); + + for (cpbIndex = 0; cpbIndex < vuiPtr->hrdParametersPtr->cpbCountMinus1[0] + 1; ++cpbIndex){ + // initial_cpb_removal_delay + WriteCodeCavlc( + bitstreamPtr, + bufferingPeriodPtr->initialCpbRemovalDelay[nalVclIndex][cpbIndex], + vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); + + // initial_cpb_removal_delay_offset + WriteCodeCavlc( + bitstreamPtr, + bufferingPeriodPtr->initialCpbRemovalDelayOffset[nalVclIndex][cpbIndex], + vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); + + if (vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag || bufferingPeriodPtr->rapCpbParamsPresentFlag){ + // initial_alt_cpb_removal_delay + WriteCodeCavlc( + bitstreamPtr, + bufferingPeriodPtr->initialAltCpbRemovalDelay[nalVclIndex][cpbIndex], + vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); + + // initial_alt_cpb_removal_delay_offset + WriteCodeCavlc( + bitstreamPtr, + bufferingPeriodPtr->initialAltCpbRemovalDelayOffset[nalVclIndex][cpbIndex], + vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); + } + } + } + } + + if (bitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_one + WriteFlagCavlc( + bitstreamPtr, + 1); + + while (bitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_zero + WriteFlagCavlc( + bitstreamPtr, + 0); + } + } + + return return_error; +} + +EB_ERRORTYPE CodeActiveParameterSetSEI( + OutputBitstreamUnit_t *bitstreamPtr, + AppActiveparameterSetSei_t *activeParameterSet) +{ + EB_U32 i; + EB_ERRORTYPE return_error = EB_ErrorNone; + //active_vps_id + WriteCodeCavlc(bitstreamPtr, activeParameterSet->activeVideoParameterSetid, 4); + //self_contained_flag + WriteFlagCavlc(bitstreamPtr, activeParameterSet->selfContainedCvsFlag); + //no_param_set_update_flag + WriteFlagCavlc(bitstreamPtr, activeParameterSet->noParameterSetUpdateFlag); + //num_sps_ids_minus1 + WriteUvlc(bitstreamPtr, activeParameterSet->numSpsIdsMinus1); + //active_seq_param_set_id + for (i = 0; i <= activeParameterSet->numSpsIdsMinus1; i++) + { + WriteUvlc(bitstreamPtr, activeParameterSet->activeSeqParameterSetId); + } + if (bitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_one + WriteFlagCavlc( + bitstreamPtr, + 1); + + while (bitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_zero + WriteFlagCavlc( + bitstreamPtr, + 0); } - else - ++cuIndex; - - } while (cuIndex < CU_MAX_COUNT); - + } return return_error; } -EB_ERRORTYPE TuEstimateCoeffBitsEncDec( - EB_U32 tuOriginIndex, - EB_U32 tuChromaOriginIndex, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffBufferTB, - EB_U32 countNonZeroCoeffs[3], - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_MODETYPE type, - CabacCost_t *CabacCost) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; - - EB_S16 *coeffBuffer; - // Estimate Y Coeff bits - { - - coeffBuffer = (EB_S16*)&coeffBufferTB->bufferY[tuOriginIndex * sizeof(EB_S16)]; - - if (countNonZeroCoeffs[0]) { - - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - transformSize, - type, - EB_INTRA_MODE_INVALID, - EB_INTRA_CHROMA_INVALID, - coeffBuffer, - MAX_LCU_SIZE, - COMPONENT_LUMA, - countNonZeroCoeffs[0], - yTuCoeffBits); - - } - - *yTuCoeffBits = (*yTuCoeffBits >> 15); - } - - // Estimate U Coeff bits - { - coeffBuffer = (EB_S16*)&coeffBufferTB->bufferCb[tuChromaOriginIndex * sizeof(EB_S16)]; - - if (countNonZeroCoeffs[1]) { - - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - transformChromaSize, - type, - EB_INTRA_MODE_INVALID, - EB_INTRA_CHROMA_INVALID, - coeffBuffer, - MAX_LCU_SIZE >> 1, - COMPONENT_CHROMA_CB, - countNonZeroCoeffs[1], - cbTuCoeffBits); - } - - *cbTuCoeffBits = (*cbTuCoeffBits >> 15); - } - - // Estimate V Coeff bits - { - coeffBuffer = (EB_S16*)&coeffBufferTB->bufferCr[tuChromaOriginIndex * sizeof(EB_S16)]; - - if (countNonZeroCoeffs[2]) { - - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - transformChromaSize, - type, - EB_INTRA_MODE_INVALID, - EB_INTRA_CHROMA_INVALID, - coeffBuffer, - MAX_LCU_SIZE>>1, - COMPONENT_CHROMA_CR, - countNonZeroCoeffs[2], - crTuCoeffBits); - } - - *crTuCoeffBits = (*crTuCoeffBits >> 15); - } - - return return_error; -} - +EB_ERRORTYPE CodePictureTimingSEI( + OutputBitstreamUnit_t *bitstreamPtr, + AppPictureTimingSei_t *picTimingSeiPtr, + AppVideoUsabilityInfo_t *vuiPtr, + EncodeContext_t *encodeContextPtr, + EB_U8 pictStruct) -EB_ERRORTYPE TuEstimateCoeffBitsLuma( - EB_U32 tuOriginIndex, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_U32 yCountNonZeroCoeffs, - EB_U64 *yTuCoeffBits, - EB_U32 transformSize, - EB_MODETYPE type, - EB_U32 intraLumaMode, - EB_U32 partialFrequencyN2Flag, - EB_BOOL coeffCabacUpdate, - CoeffCtxtMdl_t *updatedCoeffCtxModel, - CabacCost_t *CabacCost) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; - - EB_S16 *coeffBuffer; - - // Estimate Y Coeff bits + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 decodingUnitIndex; - coeffBuffer = (EB_S16*)&coeffPtr->bufferY[tuOriginIndex * sizeof(EB_S16)]; + if (vuiPtr->frameFieldInfoPresentFlag){ + // pic_struct + WriteCodeCavlc( + bitstreamPtr, - if (yCountNonZeroCoeffs) { + pictStruct, - if(coeffCabacUpdate) - EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( - updatedCoeffCtxModel, - CabacCost, - cabacEncodeCtxPtr, - (transformSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideY, - COMPONENT_LUMA, - yCountNonZeroCoeffs, - yTuCoeffBits); - else - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - (transformSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - EB_INTRA_CHROMA_DM, - coeffBuffer, - coeffPtr->strideY, - COMPONENT_LUMA, - yCountNonZeroCoeffs, - yTuCoeffBits); - } + 4); - *yTuCoeffBits = (*yTuCoeffBits >> 15); + // source_scan_type + WriteCodeCavlc( + bitstreamPtr, + picTimingSeiPtr->sourceScanType, + 2); + // duplicate_flag + WriteFlagCavlc( + bitstreamPtr, + picTimingSeiPtr->duplicateFlag); + } - return return_error; -} + if (vuiPtr->hrdParametersPtr->cpbDpbDelaysPresentFlag){ + // au_cpb_removal_delay_minus1 + WriteCodeCavlc( + bitstreamPtr, + picTimingSeiPtr->auCpbRemovalDelayMinus1, + vuiPtr->hrdParametersPtr->auCpbRemovalDelayLengthMinus1 + 1); + // pic_dpb_output_delay + WriteCodeCavlc( + bitstreamPtr, + picTimingSeiPtr->picDpbOutputDelay, + vuiPtr->hrdParametersPtr->dpbOutputDelayLengthMinus1 + 1); + if (vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag){ + // pic_dpb_output_du_delay + WriteCodeCavlc( + bitstreamPtr, + picTimingSeiPtr->picDpbOutputDuDelay, + vuiPtr->hrdParametersPtr->dpbOutputDelayDuLengthMinus1 + 1); + } -EB_ERRORTYPE TuEstimateCoeffBits_R( - EB_U32 tuOriginIndex, - EB_U32 tuChromaOriginIndex, - EB_U32 componentMask, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_U32 yCountNonZeroCoeffs, - EB_U32 cbCountNonZeroCoeffs, - EB_U32 crCountNonZeroCoeffs, - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_MODETYPE type, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 partialFrequencyN2Flag, - EB_BOOL coeffCabacUpdate, - CoeffCtxtMdl_t *updatedCoeffCtxModel, + if (vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag && vuiPtr->hrdParametersPtr->subPicCpbParamsPicTimingSeiFlag){ + // num_decoding_units_minus1 + WriteUvlc( + bitstreamPtr, + picTimingSeiPtr->numDecodingUnitsMinus1); - CabacCost_t *CabacCost) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + // du_common_cpb_removal_delay_flag + WriteFlagCavlc( + bitstreamPtr, + picTimingSeiPtr->duCommonCpbRemovalDelayFlag); - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + if (picTimingSeiPtr->duCommonCpbRemovalDelayFlag){ + // du_common_cpb_removal_delay_minus1 + WriteCodeCavlc( + bitstreamPtr, + picTimingSeiPtr->duCommonCpbRemovalDelayMinus1, + vuiPtr->hrdParametersPtr->duCpbRemovalDelayLengthMinus1 + 1); + } - EB_S16 *coeffBuffer; + CHECK_REPORT_ERROR( + (picTimingSeiPtr->numDecodingUnitsMinus1 < MAX_CPB_COUNT), + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR15); - //CHKN EB_U8 encoderModeIndex = (pictureControlSetPtr->ParentPcsPtr->encoderLevel == ENCODER_LEVEL_7) ? 0 : 1; - EB_U8 encoderModeIndex = 1; + for (decodingUnitIndex = 0; decodingUnitIndex <= picTimingSeiPtr->numDecodingUnitsMinus1; ++decodingUnitIndex){ + // num_nalus_in_du_minus1 + WriteUvlc( + bitstreamPtr, + picTimingSeiPtr->numNalusInDuMinus1); - // Estimate Y Coeff bits - if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { + if (!picTimingSeiPtr->duCommonCpbRemovalDelayFlag && decodingUnitIndex < picTimingSeiPtr->numDecodingUnitsMinus1){ + // du_cpb_removal_delay_minus1 + WriteCodeCavlc( + bitstreamPtr, + picTimingSeiPtr->duCpbRemovalDelayMinus1[decodingUnitIndex], + vuiPtr->hrdParametersPtr->duCpbRemovalDelayLengthMinus1 + 1); + } + } + } + } - coeffBuffer = (EB_S16*)&coeffPtr->bufferY[tuOriginIndex * sizeof(EB_S16)]; + if (bitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_one + WriteFlagCavlc( + bitstreamPtr, + 1); - if (yCountNonZeroCoeffs) { + while (bitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_zero + WriteFlagCavlc( + bitstreamPtr, + 0); + } + } - if (coeffCabacUpdate) - EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( - updatedCoeffCtxModel, - CabacCost, - cabacEncodeCtxPtr, - (transformSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - intraChromaMode, - coeffBuffer, - coeffPtr->strideY, - COMPONENT_LUMA, - yCountNonZeroCoeffs, - yTuCoeffBits); + return return_error; +} - else - EstimateQuantizedCoefficients[encoderModeIndex][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - (transformSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - intraChromaMode, - coeffBuffer, - coeffPtr->strideY, - COMPONENT_LUMA, - yCountNonZeroCoeffs, - yTuCoeffBits); - - } - - *yTuCoeffBits = (*yTuCoeffBits >> 15); - } - - // Estimate U Coeff bits - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - coeffBuffer = (EB_S16*)&coeffPtr->bufferCb[tuChromaOriginIndex * sizeof(EB_S16)]; - - if (cbCountNonZeroCoeffs) { - - if (coeffCabacUpdate) - EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( - updatedCoeffCtxModel, - CabacCost, - cabacEncodeCtxPtr, - (transformChromaSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - intraChromaMode, - coeffBuffer, - coeffPtr->strideCb, - COMPONENT_CHROMA_CB, - cbCountNonZeroCoeffs, - cbTuCoeffBits); - else +////////////////////////////////////// +//// ADD NEW SEI messages BELOW +//// Use the example below +///////////////////////////////////// - EstimateQuantizedCoefficients[encoderModeIndex][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - (transformChromaSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - intraChromaMode, - coeffBuffer, - coeffPtr->strideCb, - COMPONENT_CHROMA_CB, - cbCountNonZeroCoeffs, - cbTuCoeffBits); +EB_ERRORTYPE EncodePictureTimingSEI( + Bitstream_t *bitstreamPtr, + AppPictureTimingSei_t *picTimingSeiPtr, + AppVideoUsabilityInfo_t *vuiPtr, + EncodeContext_t *encodeContextPtr, + EB_U8 pictStruct, + EB_U8 temporalId) - } +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + unsigned payloadType = PICTURE_TIMING; - *cbTuCoeffBits = (*cbTuCoeffBits >> 15); - } + // Note: payloadSize is sent as 0 as we are currently not populating picture timing message, this will change soon + unsigned payloadSize; - // Estimate V Coeff bits - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - coeffBuffer = (EB_S16*)&coeffPtr->bufferCr[tuChromaOriginIndex * sizeof(EB_S16)]; + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - if (crCountNonZeroCoeffs) { + CodeNALUnitHeader( + outputBitstreamPtr, + NAL_UNIT_PREFIX_SEI, + temporalId); - if (coeffCabacUpdate) - EstimateQuantizedCoefficientsUpdate[!!(ASM_TYPES & PREAVX2_MASK)]( - updatedCoeffCtxModel, - CabacCost, - cabacEncodeCtxPtr, - (transformChromaSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - intraChromaMode, - coeffBuffer, - coeffPtr->strideCr, - COMPONENT_CHROMA_CR, - crCountNonZeroCoeffs, - crTuCoeffBits); + payloadSize = GetPictureTimingSEILength( + picTimingSeiPtr, + vuiPtr); - else + for (; payloadType >= 0xff; payloadType -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadType, + 8); - EstimateQuantizedCoefficients[encoderModeIndex][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - (transformChromaSize >> partialFrequencyN2Flag), - type, - intraLumaMode, - intraChromaMode, - coeffBuffer, - coeffPtr->strideCr, - COMPONENT_CHROMA_CR, - crCountNonZeroCoeffs, - crTuCoeffBits); + for (; payloadSize >= 0xff; payloadSize -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadSize, + 8); - } + // Picture Timing SEI data - *crTuCoeffBits = (*crTuCoeffBits >> 15); - } + CodePictureTimingSEI( + outputBitstreamPtr, + picTimingSeiPtr, + vuiPtr, + encodeContextPtr, + pictStruct); - return return_error; -} -EB_ERRORTYPE EncodeSliceHeader( - EB_U32 firstLcuAddr, - EB_U32 pictureQp, - PictureControlSet_t *pcsPtr, - OutputBitstreamUnit_t *bitstreamPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + // Byte Align the Bitstream + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); - CodeSliceHeader( - firstLcuAddr, - pictureQp, - bitstreamPtr, - pcsPtr); + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); - return return_error; + return return_error; } -EB_ERRORTYPE EncodeSliceFinish( - EntropyCoder_t *entropyCoderPtr) +EB_ERRORTYPE EncodeBufferingPeriodSEI( + Bitstream_t *bitstreamPtr, + AppBufferingPeriodSei_t *bufferingPeriodPtr, + AppVideoUsabilityInfo_t *vuiPtr, + EncodeContext_t *encodeContextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; - - BacEncContextFinish(&(cabacEncodeCtxPtr->bacEncContext)); - // End of bitstream & byte align - - //pcBitstreamOut->write( 1, 1 ); - OutputBitstreamWrite( - &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf), - 1, - 1); + EB_ERRORTYPE return_error = EB_ErrorNone; + unsigned payloadType = BUFFERING_PERIOD; - //pcBitstreamOut->writeAlignZero(); - OutputBitstreamWriteAlignZero( - &(cabacEncodeCtxPtr->bacEncContext.m_pcTComBitIf)); + // Note: payloadSize is fixed temporarily, this may change in future based on what is sent in CodeBufferingPeriod + unsigned payloadSize; - return return_error; -} + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; -EB_ERRORTYPE EncodeTerminateLcu( - EntropyCoder_t *entropyCoderPtr, - EB_U32 lastLcuInSlice) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + CodeNALUnitHeader( + outputBitstreamPtr, + NAL_UNIT_PREFIX_SEI, + 0); - CabacEncodeContext_t *cabacEncodeCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + payloadSize = GetBufPeriodSEILength( + bufferingPeriodPtr, + vuiPtr); + for (; payloadType >= 0xff; payloadType -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadType, + 8); - BacEncContextTerminate( - &(cabacEncodeCtxPtr->bacEncContext), - lastLcuInSlice); + for (; payloadSize >= 0xff; payloadSize -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadSize, + 8); - return return_error; -} + // Buffering Period SEI data + CodeBufferingPeriodSEI( + outputBitstreamPtr, + bufferingPeriodPtr, + vuiPtr, + encodeContextPtr); -EB_ERRORTYPE ResetBitstream( - EB_PTR bitstreamPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr; + // Byte Align the Bitstream + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); - OutputBitstreamReset( - outputBitstreamPtr); + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); - return return_error; + return return_error; } -EB_ERRORTYPE ResetEntropyCoder( - EncodeContext_t *encodeContextPtr, - EntropyCoder_t *entropyCoderPtr, - EB_U32 qp, - EB_PICTURE sliceType) +EB_ERRORTYPE EncodeActiveParameterSetsSEI( + Bitstream_t *bitstreamPtr, + AppActiveparameterSetSei_t *activeParameterSet) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - CabacEncodeContext_t *cabacEncCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; - ContextModelEncContext_t *cabacCtxModelArray = (ContextModelEncContext_t*)encodeContextPtr->cabacContextModelArray; - - // Increment the context model array pointer to point to the right address based on the QP and slice type - cabacCtxModelArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + qp; - - // Reset context models to initial values by copying from cabacContextModelArray - EB_MEMCPY(&(cabacEncCtxPtr->contextModelEncContext.splitFlagContextModel[0]), &(cabacCtxModelArray->splitFlagContextModel[0]), sizeof(EB_ContextModel)* TOTAL_NUMBER_OF_CABAC_CONTEXT_MODELS); - - // Reset Binary Arithmetic Coder (BAC) to initial values - ResetBacEnc( - &(cabacEncCtxPtr->bacEncContext)); - - return return_error; -} + EB_ERRORTYPE return_error = EB_ErrorNone; + unsigned payloadType = ACTIVE_PARAMETER_SETS; -EB_ERRORTYPE FlushBitstream( - EB_PTR outputBitstreamPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; + // Note: payloadSize is fixed temporarily, this may change in future based on what is sent in CodeActiveParameterSet + unsigned payloadSize; - OutputBitstreamFlushBuffer((OutputBitstreamUnit_t *)outputBitstreamPtr); + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - return return_error; -} + CodeNALUnitHeader( + outputBitstreamPtr, + NAL_UNIT_PREFIX_SEI, + 0); -/************************************************** -* EncodeAUD -**************************************************/ -EB_ERRORTYPE EncodeAUD( - Bitstream_t *bitstreamPtr, - EB_PICTURE sliceType, - EB_U32 temporalId) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 picType; - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - picType = (sliceType == EB_I_PICTURE) ? 0 : - (sliceType == EB_P_PICTURE) ? 1 : - 2; - - CodeNALUnitHeader( - outputBitstreamPtr, - NAL_UNIT_ACCESS_UNIT_DELIMITER, - temporalId); - - // picture type - WriteCodeCavlc( - outputBitstreamPtr, - picType, - 3); - - // Byte Align the Bitstream: rbsp_trailing_bits - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); - - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); - - return return_error; -} + payloadSize = GetActiveParameterSetSEILength( + activeParameterSet); -/************************************************** -* EncodeVPS -**************************************************/ -EB_ERRORTYPE EncodeVPS( - Bitstream_t *bitstreamPtr, - SequenceControlSet_t *scsPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; + for (; payloadType >= 0xff; payloadType -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadType, + 8); - CodeVPS( - outputBitstreamPtr, - scsPtr); + for (; payloadSize >= 0xff; payloadSize -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadSize, + 8); - // Byte Align the Bitstream + // Active Parameter Set SEI data + CodeActiveParameterSetSEI( + outputBitstreamPtr, + activeParameterSet); - //bs_SPS_PPS_SEI.write( 1, 1 ); - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); + // Byte Align the Bitstream + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); - //bs_SPS_PPS_SEI.writeAlignZero(); - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); - return return_error; + return return_error; } -/************************************************** -* EncodeSPS -**************************************************/ -EB_ERRORTYPE EncodeSPS( - Bitstream_t *bitstreamPtr, - SequenceControlSet_t *scsPtr) +EB_ERRORTYPE EncodeFillerData( + Bitstream_t *bitstreamPtr, + EB_U8 temporalId) { - EB_ERRORTYPE return_error = EB_ErrorNone; - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - CodeSPS( - outputBitstreamPtr, - scsPtr); - - // Byte Align the Bitstream - - //bs_SPS_PPS_SEI.write( 1, 1 ); - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); + EB_ERRORTYPE return_error = EB_ErrorNone; - //bs_SPS_PPS_SEI.writeAlignZero(); - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - return return_error; + CodeNALUnitHeader( + outputBitstreamPtr, + NAL_UNIT_FILLER_DATA, + temporalId); + return return_error; } -/************************************************** -* EncodePPS -**************************************************/ -EB_ERRORTYPE EncodePPS( - Bitstream_t *bitstreamPtr, - SequenceControlSet_t *scsPtr, - EbPPSConfig_t *ppsConfig) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - CodePPS( - outputBitstreamPtr, - scsPtr, - ppsConfig); +EB_ERRORTYPE EncodeRegUserDataSEI( + Bitstream_t *bitstreamPtr, + RegistedUserData_t *regUserDataSeiPtr) +{ + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 index; + unsigned payloadType = REG_USER_DATA; - // Byte Align the Bitstream + unsigned payloadSize = regUserDataSeiPtr->userDataSize; - //bs_SPS_PPS_SEI.write( 1, 1 ); - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - //bs_SPS_PPS_SEI.writeAlignZero(); - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); + CodeNALUnitHeader( + outputBitstreamPtr, + NAL_UNIT_PREFIX_SEI, + 0); - return return_error; -} + for (; payloadType >= 0xff; payloadType -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadType, + 8); -EB_ERRORTYPE CodeBufferingPeriodSEI( - OutputBitstreamUnit_t *bitstreamPtr, - AppBufferingPeriodSei_t *bufferingPeriodPtr, - AppVideoUsabilityInfo_t *vuiPtr, - EncodeContext_t *encodeContextPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 nalVclIndex; - EB_U32 cpbIndex; - - // bp_seq_parameter_set_id - WriteUvlc( - bitstreamPtr, - bufferingPeriodPtr->bpSeqParameterSetId); - - if (!vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag){ - // rap_cpb_params_present_flag - WriteFlagCavlc( - bitstreamPtr, - bufferingPeriodPtr->rapCpbParamsPresentFlag); - } - - if (bufferingPeriodPtr->rapCpbParamsPresentFlag){ - // cpb_delay_offset - WriteCodeCavlc( - bitstreamPtr, - bufferingPeriodPtr->cpbDelayOffset, - vuiPtr->hrdParametersPtr->auCpbRemovalDelayLengthMinus1 + 1); - // dpb_delay_offset - WriteCodeCavlc( - bitstreamPtr, - bufferingPeriodPtr->dpbDelayOffset, - vuiPtr->hrdParametersPtr->dpbOutputDelayDuLengthMinus1 + 1); - } - - // concatenation_flag - WriteFlagCavlc( - bitstreamPtr, - bufferingPeriodPtr->concatenationFlag); - - // au_cpb_removal_delay_delta_minus1 - WriteCodeCavlc( - bitstreamPtr, - bufferingPeriodPtr->auCpbRemovalDelayDeltaMinus1, - vuiPtr->hrdParametersPtr->auCpbRemovalDelayLengthMinus1 + 1); - - for (nalVclIndex = 0; nalVclIndex < 2; ++nalVclIndex){ - if ((nalVclIndex == 0 && vuiPtr->hrdParametersPtr->nalHrdParametersPresentFlag) || - (nalVclIndex == 1 && vuiPtr->hrdParametersPtr->vclHrdParametersPresentFlag)){ - - CHECK_REPORT_ERROR( - (vuiPtr->hrdParametersPtr->cpbCountMinus1[0] < MAX_CPB_COUNT), - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR14); - - for (cpbIndex = 0; cpbIndex < vuiPtr->hrdParametersPtr->cpbCountMinus1[0] + 1; ++cpbIndex){ - // initial_cpb_removal_delay - WriteCodeCavlc( - bitstreamPtr, - bufferingPeriodPtr->initialCpbRemovalDelay[nalVclIndex][cpbIndex], - vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); - - // initial_cpb_removal_delay_offset - WriteCodeCavlc( - bitstreamPtr, - bufferingPeriodPtr->initialCpbRemovalDelayOffset[nalVclIndex][cpbIndex], - vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); - - if (vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag || bufferingPeriodPtr->rapCpbParamsPresentFlag){ - // initial_alt_cpb_removal_delay - WriteCodeCavlc( - bitstreamPtr, - bufferingPeriodPtr->initialAltCpbRemovalDelay[nalVclIndex][cpbIndex], - vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); - - // initial_alt_cpb_removal_delay_offset - WriteCodeCavlc( - bitstreamPtr, - bufferingPeriodPtr->initialAltCpbRemovalDelayOffset[nalVclIndex][cpbIndex], - vuiPtr->hrdParametersPtr->initialCpbRemovalDelayLengthMinus1 + 1); - } - } - } - } - - if (bitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_one - WriteFlagCavlc( - bitstreamPtr, - 1); - - while (bitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_zero - WriteFlagCavlc( - bitstreamPtr, - 0); - } - } - - return return_error; -} + for (; payloadSize >= 0xff; payloadSize -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadSize, + 8); -EB_ERRORTYPE CodeActiveParameterSetSEI( - OutputBitstreamUnit_t *bitstreamPtr, - AppActiveparameterSetSei_t *activeParameterSet) -{ - EB_U32 i; - EB_ERRORTYPE return_error = EB_ErrorNone; - //active_vps_id - WriteCodeCavlc(bitstreamPtr, activeParameterSet->activeVideoParameterSetid, 4); - //self_contained_flag - WriteFlagCavlc(bitstreamPtr, activeParameterSet->selfContainedCvsFlag); - //no_param_set_update_flag - WriteFlagCavlc(bitstreamPtr, activeParameterSet->noParameterSetUpdateFlag); - //num_sps_ids_minus1 - WriteUvlc(bitstreamPtr, activeParameterSet->numSpsIdsMinus1); - //active_seq_param_set_id - for (i = 0; i <= activeParameterSet->numSpsIdsMinus1; i++) - { - WriteUvlc(bitstreamPtr, activeParameterSet->activeSeqParameterSetId); + for (index = 0; index < payloadSize; ++index){ + // user_data + WriteCodeCavlc( + outputBitstreamPtr, + regUserDataSeiPtr->userData[index], + 8); } - if (bitstreamPtr->writtenBitsCount % 8 != 0) { + + if (outputBitstreamPtr->writtenBitsCount % 8 != 0) { // bit_equal_to_one WriteFlagCavlc( - bitstreamPtr, + outputBitstreamPtr, 1); - while (bitstreamPtr->writtenBitsCount % 8 != 0) { + while (outputBitstreamPtr->writtenBitsCount % 8 != 0) { // bit_equal_to_zero WriteFlagCavlc( - bitstreamPtr, + outputBitstreamPtr, 0); } } + // Byte Align the Bitstream + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); + + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); + return return_error; } -EB_ERRORTYPE CodePictureTimingSEI( - OutputBitstreamUnit_t *bitstreamPtr, - AppPictureTimingSei_t *picTimingSeiPtr, - AppVideoUsabilityInfo_t *vuiPtr, - EncodeContext_t *encodeContextPtr, - EB_U8 pictStruct) - +EB_ERRORTYPE EncodeUnregUserDataSEI( + Bitstream_t *bitstreamPtr, + UnregistedUserData_t *unregUserDataSeiPtr, + EncodeContext_t *encodeContextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 decodingUnitIndex; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 index; + unsigned payloadType = UNREG_USER_DATA; - if (vuiPtr->frameFieldInfoPresentFlag){ - // pic_struct - WriteCodeCavlc( - bitstreamPtr, + unsigned payloadSize = unregUserDataSeiPtr->userDataSize + 16 ; - pictStruct, + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - 4); - - // source_scan_type - WriteCodeCavlc( - bitstreamPtr, - picTimingSeiPtr->sourceScanType, - 2); - - // duplicate_flag - WriteFlagCavlc( - bitstreamPtr, - picTimingSeiPtr->duplicateFlag); - } - - if (vuiPtr->hrdParametersPtr->cpbDpbDelaysPresentFlag){ - // au_cpb_removal_delay_minus1 - WriteCodeCavlc( - bitstreamPtr, - picTimingSeiPtr->auCpbRemovalDelayMinus1, - vuiPtr->hrdParametersPtr->auCpbRemovalDelayLengthMinus1 + 1); - - // pic_dpb_output_delay - WriteCodeCavlc( - bitstreamPtr, - picTimingSeiPtr->picDpbOutputDelay, - vuiPtr->hrdParametersPtr->dpbOutputDelayLengthMinus1 + 1); - - if (vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag){ - // pic_dpb_output_du_delay - WriteCodeCavlc( - bitstreamPtr, - picTimingSeiPtr->picDpbOutputDuDelay, - vuiPtr->hrdParametersPtr->dpbOutputDelayDuLengthMinus1 + 1); - } - - if (vuiPtr->hrdParametersPtr->subPicCpbParamsPresentFlag && vuiPtr->hrdParametersPtr->subPicCpbParamsPicTimingSeiFlag){ - // num_decoding_units_minus1 - WriteUvlc( - bitstreamPtr, - picTimingSeiPtr->numDecodingUnitsMinus1); - - // du_common_cpb_removal_delay_flag - WriteFlagCavlc( - bitstreamPtr, - picTimingSeiPtr->duCommonCpbRemovalDelayFlag); - - if (picTimingSeiPtr->duCommonCpbRemovalDelayFlag){ - // du_common_cpb_removal_delay_minus1 - WriteCodeCavlc( - bitstreamPtr, - picTimingSeiPtr->duCommonCpbRemovalDelayMinus1, - vuiPtr->hrdParametersPtr->duCpbRemovalDelayLengthMinus1 + 1); - } - - CHECK_REPORT_ERROR( - (picTimingSeiPtr->numDecodingUnitsMinus1 < MAX_CPB_COUNT), - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR15); - - for (decodingUnitIndex = 0; decodingUnitIndex <= picTimingSeiPtr->numDecodingUnitsMinus1; ++decodingUnitIndex){ - // num_nalus_in_du_minus1 - WriteUvlc( - bitstreamPtr, - picTimingSeiPtr->numNalusInDuMinus1); - - if (!picTimingSeiPtr->duCommonCpbRemovalDelayFlag && decodingUnitIndex < picTimingSeiPtr->numDecodingUnitsMinus1){ - // du_cpb_removal_delay_minus1 - WriteCodeCavlc( - bitstreamPtr, - picTimingSeiPtr->duCpbRemovalDelayMinus1[decodingUnitIndex], - vuiPtr->hrdParametersPtr->duCpbRemovalDelayLengthMinus1 + 1); - } - } - } - } - - if (bitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_one - WriteFlagCavlc( - bitstreamPtr, - 1); - - while (bitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_zero - WriteFlagCavlc( - bitstreamPtr, - 0); - } - } - - return return_error; -} + CHECK_REPORT_ERROR( + (payloadSize >= 16), + encodeContextPtr->appCallbackPtr, + EB_ENC_EC_ERROR16); -////////////////////////////////////// -//// ADD NEW SEI messages BELOW -//// Use the example below -///////////////////////////////////// + CodeNALUnitHeader( + outputBitstreamPtr, + NAL_UNIT_PREFIX_SEI, + 0); -EB_ERRORTYPE EncodePictureTimingSEI( - Bitstream_t *bitstreamPtr, - AppPictureTimingSei_t *picTimingSeiPtr, - AppVideoUsabilityInfo_t *vuiPtr, - EncodeContext_t *encodeContextPtr, - EB_U8 pictStruct, - EB_U8 temporalId) + for (; payloadType >= 0xff; payloadType -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadType, + 8); -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - unsigned payloadType = PICTURE_TIMING; - - // Note: payloadSize is sent as 0 as we are currently not populating picture timing message, this will change soon - unsigned payloadSize; - - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - CodeNALUnitHeader( - outputBitstreamPtr, - NAL_UNIT_PREFIX_SEI, - temporalId); - - payloadSize = GetPictureTimingSEILength( - picTimingSeiPtr, - vuiPtr); - - for (; payloadType >= 0xff; payloadType -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadType, - 8); - - for (; payloadSize >= 0xff; payloadSize -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadSize, - 8); - - // Picture Timing SEI data - - CodePictureTimingSEI( - outputBitstreamPtr, - picTimingSeiPtr, - vuiPtr, - encodeContextPtr, - pictStruct); + for (; payloadSize >= 0xff; payloadSize -= 0xff) { + OutputBitstreamWrite( + outputBitstreamPtr, + 0xff, + 8); + } + OutputBitstreamWrite( + outputBitstreamPtr, + payloadSize, + 8); + for (index = 0; index < 16; ++index){ + // sei.uuid_iso_iec_11578[i] + WriteCodeCavlc( + outputBitstreamPtr, + unregUserDataSeiPtr->uuidIsoIec_11578[index], + 8); + } - // Byte Align the Bitstream - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); + for (index = 0; index < payloadSize - 16; ++index){ + // user_data + WriteCodeCavlc( + outputBitstreamPtr, + unregUserDataSeiPtr->userData[index], + 8); + } - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); + if (outputBitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_one + WriteFlagCavlc( + outputBitstreamPtr, + 1); - return return_error; -} + while (outputBitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_zero + WriteFlagCavlc( + outputBitstreamPtr, + 0); + } + } -EB_ERRORTYPE EncodeBufferingPeriodSEI( - Bitstream_t *bitstreamPtr, - AppBufferingPeriodSei_t *bufferingPeriodPtr, - AppVideoUsabilityInfo_t *vuiPtr, - EncodeContext_t *encodeContextPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - unsigned payloadType = BUFFERING_PERIOD; - - // Note: payloadSize is fixed temporarily, this may change in future based on what is sent in CodeBufferingPeriod - unsigned payloadSize; - - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - CodeNALUnitHeader( - outputBitstreamPtr, - NAL_UNIT_PREFIX_SEI, - 0); - - payloadSize = GetBufPeriodSEILength( - bufferingPeriodPtr, - vuiPtr); - - for (; payloadType >= 0xff; payloadType -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadType, - 8); - - for (; payloadSize >= 0xff; payloadSize -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadSize, - 8); - - // Buffering Period SEI data - CodeBufferingPeriodSEI( - outputBitstreamPtr, - bufferingPeriodPtr, - vuiPtr, - encodeContextPtr); - - // Byte Align the Bitstream - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); - - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); - - return return_error; + // Byte Align the Bitstream + OutputBitstreamWrite( + outputBitstreamPtr, + 1, + 1); + + OutputBitstreamWriteAlignZero( + outputBitstreamPtr); + + return return_error; } -EB_ERRORTYPE EncodeActiveParameterSetsSEI( +EB_ERRORTYPE EncodeRecoveryPointSEI( Bitstream_t *bitstreamPtr, - AppActiveparameterSetSei_t *activeParameterSet) + AppRecoveryPoint_t *recoveryPointSeiPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; - unsigned payloadType = ACTIVE_PARAMETER_SETS; + unsigned payloadType = RECOVERY_POINT; - // Note: payloadSize is fixed temporarily, this may change in future based on what is sent in CodeActiveParameterSet - unsigned payloadSize; + // Note: payloadSize is fixed temporarily, this may change in future based on what is sent in CodeBufferingPeriod + unsigned payloadSize; OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; @@ -8739,8 +8974,8 @@ EB_ERRORTYPE EncodeActiveParameterSetsSEI( NAL_UNIT_PREFIX_SEI, 0); - payloadSize = GetActiveParameterSetSEILength( - activeParameterSet); + payloadSize = GetRecoveryPointSEILength( + recoveryPointSeiPtr); for (; payloadType >= 0xff; payloadType -= 0xff) { OutputBitstreamWrite( @@ -8764,10 +8999,34 @@ EB_ERRORTYPE EncodeActiveParameterSetsSEI( payloadSize, 8); - // Active Parameter Set SEI data - CodeActiveParameterSetSEI( + // recovery_poc_cnt + WriteSvlc( outputBitstreamPtr, - activeParameterSet); + recoveryPointSeiPtr->recoveryPocCnt); + + // exact_matching_flag + WriteFlagCavlc( + outputBitstreamPtr, + recoveryPointSeiPtr->exactMatchingFlag); + + // broken_link_flag + WriteFlagCavlc( + outputBitstreamPtr, + recoveryPointSeiPtr->brokenLinkFlag); + + if (outputBitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_one + WriteFlagCavlc( + outputBitstreamPtr, + 1); + + while (outputBitstreamPtr->writtenBitsCount % 8 != 0) { + // bit_equal_to_zero + WriteFlagCavlc( + outputBitstreamPtr, + 0); + } + } // Byte Align the Bitstream OutputBitstreamWrite( @@ -8781,9 +9040,8 @@ EB_ERRORTYPE EncodeActiveParameterSetsSEI( return return_error; } -EB_ERRORTYPE EncodeFillerData( - Bitstream_t *bitstreamPtr, - EB_U8 temporalId) +EB_ERRORTYPE CodeEndOfSequenceNalUnit( + Bitstream_t *bitstreamPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -8791,268 +9049,10 @@ EB_ERRORTYPE EncodeFillerData( CodeNALUnitHeader( outputBitstreamPtr, - NAL_UNIT_FILLER_DATA, - temporalId); - return return_error; -} - -EB_ERRORTYPE EncodeRegUserDataSEI( - Bitstream_t *bitstreamPtr, - RegistedUserData_t *regUserDataSeiPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 index; - unsigned payloadType = REG_USER_DATA; - - unsigned payloadSize = regUserDataSeiPtr->userDataSize; - - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - CodeNALUnitHeader( - outputBitstreamPtr, - NAL_UNIT_PREFIX_SEI, - 0); - - for (; payloadType >= 0xff; payloadType -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadType, - 8); - - for (; payloadSize >= 0xff; payloadSize -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadSize, - 8); - - for (index = 0; index < payloadSize; ++index){ - // user_data - WriteCodeCavlc( - outputBitstreamPtr, - regUserDataSeiPtr->userData[index], - 8); - } - - if (outputBitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_one - WriteFlagCavlc( - outputBitstreamPtr, - 1); - - while (outputBitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_zero - WriteFlagCavlc( - outputBitstreamPtr, - 0); - } - } - - // Byte Align the Bitstream - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); - - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); - - return return_error; -} - -EB_ERRORTYPE EncodeUnregUserDataSEI( - Bitstream_t *bitstreamPtr, - UnregistedUserData_t *unregUserDataSeiPtr, - EncodeContext_t *encodeContextPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 index; - unsigned payloadType = UNREG_USER_DATA; - - unsigned payloadSize = unregUserDataSeiPtr->userDataSize + 16 ; - - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - CHECK_REPORT_ERROR( - (payloadSize >= 16), - encodeContextPtr->appCallbackPtr, - EB_ENC_EC_ERROR16); - - - CodeNALUnitHeader( - outputBitstreamPtr, - NAL_UNIT_PREFIX_SEI, - 0); - - for (; payloadType >= 0xff; payloadType -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadType, - 8); - - for (; payloadSize >= 0xff; payloadSize -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadSize, - 8); - - for (index = 0; index < 16; ++index){ - // sei.uuid_iso_iec_11578[i] - WriteCodeCavlc( - outputBitstreamPtr, - unregUserDataSeiPtr->uuidIsoIec_11578[index], - 8); - } - - for (index = 0; index < payloadSize - 16; ++index){ - // user_data - WriteCodeCavlc( - outputBitstreamPtr, - unregUserDataSeiPtr->userData[index], - 8); - } - - if (outputBitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_one - WriteFlagCavlc( - outputBitstreamPtr, - 1); - - while (outputBitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_zero - WriteFlagCavlc( - outputBitstreamPtr, - 0); - } - } - - // Byte Align the Bitstream - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); - - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); - - return return_error; -} - -EB_ERRORTYPE EncodeRecoveryPointSEI( - Bitstream_t *bitstreamPtr, - AppRecoveryPoint_t *recoveryPointSeiPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - unsigned payloadType = RECOVERY_POINT; - - // Note: payloadSize is fixed temporarily, this may change in future based on what is sent in CodeBufferingPeriod - unsigned payloadSize; - - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - CodeNALUnitHeader( - outputBitstreamPtr, - NAL_UNIT_PREFIX_SEI, - 0); - - payloadSize = GetRecoveryPointSEILength( - recoveryPointSeiPtr); - - for (; payloadType >= 0xff; payloadType -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadType, - 8); - - for (; payloadSize >= 0xff; payloadSize -= 0xff) { - OutputBitstreamWrite( - outputBitstreamPtr, - 0xff, - 8); - } - OutputBitstreamWrite( - outputBitstreamPtr, - payloadSize, - 8); - - // recovery_poc_cnt - WriteSvlc( - outputBitstreamPtr, - recoveryPointSeiPtr->recoveryPocCnt); - - // exact_matching_flag - WriteFlagCavlc( - outputBitstreamPtr, - recoveryPointSeiPtr->exactMatchingFlag); - - // broken_link_flag - WriteFlagCavlc( - outputBitstreamPtr, - recoveryPointSeiPtr->brokenLinkFlag); - - if (outputBitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_one - WriteFlagCavlc( - outputBitstreamPtr, - 1); - - while (outputBitstreamPtr->writtenBitsCount % 8 != 0) { - // bit_equal_to_zero - WriteFlagCavlc( - outputBitstreamPtr, - 0); - } - } - - // Byte Align the Bitstream - OutputBitstreamWrite( - outputBitstreamPtr, - 1, - 1); - - OutputBitstreamWriteAlignZero( - outputBitstreamPtr); - - return return_error; -} - -EB_ERRORTYPE CodeEndOfSequenceNalUnit( - Bitstream_t *bitstreamPtr) -{ - EB_ERRORTYPE return_error = EB_ErrorNone; - - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; - - CodeNALUnitHeader( - outputBitstreamPtr, - NAL_UNIT_EOS, - 0); + NAL_UNIT_EOS, + 0); - return return_error; + return return_error; } EB_ERRORTYPE EncodeContentLightLevelSEI( @@ -9248,15 +9248,15 @@ EB_ERRORTYPE CodeDolbyVisionRpuMetadata( } EB_ERRORTYPE CopyRbspBitstreamToPayload( - Bitstream_t *bitstreamPtr, - EB_BYTE *outputBuffer, - EB_U32 *outputBufferIndex, - EB_U32 *outputBufferSize, - EncodeContext_t *encodeContextPtr, - NalUnitType naltype) + Bitstream_t *bitstreamPtr, + EB_BYTE *outputBuffer, + EB_U32 *outputBufferIndex, + EB_U32 *outputBufferSize, + EncodeContext_t *encodeContextPtr, + NalUnitType naltype) { - EB_ERRORTYPE return_error = EB_ErrorNone; - OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; + EB_ERRORTYPE return_error = EB_ErrorNone; + OutputBitstreamUnit_t *outputBitstreamPtr = (OutputBitstreamUnit_t*)bitstreamPtr->outputBitstreamPtr; (void)encodeContextPtr; // To guarantee the output stream buffer is big enough. @@ -9269,21 +9269,21 @@ EB_ERRORTYPE CopyRbspBitstreamToPayload( } } - OutputBitstreamRBSPToPayload( - outputBitstreamPtr, - *outputBuffer, - outputBufferIndex, - outputBufferSize, - 0, - naltype); + OutputBitstreamRBSPToPayload( + outputBitstreamPtr, + *outputBuffer, + outputBufferIndex, + outputBufferSize, + 0, + naltype); - return return_error; + return return_error; } EB_ERRORTYPE BitstreamCtor( - Bitstream_t **bitstreamDblPtr, - EB_U32 bufferSize) + Bitstream_t **bitstreamDblPtr, + EB_U32 bufferSize) { EB_ERRORTYPE return_error = EB_ErrorNone; EB_MALLOC(Bitstream_t*, *bitstreamDblPtr, sizeof(Bitstream_t), EB_N_PTR); @@ -9291,8 +9291,8 @@ EB_ERRORTYPE BitstreamCtor( EB_MALLOC(EB_PTR, (*bitstreamDblPtr)->outputBitstreamPtr, sizeof(OutputBitstreamUnit_t), EB_N_PTR); return_error = OutputBitstreamUnitCtor( - (OutputBitstreamUnit_t *)(*bitstreamDblPtr)->outputBitstreamPtr, - bufferSize); + (OutputBitstreamUnit_t *)(*bitstreamDblPtr)->outputBitstreamPtr, + bufferSize); return return_error; } @@ -9301,21 +9301,21 @@ EB_ERRORTYPE BitstreamCtor( EB_ERRORTYPE EntropyCoderCtor( - EntropyCoder_t **entropyCoderDblPtr, - EB_U32 bufferSize) + EntropyCoder_t **entropyCoderDblPtr, + EB_U32 bufferSize) { EB_ERRORTYPE return_error = EB_ErrorNone; EB_MALLOC(EntropyCoder_t*, *entropyCoderDblPtr, sizeof(EntropyCoder_t), EB_N_PTR); EB_MALLOC(EB_PTR, (*entropyCoderDblPtr)->cabacEncodeContextPtr, sizeof(CabacEncodeContext_t), EB_N_PTR); - EbHevcCabacCtor( - (CabacEncodeContext_t *)(*entropyCoderDblPtr)->cabacEncodeContextPtr); + EbHevcCabacCtor( + (CabacEncodeContext_t *)(*entropyCoderDblPtr)->cabacEncodeContextPtr); return_error = OutputBitstreamUnitCtor( - &((((CabacEncodeContext_t*)(*entropyCoderDblPtr)->cabacEncodeContextPtr)->bacEncContext).m_pcTComBitIf), - bufferSize); + &((((CabacEncodeContext_t*)(*entropyCoderDblPtr)->cabacEncodeContextPtr)->bacEncContext).m_pcTComBitIf), + bufferSize); return return_error; } @@ -9324,12 +9324,12 @@ EB_ERRORTYPE EntropyCoderCtor( EB_PTR EntropyCoderGetBitstreamPtr( - EntropyCoder_t *entropyCoderPtr) + EntropyCoder_t *entropyCoderPtr) { - CabacEncodeContext_t *cabacEncCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; - EB_PTR bitstreamPtr = (EB_PTR)&(cabacEncCtxPtr->bacEncContext.m_pcTComBitIf); + CabacEncodeContext_t *cabacEncCtxPtr = (CabacEncodeContext_t*)entropyCoderPtr->cabacEncodeContextPtr; + EB_PTR bitstreamPtr = (EB_PTR)&(cabacEncCtxPtr->bacEncContext.m_pcTComBitIf); - return bitstreamPtr; + return bitstreamPtr; } EB_ERRORTYPE EstimateQuantizedCoefficients_Update_SSE2( diff --git a/Source/Lib/Codec/EbEntropyCoding.h b/Source/Lib/Codec/EbEntropyCoding.h index c09b124fa..2e4bf4a02 100644 --- a/Source/Lib/Codec/EbEntropyCoding.h +++ b/Source/Lib/Codec/EbEntropyCoding.h @@ -43,7 +43,7 @@ extern EB_ERRORTYPE EncodeLcu( NeighborArrayUnit_t *skipFlagNeighborArray, EB_U16 tileIdx, EB_U32 pictureOriginX, - EB_U32 pictureOriginY); + EB_U32 pictureOriginY); extern EB_ERRORTYPE EncodeTileFinish( EntropyCoder_t *entropyCoderPtr); @@ -83,17 +83,17 @@ extern EB_ERRORTYPE FlushBitstream( extern EB_ERRORTYPE EncodeAUD( Bitstream_t *bitstreamPtr, EB_PICTURE sliceType, - EB_U32 temporalId); + EB_U32 temporalId); extern EB_ERRORTYPE ComputeProfileTierLevelInfo( SequenceControlSet_t *scsPtr); extern EB_ERRORTYPE ComputeMaxDpbBuffer( - SequenceControlSet_t *scsPtr); + SequenceControlSet_t *scsPtr); extern EB_ERRORTYPE EncodeVPS( Bitstream_t *bitstreamPtr, - SequenceControlSet_t *scsPtr); + SequenceControlSet_t *scsPtr); extern EB_ERRORTYPE EncodeSPS( Bitstream_t *bitstreamPtr, @@ -105,41 +105,41 @@ extern EB_ERRORTYPE EncodePPS( EbPPSConfig_t *ppsConfig); EB_ERRORTYPE TuEstimateCoeffBits_R( - EB_U32 tuOriginIndex, - EB_U32 tuChromaOriginIndex, - EB_U32 componentMask, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_U32 yCountNonZeroCoeffs, - EB_U32 cbCountNonZeroCoeffs, - EB_U32 crCountNonZeroCoeffs, - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_MODETYPE type, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 partialFrequencyN2Flag, + EB_U32 tuOriginIndex, + EB_U32 tuChromaOriginIndex, + EB_U32 componentMask, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_U32 yCountNonZeroCoeffs, + EB_U32 cbCountNonZeroCoeffs, + EB_U32 crCountNonZeroCoeffs, + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_MODETYPE type, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 partialFrequencyN2Flag, EB_BOOL coeffCabacUpdate, CoeffCtxtMdl_t *updatedCoeffCtxModel, - CabacCost_t *CabacCost); + CabacCost_t *CabacCost); extern EB_ERRORTYPE TuEstimateCoeffBitsEncDec( - EB_U32 tuOriginIndex, - EB_U32 tuChromaOriginIndex, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffBufferTB, + EB_U32 tuOriginIndex, + EB_U32 tuChromaOriginIndex, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffBufferTB, EB_U32 countNonZeroCoeffs[3], - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_MODETYPE type, - CabacCost_t *CabacCost); + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_MODETYPE type, + CabacCost_t *CabacCost); extern EB_ERRORTYPE TuEstimateCoeffBitsLuma( @@ -150,18 +150,18 @@ extern EB_ERRORTYPE TuEstimateCoeffBitsLuma( EB_U64 *yTuCoeffBits, EB_U32 transformSize, EB_MODETYPE type, - EB_U32 intraLumaMode, + EB_U32 intraLumaMode, EB_U32 partialFrequencyN2Flag, EB_BOOL coeffCabacUpdate, CoeffCtxtMdl_t *updatedCoeffCtxModel, - CabacCost_t *CabacCost); + CabacCost_t *CabacCost); extern EB_ERRORTYPE EncodeBufferingPeriodSEI( Bitstream_t *bitstreamPtr, AppBufferingPeriodSei_t *bufferingPeriodPtr, AppVideoUsabilityInfo_t *vuiPtr, - EncodeContext_t *encodeContextPtr); + EncodeContext_t *encodeContextPtr); extern EB_ERRORTYPE EncodePictureTimingSEI( @@ -228,31 +228,31 @@ void EncodeQuantizedCoefficients_SSE2( TransformUnit_t *tuPtr); EB_ERRORTYPE EstimateQuantizedCoefficients_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); EB_ERRORTYPE EstimateQuantizedCoefficients_generic_Update( CoeffCtxtMdl_t *UpdatedCoeffCtxModel, @@ -279,7 +279,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_generic( const EB_U32 coeffStride, EB_U32 componentType, EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + EB_U64 *coeffBitsLong); EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( CabacCost_t *CabacCost, @@ -292,7 +292,7 @@ EB_ERRORTYPE EstimateQuantizedCoefficients_Lossy( const EB_U32 coeffStride, EB_U32 componentType, EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + EB_U64 *coeffBitsLong); void EncodeQuantizedCoefficients_generic( CabacEncodeContext_t *cabacEncodeCtxPtr, @@ -309,17 +309,17 @@ void EncodeQuantizedCoefficients_generic( * Function Types **************************************/ typedef EB_ERRORTYPE(*ESTIMATE_QUANTIZED_COEFF_TYPE)( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); typedef void(*ENCODE_QUANTIZED_COEFF_TYPE) ( CabacEncodeContext_t *cabacEncodeCtxPtr, EB_U32 size, // Input: TU size @@ -349,10 +349,10 @@ static ESTIMATE_QUANTIZED_COEFF_TYPE FUNC_TABLE EstimateQuantizedCoefficients[2] static ENCODE_QUANTIZED_COEFF_TYPE FUNC_TABLE EncodeQuantizedCoefficientsFuncArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT EncodeQuantizedCoefficients_generic, - // AVX2 - EncodeQuantizedCoefficients_SSE2, + // AVX2 + EncodeQuantizedCoefficients_SSE2, }; diff --git a/Source/Lib/Codec/EbEntropyCodingProcess.c b/Source/Lib/Codec/EbEntropyCodingProcess.c index b2371c8ca..e47a4594b 100644 --- a/Source/Lib/Codec/EbEntropyCodingProcess.c +++ b/Source/Lib/Codec/EbEntropyCodingProcess.c @@ -52,9 +52,9 @@ static void EntropyCodingResetNeighborArrays(PictureControlSet_t *pictureControl * Reset Entropy Coding Picture **************************************************/ static void ResetEntropyCodingPicture( - EntropyCodingContext_t *contextPtr, - PictureControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) + EntropyCodingContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) { EB_U32 tileCnt = pictureControlSetPtr->ParentPcsPtr->tileRowCount * pictureControlSetPtr->ParentPcsPtr->tileColumnCount; EB_U32 tileIdx = 0; @@ -63,32 +63,32 @@ static void ResetEntropyCodingPicture( ResetBitstream(EntropyCoderGetBitstreamPtr(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr)); } - EB_U32 entropyCodingQp; + EB_U32 entropyCodingQp; - contextPtr->is16bit = (EB_BOOL)(sequenceControlSetPtr->staticConfig.encoderBitDepth > EB_8BIT); + contextPtr->is16bit = (EB_BOOL)(sequenceControlSetPtr->staticConfig.encoderBitDepth > EB_8BIT); - // SAO - pictureControlSetPtr->saoFlag[0] = EB_TRUE; - pictureControlSetPtr->saoFlag[1] = EB_TRUE; + // SAO + pictureControlSetPtr->saoFlag[0] = EB_TRUE; + pictureControlSetPtr->saoFlag[1] = EB_TRUE; - // QP - contextPtr->qp = pictureControlSetPtr->pictureQp; - // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation + // QP + contextPtr->qp = pictureControlSetPtr->pictureQp; + // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); - contextPtr->chromaQp = MapChromaQp(qpScaled); + EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + contextPtr->chromaQp = MapChromaQp(qpScaled); - if (pictureControlSetPtr->useDeltaQp) { - entropyCodingQp = pictureControlSetPtr->pictureQp; - } - else { - entropyCodingQp = pictureControlSetPtr->pictureQp; - } + if (pictureControlSetPtr->useDeltaQp) { + entropyCodingQp = pictureControlSetPtr->pictureQp; + } + else { + entropyCodingQp = pictureControlSetPtr->pictureQp; + } - // Reset CABAC Contexts - // Reset QP Assignement + // Reset CABAC Contexts + // Reset QP Assignement for (tileIdx = 0; tileIdx < tileCnt; tileIdx++) { pictureControlSetPtr->prevCodedQp[tileIdx] = pictureControlSetPtr->pictureQp; pictureControlSetPtr->prevQuantGroupCodedQp[tileIdx] = pictureControlSetPtr->pictureQp; @@ -98,7 +98,7 @@ static void ResetEntropyCodingPicture( pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr, entropyCodingQp, pictureControlSetPtr->sliceType); - + EntropyCodingResetNeighborArrays(pictureControlSetPtr, tileIdx); } @@ -117,10 +117,10 @@ static void EntropyCodingConfigureLcu( { contextPtr->qp = pictureControlSetPtr->pictureQp; - // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation + // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); - contextPtr->chromaQp = MapChromaQp(qpScaled); + EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + contextPtr->chromaQp = MapChromaQp(qpScaled); lcuPtr->qp = contextPtr->qp; @@ -142,14 +142,14 @@ static void EntropyCodingLcu( EB_U32 pictureOriginY) { - EbPictureBufferDesc_t *coeffPicturePtr = lcuPtr->quantizedCoeff; + EbPictureBufferDesc_t *coeffPicturePtr = lcuPtr->quantizedCoeff; //rate Control EB_U32 writtenBitsBeforeQuantizedCoeff; EB_U32 writtenBitsAfterQuantizedCoeff; EntropyCoder_t *entropyCoderPtr = pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr; - //store the number of written bits before coding quantized coeffs (flush is not called yet): - // The total number of bits is + //store the number of written bits before coding quantized coeffs (flush is not called yet): + // The total number of bits is // number of written bits // + 32 - bits remaining in interval Low Value // + number of buffered byte * 8 @@ -182,14 +182,14 @@ static void EntropyCodingLcu( pictureControlSetPtr->intraLumaModeNeighborArray[tileIdx], pictureControlSetPtr->skipFlagNeighborArray[tileIdx], tileIdx, - pictureOriginX, - pictureOriginY); + pictureOriginX, + pictureOriginY); //Jing:TODO // extend the totalBits to tile, for tile based brc - - //store the number of written bits after coding quantized coeffs (flush is not called yet): - // The total number of bits is + + //store the number of written bits after coding quantized coeffs (flush is not called yet): + // The total number of bits is // number of written bits // + 32 - bits remaining in interval Low Value // + number of buffered byte * 8 @@ -219,12 +219,12 @@ static void EntropyCodingLcu( } /****************************************************** - * Update Entropy Coding Rows + * Update Entropy Coding Rows * * This function is responsible for synchronizing the - * processing of Entropy Coding LCU-rows and starts - * processing of LCU-rows as soon as their inputs are - * available and the previous LCU-row has completed. + * processing of Entropy Coding LCU-rows and starts + * processing of LCU-rows as soon as their inputs are + * available and the previous LCU-row has completed. * At any given time, only one segment row per picture * is being processed. * @@ -276,7 +276,7 @@ static EB_BOOL UpdateEntropyCodingRows( for(i=*rowIndex; i < *rowIndex + rowCount; ++i) { infoPtr->entropyCodingRowArray[i] = EB_TRUE; } - + while(infoPtr->entropyCodingRowArray[infoPtr->entropyCodingCurrentAvailableRow] == EB_TRUE && infoPtr->entropyCodingCurrentAvailableRow < infoPtr->entropyCodingRowCount) { @@ -290,7 +290,7 @@ static EB_BOOL UpdateEntropyCodingRows( } // Test if the picture is not already complete AND not currently being worked on by another ENCDEC process - if(infoPtr->entropyCodingCurrentRow < infoPtr->entropyCodingRowCount && + if(infoPtr->entropyCodingCurrentRow < infoPtr->entropyCodingRowCount && infoPtr->entropyCodingRowArray[infoPtr->entropyCodingCurrentRow] == EB_TRUE && infoPtr->entropyCodingInProgress == EB_FALSE) { @@ -389,10 +389,10 @@ void* EntropyCodingKernel(void *inputPtr) { initialProcessCall = EB_TRUE; - yLcuIndex = encDecResultsPtr->completedLcuRowIndexStart; - + yLcuIndex = encDecResultsPtr->completedLcuRowIndexStart; + // LCU-loops - while(UpdateEntropyCodingRows(pictureControlSetPtr, &yLcuIndex, encDecResultsPtr->completedLcuRowCount, tileIdx, &initialProcessCall) == EB_TRUE) + while(UpdateEntropyCodingRows(pictureControlSetPtr, &yLcuIndex, encDecResultsPtr->completedLcuRowCount, tileIdx, &initialProcessCall) == EB_TRUE) { EB_U32 rowTotalBits = 0; @@ -404,12 +404,12 @@ void* EntropyCodingKernel(void *inputPtr) // pictureControlSetPtr->pictureNumber, tileIdx, yLcuIndex + yLcuStart); pictureControlSetPtr->entropyCodingPicResetFlag = EB_FALSE; ResetEntropyCodingPicture( - contextPtr, + contextPtr, pictureControlSetPtr, sequenceControlSetPtr); } EbReleaseMutex(pictureControlSetPtr->entropyCodingPicMutex); - pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingPicDone = EB_FALSE; + pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingPicDone = EB_FALSE; } for(xLcuIndex = 0; xLcuIndex < tileWidthInLcu; ++xLcuIndex) { @@ -425,13 +425,13 @@ void* EntropyCodingKernel(void *inputPtr) if (sequenceControlSetPtr->staticConfig.tileSliceMode) { lastLcuFlagInSlice = lastLcuFlagInTile; } - + // Configure the LCU EntropyCodingConfigureLcu( contextPtr, lcuPtr, pictureControlSetPtr); - + // Entropy Coding EntropyCodingLcu( lcuPtr, @@ -467,18 +467,18 @@ void* EntropyCodingKernel(void *inputPtr) rateControlTaskPtr->pictureControlSetWrapperPtr = 0; rateControlTaskPtr->segmentIndex = ~0u; - + // Post EncDec Results EbPostFullObject(rateControlTaskWrapperPtr); } - EbBlockOnMutex(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingMutex); - if (pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingPicDone == EB_FALSE) { + EbBlockOnMutex(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingMutex); + if (pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingPicDone == EB_FALSE) { //Jing: Store the av(e) part for different tiles and copy it as a whole to slice bitstream - // If the picture is complete, terminate the slice - if (pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingCurrentRow == pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingRowCount) - { + // If the picture is complete, terminate the slice + if (pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingCurrentRow == pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingRowCount) + { EB_BOOL pic_ready = EB_TRUE; //assert(lastLcuFlagInTile == EB_TRUE); @@ -489,13 +489,13 @@ void* EntropyCodingKernel(void *inputPtr) EncodeTileFinish(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr); } else { //printf("[%lld]:Encode slice end for tile %d\n", EbGetSysTimeMs(), tileIdx); - EncodeSliceFinish(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr); + EncodeSliceFinish(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCoderPtr); } //Jing: TODO //Release the ref if the whole pic are done EbBlockOnMutex(pictureControlSetPtr->entropyCodingPicMutex); - pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingPicDone = EB_TRUE; + pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingPicDone = EB_TRUE; for (EB_U32 i = 0; i < tileCnt; i++) { if (pictureControlSetPtr->entropyCodingInfo[i]->entropyCodingPicDone == EB_FALSE) { pic_ready = EB_FALSE; @@ -517,10 +517,10 @@ void* EntropyCodingKernel(void *inputPtr) // Post EntropyCoding Results EbPostFullObject(entropyCodingResultsWrapperPtr); } - } // End if(PictureCompleteFlag) - } - EbReleaseMutex(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingMutex); - } + } // End if(PictureCompleteFlag) + } + EbReleaseMutex(pictureControlSetPtr->entropyCodingInfo[tileIdx]->entropyCodingMutex); + } } #if DEADLOCK_DEBUG @@ -530,6 +530,6 @@ void* EntropyCodingKernel(void *inputPtr) EbReleaseObject(encDecResultsWrapperPtr); } - + return EB_NULL; } diff --git a/Source/Lib/Codec/EbEntropyCodingProcess.h b/Source/Lib/Codec/EbEntropyCodingProcess.h index 0380f7ef2..e53e45d6f 100644 --- a/Source/Lib/Codec/EbEntropyCodingProcess.h +++ b/Source/Lib/Codec/EbEntropyCodingProcess.h @@ -25,16 +25,16 @@ extern "C" { /************************************** * Enc Dec Context **************************************/ -typedef struct EntropyCodingContext_s +typedef struct EntropyCodingContext_s { EbFifo_t *encDecInputFifoPtr; EbFifo_t *entropyCodingOutputFifoPtr; // to packetization EbFifo_t *rateControlOutputFifoPtr; // feedback to rate control - EB_U32 lcuTotalCount; - // Lambda - EB_U8 qp; - EB_U8 chromaQp; + EB_U32 lcuTotalCount; + // Lambda + EB_U8 qp; + EB_U8 chromaQp; // Coding Unit Workspace--------------------------- EbPictureBufferDesc_t *coeffBufferTB; //Used to hold quantized coeff for one TB in EncPass. @@ -43,13 +43,13 @@ typedef struct EntropyCodingContext_s CodingUnit_t *cuPtr; const CodedUnitStats_t *cuStats; EB_U32 cuIndex; - EB_U8 cuDepth; - EB_U32 cuSize; - EB_U32 lcuSize; - EB_U32 lcuChromaSize; + EB_U8 cuDepth; + EB_U32 cuSize; + EB_U32 lcuSize; + EB_U32 lcuChromaSize; EB_U32 cuSizeLog2; - EB_U32 cuOriginX; - EB_U32 cuOriginY; + EB_U32 cuOriginX; + EB_U32 cuOriginY; EB_U32 cuChromaOriginX; EB_U32 cuChromaOriginY; @@ -69,17 +69,17 @@ typedef struct EntropyCodingContext_s EB_U32 amvpCandidateCountRefList1; EB_S32 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; EB_S32 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - + EB_U32 tuItr; EB_U32 tuArea; EB_U32 tuTotalArea; TransformUnit_t *tuPtr; const TransformUnitStats_t *tuStats; - EB_U32 tuOriginX; - EB_U32 tuOriginY; + EB_U32 tuOriginX; + EB_U32 tuOriginY; EB_U32 tuSize; EB_U32 tuSizeChroma; - + // MCP Context EB_BOOL is16bit; //enable 10 bit encode in CL @@ -94,7 +94,7 @@ extern EB_ERRORTYPE EntropyCodingContextCtor( EbFifo_t *packetizationOutputFifoPtr, EbFifo_t *rateControlOutputFifoPtr, EB_BOOL is16bit); - + extern void* EntropyCodingKernel(void *inputPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbEntropyCodingResults.h b/Source/Lib/Codec/EbEntropyCodingResults.h index 634fd6e96..37846fb50 100644 --- a/Source/Lib/Codec/EbEntropyCodingResults.h +++ b/Source/Lib/Codec/EbEntropyCodingResults.h @@ -14,13 +14,13 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct +typedef struct { EbObjectWrapper_t *pictureControlSetWrapperPtr; } EntropyCodingResults_t; -typedef struct +typedef struct { EB_U32 junk; } EntropyCodingResultsInitData_t; @@ -29,7 +29,7 @@ typedef struct * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EntropyCodingResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); diff --git a/Source/Lib/Codec/EbEntropyCodingUtil.c b/Source/Lib/Codec/EbEntropyCodingUtil.c index 45657a2ae..0e87dee1e 100644 --- a/Source/Lib/Codec/EbEntropyCodingUtil.c +++ b/Source/Lib/Codec/EbEntropyCodingUtil.c @@ -8,8 +8,8 @@ #define ONE_BIT 32768 -//LUT used for LPSxRange calculation -//8 bit unsigned is enough. +//LUT used for LPSxRange calculation +//8 bit unsigned is enough. static const EB_U32 RangeLPSTable1D[] = { 128, 176, 208, 240, @@ -288,8 +288,8 @@ void BacEncContextTerminate( } void RemainingCoeffExponentialGolombCode( - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 symbolValue, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 symbolValue, EB_U32 golombParam) { EB_S32 codeWord = symbolValue >> golombParam; diff --git a/Source/Lib/Codec/EbEntropyCodingUtil.h b/Source/Lib/Codec/EbEntropyCodingUtil.h index e14094564..fff6f2512 100644 --- a/Source/Lib/Codec/EbEntropyCodingUtil.h +++ b/Source/Lib/Codec/EbEntropyCodingUtil.h @@ -30,10 +30,10 @@ extern "C" { #define NUMBER_OF_INTRA_MODES 36 #define NUMBER_OF_INTRA_MODES_MINUS_TWO 34 #define RICE_UPDATE_LENGTH 24 //16 -#define GREATER_THAN1_MAX_NUMBER 8 // maximum number for greater than 1 -#define GREATER_THAN2_MAX_NUMBER 1 // maximum number for greater than 2 +#define GREATER_THAN1_MAX_NUMBER 8 // maximum number for greater than 1 +#define GREATER_THAN2_MAX_NUMBER 1 // maximum number for greater than 2 #define COEF_REMAIN_BIN_REDUCTION 3 -#define CU_DELTA_QP_CMAX 5 +#define CU_DELTA_QP_CMAX 5 #define CU_DELTA_QP_EGK 0 // These are redefined here to avoid conflict with the existing scan indices @@ -261,7 +261,7 @@ EB_ERRORTYPE EstimateMvpIndex( EB_REFLIST refList); EB_ERRORTYPE EstimatePartitionSize( - CodingUnit_t *cuPtr); + CodingUnit_t *cuPtr); EB_ERRORTYPE EstimatePredictionMode( CodingUnit_t *cuPtr); diff --git a/Source/Lib/Codec/EbFullLoop.c b/Source/Lib/Codec/EbFullLoop.c index acd224186..566dcd264 100644 --- a/Source/Lib/Codec/EbFullLoop.c +++ b/Source/Lib/Codec/EbFullLoop.c @@ -12,61 +12,61 @@ #include "EbErrorHandling.h" static const EB_U64 depth0Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { - { - { 1000 }, - { 1000, 4000 }, - { 1000, 4000, 9500 }, - { 1000, 4000, 9500, 3000 }, - { 1000, 4000, 9500, 3000, 3000 }, - { 1000, 4000, 9500, 3000, 3000, 3000 } - }, - - { - { 0 }, - { 0, 1000 }, - { 0, 1000, 7000 }, - { 0, 1000, 7000, 9500 }, - { 0, 1000, 7000, 9500, 9500 }, - { 0, 1000, 7000, 9500, 9500, 9500 } - } + { + { 1000 }, + { 1000, 4000 }, + { 1000, 4000, 9500 }, + { 1000, 4000, 9500, 3000 }, + { 1000, 4000, 9500, 3000, 3000 }, + { 1000, 4000, 9500, 3000, 3000, 3000 } + }, + + { + { 0 }, + { 0, 1000 }, + { 0, 1000, 7000 }, + { 0, 1000, 7000, 9500 }, + { 0, 1000, 7000, 9500, 9500 }, + { 0, 1000, 7000, 9500, 9500, 9500 } + } }; static const EB_U64 depth1Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { - { - { 0 }, - { 0, 2000 }, - { 0, 2000, 5500 }, - { 0, 2000, 5500, 9500 }, - { 0, 2000, 5500, 9500, 9500 }, - { 0, 2000, 5500, 9500, 9500, 9500 } - }, - - { - { 0 }, - { 0, 1500 }, - { 0, 1500, 1500 }, - { 0, 1500, 1500, 1500 }, - { 0, 1500, 1500, 1500, 1500 }, - { 0, 1500, 1500, 1500, 1500, 1500 } - } + { + { 0 }, + { 0, 2000 }, + { 0, 2000, 5500 }, + { 0, 2000, 5500, 9500 }, + { 0, 2000, 5500, 9500, 9500 }, + { 0, 2000, 5500, 9500, 9500, 9500 } + }, + + { + { 0 }, + { 0, 1500 }, + { 0, 1500, 1500 }, + { 0, 1500, 1500, 1500 }, + { 0, 1500, 1500, 1500, 1500 }, + { 0, 1500, 1500, 1500, 1500, 1500 } + } }; static const EB_U64 depth2Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { - { - { 0 }, - { 0, 500 }, - { 0, 500, 2000 }, - { 0, 500, 2000, 2500 }, - { 0, 500, 2000, 2500, 2500 }, - { 0, 500, 2000, 2500, 2500, 2500 } - }, - - { - { 0 }, - { 0, 1500 }, - { 0, 1500, 1000 }, - { 0, 1500, 1000, 4500 }, - { 0, 1500, 1000, 4500, 4500 }, - { 0, 1500, 1000, 4500, 4500, 4500 } - } + { + { 0 }, + { 0, 500 }, + { 0, 500, 2000 }, + { 0, 500, 2000, 2500 }, + { 0, 500, 2000, 2500, 2500 }, + { 0, 500, 2000, 2500, 2500, 2500 } + }, + + { + { 0 }, + { 0, 1500 }, + { 0, 1500, 1000 }, + { 0, 1500, 1000, 4500 }, + { 0, 1500, 1000, 4500, 4500 }, + { 0, 1500, 1000, 4500, 4500, 4500 } + } }; /********************************************************************* @@ -75,510 +75,510 @@ static const EB_U64 depth2Th[2][MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { * Unified Quant +iQuant *********************************************************************/ void ProductUnifiedQuantizeInvQuantizeMd( - PictureControlSet_t *pictureControlSetPtr, - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 areaSize, - EB_U32 *yCountNonZeroCoeffs, - EB_PF_MODE pfMode, - EB_U8 enableContouringQCUpdateFlag, - EB_U32 componentType, + PictureControlSet_t *pictureControlSetPtr, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 areaSize, + EB_U32 *yCountNonZeroCoeffs, + EB_PF_MODE pfMode, + EB_U8 enableContouringQCUpdateFlag, + EB_U32 componentType, EB_RDOQ_PMCORE_TYPE rdoqPmCoreMethod, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_MODETYPE type, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost) + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_MODETYPE type, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost) { EB_PICTURE sliceType = pictureControlSetPtr->sliceType; EB_U32 temporalLayerIndex = pictureControlSetPtr->temporalLayerIndex; - //for the Quant - const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 - const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) - const EB_U32 qFunc = QFunc[qpRem]; // 15 bits - - const EB_U32 transformShiftNum = 7 - Log2f(areaSize); - const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; - const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); - - //for the iQuant - const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT - const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; - const EB_S32 iq_offset = 1 << (shiftNum - 1); - - - if (pfMode == PF_N2) { - areaSize = areaSize >> 1; - } else if (pfMode == PF_N4) { - areaSize = areaSize >> 2; - } - - if (rdoqPmCoreMethod){ - DecoupledQuantizeInvQuantizeLoops( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - cabacEncodeCtxPtr, - lambda, - type, - intraLumaMode, - intraChromaMode, - componentType, - pictureControlSetPtr->temporalLayerIndex, - pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, + //for the Quant + const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 + const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) + const EB_U32 qFunc = QFunc[qpRem]; // 15 bits + + const EB_U32 transformShiftNum = 7 - Log2f(areaSize); + const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; + const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); + + //for the iQuant + const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT + const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; + const EB_S32 iq_offset = 1 << (shiftNum - 1); + + + if (pfMode == PF_N2) { + areaSize = areaSize >> 1; + } else if (pfMode == PF_N4) { + areaSize = areaSize >> 2; + } + + if (rdoqPmCoreMethod){ + DecoupledQuantizeInvQuantizeLoops( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + cabacEncodeCtxPtr, + lambda, + type, + intraLumaMode, + intraChromaMode, + componentType, + pictureControlSetPtr->temporalLayerIndex, + pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, (EB_U8) 0, (EB_U16)qp, (EB_U32)EB_8BIT, - CabacCost, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), + CabacCost, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), rdoqPmCoreMethod); - } - else{ - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs)); - - UpdateQiQCoef( - quantCoeff, - reconCoeff, - coeffStride, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), - componentType, - sliceType, - temporalLayerIndex, - 0, - enableContouringQCUpdateFlag); - } + } + else{ + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs)); + + UpdateQiQCoef( + quantCoeff, + reconCoeff, + coeffStride, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), + componentType, + sliceType, + temporalLayerIndex, + 0, + enableContouringQCUpdateFlag); + } } /**************************************** ************ Full loop **************** ****************************************/ void ProductFullLoop( - EbPictureBufferDesc_t *inputPicturePtr, - EB_U32 inputOriginIndex, - ModeDecisionCandidateBuffer_t *candidateBuffer, - ModeDecisionContext_t *contextPtr, - const CodedUnitStats_t *cuStatsPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 qp, - EB_U32 *yCountNonZeroCoeffs, - EB_U64 *yCoeffBits, - EB_U64 *yFullDistortion) + EbPictureBufferDesc_t *inputPicturePtr, + EB_U32 inputOriginIndex, + ModeDecisionCandidateBuffer_t *candidateBuffer, + ModeDecisionContext_t *contextPtr, + const CodedUnitStats_t *cuStatsPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 qp, + EB_U32 *yCountNonZeroCoeffs, + EB_U64 *yCoeffBits, + EB_U64 *yFullDistortion) { - EB_U32 tuOriginIndex; - - EB_U32 currentTuIndex,tuIt; - EB_U64 yTuCoeffBits; - EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; - candidateBuffer->yDc[0] = 0; - candidateBuffer->yDc[1] = 0; - candidateBuffer->yDc[2] = 0; - candidateBuffer->yDc[3] = 0; - candidateBuffer->yCountNonZeroCoeffs[0] = 0; - candidateBuffer->yCountNonZeroCoeffs[1] = 0; - candidateBuffer->yCountNonZeroCoeffs[2] = 0; - candidateBuffer->yCountNonZeroCoeffs[3] = 0; - - if (cuStatsPtr->size == MAX_LCU_SIZE){ - - for (tuIt = 0; tuIt < 4; tuIt++) - { - - tuOriginIndex = ((tuIt & 1) << 5) + ((tuIt>1) << 11); - currentTuIndex = tuIt + 1; - yTuCoeffBits = 0; - EstimateTransform( - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - 32, - contextPtr->transformInnerArrayPtr, - 0, - EB_FALSE, - contextPtr->pfMdMode); - - - ProductUnifiedQuantizeInvQuantizeMd( - pictureControlSetPtr, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - qp, - 32, - &(yCountNonZeroCoeffs[currentTuIndex]), - contextPtr->pfMdMode, - 0, - COMPONENT_LUMA, + EB_U32 tuOriginIndex; + + EB_U32 currentTuIndex,tuIt; + EB_U64 yTuCoeffBits; + EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; + candidateBuffer->yDc[0] = 0; + candidateBuffer->yDc[1] = 0; + candidateBuffer->yDc[2] = 0; + candidateBuffer->yDc[3] = 0; + candidateBuffer->yCountNonZeroCoeffs[0] = 0; + candidateBuffer->yCountNonZeroCoeffs[1] = 0; + candidateBuffer->yCountNonZeroCoeffs[2] = 0; + candidateBuffer->yCountNonZeroCoeffs[3] = 0; + + if (cuStatsPtr->size == MAX_LCU_SIZE){ + + for (tuIt = 0; tuIt < 4; tuIt++) + { + + tuOriginIndex = ((tuIt & 1) << 5) + ((tuIt>1) << 11); + currentTuIndex = tuIt + 1; + yTuCoeffBits = 0; + EstimateTransform( + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + 32, + contextPtr->transformInnerArrayPtr, + 0, + EB_FALSE, + contextPtr->pfMdMode); + + + ProductUnifiedQuantizeInvQuantizeMd( + pictureControlSetPtr, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + qp, + 32, + &(yCountNonZeroCoeffs[currentTuIndex]), + contextPtr->pfMdMode, + 0, + COMPONENT_LUMA, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); - - PictureFullDistortionLuma( - contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr, - tuOriginIndex, - candidateBuffer->reconCoeffPtr, - tuOriginIndex, - (32 >> contextPtr->pfMdMode), - tuFullDistortion[0], - yCountNonZeroCoeffs[currentTuIndex], - candidateBuffer->candidatePtr->type); - - - tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + 8) >> 4; - tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + 8) >> 4; - - TuEstimateCoeffBitsLuma( - tuOriginIndex, - contextPtr->coeffEstEntropyCoderPtr, - candidateBuffer->residualQuantCoeffPtr, - yCountNonZeroCoeffs[currentTuIndex], - &yTuCoeffBits, - 32, - candidateBuffer->candidatePtr->type, - candidateBuffer->candidatePtr->intraLumaMode, - contextPtr->pfMdMode, - contextPtr->coeffCabacUpdate, - &(candidateBuffer->candBuffCoeffCtxModel), - contextPtr->CabacCost); - - TuCalcCostLuma( - MAX_LCU_SIZE, - candidateBuffer->candidatePtr, - currentTuIndex, - 32, - yCountNonZeroCoeffs[currentTuIndex], - tuFullDistortion[0], - &yTuCoeffBits, - contextPtr->qp, - contextPtr->fullLambda, - contextPtr->fullChromaLambda); - - (*yCoeffBits) += yTuCoeffBits; - yFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[0][DIST_CALC_RESIDUAL]; - yFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[0][DIST_CALC_PREDICTION]; - candidateBuffer->yDc[tuIt] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); - candidateBuffer->yCountNonZeroCoeffs[tuIt] = (EB_U16)yCountNonZeroCoeffs[currentTuIndex]; - - } - - }else{ - - tuOriginIndex = cuStatsPtr->originX + (cuStatsPtr->originY<<6); - yTuCoeffBits = 0; - EstimateTransform( - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - cuStatsPtr->size, - contextPtr->transformInnerArrayPtr, - 0, - EB_FALSE, - contextPtr->pfMdMode); - - ProductUnifiedQuantizeInvQuantizeMd( - pictureControlSetPtr, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), - MAX_LCU_SIZE, - &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - qp, - cuStatsPtr->size, - &(yCountNonZeroCoeffs[0]), - contextPtr->pfMdMode, - 0, - COMPONENT_LUMA, + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); + + PictureFullDistortionLuma( + contextPtr->transQuantBuffersPtr->tuTransCoeffNxNPtr, + tuOriginIndex, + candidateBuffer->reconCoeffPtr, + tuOriginIndex, + (32 >> contextPtr->pfMdMode), + tuFullDistortion[0], + yCountNonZeroCoeffs[currentTuIndex], + candidateBuffer->candidatePtr->type); + + + tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + 8) >> 4; + tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + 8) >> 4; + + TuEstimateCoeffBitsLuma( + tuOriginIndex, + contextPtr->coeffEstEntropyCoderPtr, + candidateBuffer->residualQuantCoeffPtr, + yCountNonZeroCoeffs[currentTuIndex], + &yTuCoeffBits, + 32, + candidateBuffer->candidatePtr->type, + candidateBuffer->candidatePtr->intraLumaMode, + contextPtr->pfMdMode, + contextPtr->coeffCabacUpdate, + &(candidateBuffer->candBuffCoeffCtxModel), + contextPtr->CabacCost); + + TuCalcCostLuma( + MAX_LCU_SIZE, + candidateBuffer->candidatePtr, + currentTuIndex, + 32, + yCountNonZeroCoeffs[currentTuIndex], + tuFullDistortion[0], + &yTuCoeffBits, + contextPtr->qp, + contextPtr->fullLambda, + contextPtr->fullChromaLambda); + + (*yCoeffBits) += yTuCoeffBits; + yFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[0][DIST_CALC_RESIDUAL]; + yFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[0][DIST_CALC_PREDICTION]; + candidateBuffer->yDc[tuIt] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); + candidateBuffer->yCountNonZeroCoeffs[tuIt] = (EB_U16)yCountNonZeroCoeffs[currentTuIndex]; + + } + + }else{ + + tuOriginIndex = cuStatsPtr->originX + (cuStatsPtr->originY<<6); + yTuCoeffBits = 0; + EstimateTransform( + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + cuStatsPtr->size, + contextPtr->transformInnerArrayPtr, + 0, + EB_FALSE, + contextPtr->pfMdMode); + + ProductUnifiedQuantizeInvQuantizeMd( + pictureControlSetPtr, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), + MAX_LCU_SIZE, + &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]), + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + qp, + cuStatsPtr->size, + &(yCountNonZeroCoeffs[0]), + contextPtr->pfMdMode, + 0, + COMPONENT_LUMA, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); - - if (contextPtr->spatialSseFullLoop == EB_TRUE) { - - if (yCountNonZeroCoeffs[0]) { - //since we are missing PF-N2 version for 16x16 and 8x8 iT, do zero out. - if (cuStatsPtr->size < 32 && contextPtr->pfMdMode == PF_N2) { - PfZeroOutUselessQuadrants( - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - candidateBuffer->reconCoeffPtr->strideY, - (cuStatsPtr->size >> 1)); - } - - EstimateInvTransform( - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), - candidateBuffer->reconCoeffPtr->strideY, - &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), - contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, - cuStatsPtr->size, - contextPtr->transformInnerArrayPtr, - BIT_INCREMENT_8BIT, - EB_FALSE, - cuStatsPtr->size < 32 ? PF_OFF : contextPtr->pfMdMode); + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->type, // Input: CU type (INTRA, INTER) + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); + + if (contextPtr->spatialSseFullLoop == EB_TRUE) { + + if (yCountNonZeroCoeffs[0]) { + //since we are missing PF-N2 version for 16x16 and 8x8 iT, do zero out. + if (cuStatsPtr->size < 32 && contextPtr->pfMdMode == PF_N2) { + PfZeroOutUselessQuadrants( + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + candidateBuffer->reconCoeffPtr->strideY, + (cuStatsPtr->size >> 1)); + } + + EstimateInvTransform( + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferY)[tuOriginIndex]), + candidateBuffer->reconCoeffPtr->strideY, + &(((EB_S16*)contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY)[tuOriginIndex]), + contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, + cuStatsPtr->size, + contextPtr->transformInnerArrayPtr, + BIT_INCREMENT_8BIT, + EB_FALSE, + cuStatsPtr->size < 32 ? PF_OFF : contextPtr->pfMdMode); if ((cuStatsPtr->size >> 3) < 9) - AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][cuStatsPtr->size >> 3]( - &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), - 64, - &(((EB_S16*)(contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY))[tuOriginIndex]), - contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, - &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), - candidateBuffer->reconPtr->strideY, - cuStatsPtr->size, - cuStatsPtr->size); - - } - else { - - PictureCopy8Bit( - candidateBuffer->predictionPtr, - tuOriginIndex, - 0, - candidateBuffer->reconPtr, - tuOriginIndex, - 0, - cuStatsPtr->size, - cuStatsPtr->size, - 0, - 0, - PICTURE_BUFFER_DESC_Y_FLAG); - } - - tuFullDistortion[0][DIST_CALC_RESIDUAL] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( - &(inputPicturePtr->bufferY[inputOriginIndex]), - inputPicturePtr->strideY, - &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), - candidateBuffer->reconPtr->strideY, - cuStatsPtr->size, - cuStatsPtr->size); - - tuFullDistortion[0][DIST_CALC_PREDICTION] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( - &(inputPicturePtr->bufferY[inputOriginIndex]), - inputPicturePtr->strideY, - &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), - candidateBuffer->predictionPtr->strideY, - cuStatsPtr->size, - cuStatsPtr->size); - } - else { - - PictureFullDistortionLuma( - contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr, - tuOriginIndex, - candidateBuffer->reconCoeffPtr, - tuOriginIndex, - (contextPtr->cuStats->size >> contextPtr->pfMdMode), - tuFullDistortion[0], - yCountNonZeroCoeffs[0], - candidateBuffer->candidatePtr->type); - - const EB_U32 lumaShift = 2 * (7 - Log2f(cuStatsPtr->size)); - tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; - tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; - } - - TuEstimateCoeffBitsLuma( - tuOriginIndex, - contextPtr->coeffEstEntropyCoderPtr, - candidateBuffer->residualQuantCoeffPtr, - yCountNonZeroCoeffs[0], - &yTuCoeffBits, - contextPtr->cuStats->size, - candidateBuffer->candidatePtr->type, - candidateBuffer->candidatePtr->intraLumaMode, - contextPtr->pfMdMode, - contextPtr->coeffCabacUpdate, - &(candidateBuffer->candBuffCoeffCtxModel), - contextPtr->CabacCost); - - TuCalcCostLuma( - cuStatsPtr->size, - candidateBuffer->candidatePtr, - 0, - cuStatsPtr->size, - yCountNonZeroCoeffs[0], - tuFullDistortion[0], - &yTuCoeffBits, - contextPtr->qp, - contextPtr->fullLambda, - contextPtr->fullChromaLambda); - - (*yCoeffBits) += yTuCoeffBits; - yFullDistortion[DIST_CALC_RESIDUAL] = tuFullDistortion[0][DIST_CALC_RESIDUAL]; - yFullDistortion[DIST_CALC_PREDICTION] = tuFullDistortion[0][DIST_CALC_PREDICTION]; - candidateBuffer->yDc[0] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); - candidateBuffer->yCountNonZeroCoeffs[0] = (EB_U16)yCountNonZeroCoeffs[0]; - } + AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][cuStatsPtr->size >> 3]( + &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), + 64, + &(((EB_S16*)(contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->bufferY))[tuOriginIndex]), + contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr->strideY, + &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), + candidateBuffer->reconPtr->strideY, + cuStatsPtr->size, + cuStatsPtr->size); + + } + else { + + PictureCopy8Bit( + candidateBuffer->predictionPtr, + tuOriginIndex, + 0, + candidateBuffer->reconPtr, + tuOriginIndex, + 0, + cuStatsPtr->size, + cuStatsPtr->size, + 0, + 0, + PICTURE_BUFFER_DESC_Y_FLAG); + } + + tuFullDistortion[0][DIST_CALC_RESIDUAL] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( + &(inputPicturePtr->bufferY[inputOriginIndex]), + inputPicturePtr->strideY, + &(candidateBuffer->reconPtr->bufferY[tuOriginIndex]), + candidateBuffer->reconPtr->strideY, + cuStatsPtr->size, + cuStatsPtr->size); + + tuFullDistortion[0][DIST_CALC_PREDICTION] = SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(cuStatsPtr->size) - 2]( + &(inputPicturePtr->bufferY[inputOriginIndex]), + inputPicturePtr->strideY, + &(candidateBuffer->predictionPtr->bufferY[tuOriginIndex]), + candidateBuffer->predictionPtr->strideY, + cuStatsPtr->size, + cuStatsPtr->size); + } + else { + + PictureFullDistortionLuma( + contextPtr->transQuantBuffersPtr->tuTransCoeff2Nx2NPtr, + tuOriginIndex, + candidateBuffer->reconCoeffPtr, + tuOriginIndex, + (contextPtr->cuStats->size >> contextPtr->pfMdMode), + tuFullDistortion[0], + yCountNonZeroCoeffs[0], + candidateBuffer->candidatePtr->type); + + const EB_U32 lumaShift = 2 * (7 - Log2f(cuStatsPtr->size)); + tuFullDistortion[0][DIST_CALC_RESIDUAL] = (tuFullDistortion[0][DIST_CALC_RESIDUAL] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; + tuFullDistortion[0][DIST_CALC_PREDICTION] = (tuFullDistortion[0][DIST_CALC_PREDICTION] + (EB_U64)(1 << (lumaShift - 1))) >> lumaShift; + } + + TuEstimateCoeffBitsLuma( + tuOriginIndex, + contextPtr->coeffEstEntropyCoderPtr, + candidateBuffer->residualQuantCoeffPtr, + yCountNonZeroCoeffs[0], + &yTuCoeffBits, + contextPtr->cuStats->size, + candidateBuffer->candidatePtr->type, + candidateBuffer->candidatePtr->intraLumaMode, + contextPtr->pfMdMode, + contextPtr->coeffCabacUpdate, + &(candidateBuffer->candBuffCoeffCtxModel), + contextPtr->CabacCost); + + TuCalcCostLuma( + cuStatsPtr->size, + candidateBuffer->candidatePtr, + 0, + cuStatsPtr->size, + yCountNonZeroCoeffs[0], + tuFullDistortion[0], + &yTuCoeffBits, + contextPtr->qp, + contextPtr->fullLambda, + contextPtr->fullChromaLambda); + + (*yCoeffBits) += yTuCoeffBits; + yFullDistortion[DIST_CALC_RESIDUAL] = tuFullDistortion[0][DIST_CALC_RESIDUAL]; + yFullDistortion[DIST_CALC_PREDICTION] = tuFullDistortion[0][DIST_CALC_PREDICTION]; + candidateBuffer->yDc[0] = ABS(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferY)[tuOriginIndex]); + candidateBuffer->yCountNonZeroCoeffs[0] = (EB_U16)yCountNonZeroCoeffs[0]; + } } void UnifiedQuantizeInvQuantize_R( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 bitDepth, - EB_U32 areaSize, - EB_PICTURE sliceType, - EB_U32 *yCountNonZeroCoeffs, - EB_S8 mdNonZeroCoeff, - EB_PF_MODE pfMode, - EB_U32 tuOriginX, - EB_U32 tuOriginY, - EB_U32 lcuOriginY, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag, - EB_MODETYPE type, - EB_U32 componentType, - EB_U32 temporalLayerIndex, - EB_BOOL encDecFlag, - EB_U32 dZoffset, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 bitDepth, + EB_U32 areaSize, + EB_PICTURE sliceType, + EB_U32 *yCountNonZeroCoeffs, + EB_S8 mdNonZeroCoeff, + EB_PF_MODE pfMode, + EB_U32 tuOriginX, + EB_U32 tuOriginY, + EB_U32 lcuOriginY, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag, + EB_MODETYPE type, + EB_U32 componentType, + EB_U32 temporalLayerIndex, + EB_BOOL encDecFlag, + EB_U32 dZoffset, EB_RDOQ_PMCORE_TYPE rdoqPmCoreMethod, CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost) + EB_U64 lambda, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost) { - //for the Quant - const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 - const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) - const EB_U32 qFunc = QFunc[qpRem]; // 15 bits - - const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit - - const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); - const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; - const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); - - //for the iQuant - const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT - const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; - const EB_S32 iq_offset = 1 << (shiftNum - 1); - EB_U32 adptive_qp_offset; - - adptive_qp_offset = q_offset; - - (void)(encDecFlag); - (void)(mdNonZeroCoeff); - adptive_qp_offset = dZoffset ? (dZoffset * (1 << shiftedQBits) / 20) : adptive_qp_offset; - - if (pfMode == PF_N2) { - areaSize = areaSize >> 1; - } else if (pfMode == PF_N4) { - areaSize = areaSize >> 2; - } - - if (rdoqPmCoreMethod){ - - DecoupledQuantizeInvQuantizeLoops( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - cabacEncodeCtxPtr, - lambda, - type, - intraLumaMode, - intraChromaMode, - componentType, + //for the Quant + const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 + const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) + const EB_U32 qFunc = QFunc[qpRem]; // 15 bits + + const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit + + const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); + const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; + const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); + + //for the iQuant + const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT + const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; + const EB_S32 iq_offset = 1 << (shiftNum - 1); + EB_U32 adptive_qp_offset; + + adptive_qp_offset = q_offset; + + (void)(encDecFlag); + (void)(mdNonZeroCoeff); + adptive_qp_offset = dZoffset ? (dZoffset * (1 << shiftedQBits) / 20) : adptive_qp_offset; + + if (pfMode == PF_N2) { + areaSize = areaSize >> 1; + } else if (pfMode == PF_N4) { + areaSize = areaSize >> 2; + } + + if (rdoqPmCoreMethod){ + + DecoupledQuantizeInvQuantizeLoops( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + cabacEncodeCtxPtr, + lambda, + type, + intraLumaMode, + intraChromaMode, + componentType, (EB_U8)temporalLayerIndex, - temporalLayerIndex < 3 ? EB_TRUE : EB_FALSE, + temporalLayerIndex < 3 ? EB_TRUE : EB_FALSE, (EB_U8)0, (EB_U16)qp, bitDepth, - CabacCost, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), + CabacCost, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), rdoqPmCoreMethod); - }else{ - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - qFunc, - adptive_qp_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs)); - - UpdateQiQCoef_R( - quantCoeff, - reconCoeff, - coeffStride, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), - componentType, - sliceType, - temporalLayerIndex, - enableCbflag, - enableContouringQCUpdateFlag); - } - - (void)tuOriginX; - (void)tuOriginY; - (void)lcuOriginY; + }else{ + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + qFunc, + adptive_qp_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs)); + + UpdateQiQCoef_R( + quantCoeff, + reconCoeff, + coeffStride, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), + componentType, + sliceType, + temporalLayerIndex, + enableCbflag, + enableContouringQCUpdateFlag); + } + + (void)tuOriginX; + (void)tuOriginY; + (void)lcuOriginY; (void)type; } /**************************************** ************ Full loop **************** ****************************************/ void FullLoop_R ( - LargestCodingUnit_t *lcuPtr, + LargestCodingUnit_t *lcuPtr, ModeDecisionCandidateBuffer_t *candidateBuffer, ModeDecisionContext_t *contextPtr, const CodedUnitStats_t *cuStatsPtr, @@ -587,27 +587,27 @@ void FullLoop_R ( EB_U32 componentMask, EB_U32 cbQp, EB_U32 crQp, - EB_U32 *cbCountNonZeroCoeffs, - EB_U32 *crCountNonZeroCoeffs) + EB_U32 *cbCountNonZeroCoeffs, + EB_U32 *crCountNonZeroCoeffs) { - (void)lcuPtr; + (void)lcuPtr; EB_S16 *chromaResidualPtr; EB_U32 tuIndex; EB_U32 tuOriginIndex; EB_U32 tuCbOriginIndex; - EB_U32 tuCrOriginIndex; - EB_U32 tuCount; + EB_U32 tuCrOriginIndex; + EB_U32 tuCount; const TransformUnitStats_t *tuStatPtr; EB_U32 tuItr; EB_U32 tuSize; EB_U32 chromatTuSize; EB_U32 tuOriginX; EB_U32 tuOriginY; - + EbPictureBufferDesc_t * tuTransCoeffTmpPtr; EbPictureBufferDesc_t * tuQuantCoeffTmpPtr; - + if (cuStatsPtr->size == MAX_LCU_SIZE) { tuCount = 4; tuIndex = 1; @@ -653,7 +653,7 @@ void FullLoop_R ( //&(((EB_S16*) candidateBuffer->intraChromaResidualPtr->bufferCb)[tuChromaOriginIndex]): &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferCb)[tuCbOriginIndex]); - // Cb Transform + // Cb Transform EstimateTransform( chromaResidualPtr, candidateBuffer->residualQuantCoeffPtr->strideCb, @@ -665,34 +665,34 @@ void FullLoop_R ( EB_FALSE, correctedPFMode); - UnifiedQuantizeInvQuantize_R( - &(((EB_S16*)tuTransCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), - tuTransCoeffTmpPtr->strideCb, - &(((EB_S16*)tuQuantCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), - &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferCb)[tuCbOriginIndex]), - cbQp, - inputPicturePtr->bitDepth, - chromatTuSize, - pictureControlSetPtr->sliceType, - &(cbCountNonZeroCoeffs[tuIndex]), - -1, - correctedPFMode, - 0, - 0, - 0, - 0, - 0, - candidateBuffer->candidatePtr->type, - COMPONENT_CHROMA, - pictureControlSetPtr->temporalLayerIndex, - EB_FALSE, - 0, + UnifiedQuantizeInvQuantize_R( + &(((EB_S16*)tuTransCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), + tuTransCoeffTmpPtr->strideCb, + &(((EB_S16*)tuQuantCoeffTmpPtr->bufferCb)[tuCbOriginIndex]), + &(((EB_S16*)candidateBuffer->reconCoeffPtr->bufferCb)[tuCbOriginIndex]), + cbQp, + inputPicturePtr->bitDepth, + chromatTuSize, + pictureControlSetPtr->sliceType, + &(cbCountNonZeroCoeffs[tuIndex]), + -1, + correctedPFMode, + 0, + 0, + 0, + 0, + 0, + candidateBuffer->candidatePtr->type, + COMPONENT_CHROMA, + pictureControlSetPtr->temporalLayerIndex, + EB_FALSE, + 0, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); if (contextPtr->spatialSseFullLoop == EB_TRUE) { if (cbCountNonZeroCoeffs[tuIndex]) { @@ -754,12 +754,12 @@ void FullLoop_R ( if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - // Configure the Chroma Residual Ptr + // Configure the Chroma Residual Ptr chromaResidualPtr = //(candidateBuffer->candidatePtr->type == INTRA_MODE )? //&(((EB_S16*) candidateBuffer->intraChromaResidualPtr->bufferCr)[tuChromaOriginIndex]): &(((EB_S16*)candidateBuffer->residualQuantCoeffPtr->bufferCr)[tuCrOriginIndex]); - // Cr Transform + // Cr Transform EstimateTransform( chromaResidualPtr, candidateBuffer->residualQuantCoeffPtr->strideCr, @@ -794,11 +794,11 @@ void FullLoop_R ( EB_FALSE, 0, contextPtr->rdoqPmCoreMethod, - (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, - contextPtr->fullLambda, - candidateBuffer->candidatePtr->intraLumaMode, - EB_INTRA_CHROMA_DM, - pictureControlSetPtr->cabacCost); + (CabacEncodeContext_t*)contextPtr->coeffEstEntropyCoderPtr->cabacEncodeContextPtr, + contextPtr->fullLambda, + candidateBuffer->candidatePtr->intraLumaMode, + EB_INTRA_CHROMA_DM, + pictureControlSetPtr->cabacCost); if (contextPtr->spatialSseFullLoop == EB_TRUE) { if (crCountNonZeroCoeffs[tuIndex]) { @@ -857,9 +857,9 @@ void FullLoop_R ( } } - + ++tuItr; - tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; } while (tuItr < tuCount); @@ -871,36 +871,36 @@ void FullLoop_R ( void CuFullDistortionFastTuMode_R ( EbPictureBufferDesc_t *inputPicturePtr, EB_U32 inputCbOriginIndex, - LargestCodingUnit_t *lcuPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, - ModeDecisionContext_t *contextPtr , - ModeDecisionCandidate_t *candidatePtr, - const CodedUnitStats_t *cuStatsPtr, - EB_U64 cbFullDistortion[DIST_CALC_TOTAL] , - EB_U64 crFullDistortion[DIST_CALC_TOTAL] , - EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU], - EB_U32 componentMask, + LargestCodingUnit_t *lcuPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, + ModeDecisionContext_t *contextPtr , + ModeDecisionCandidate_t *candidatePtr, + const CodedUnitStats_t *cuStatsPtr, + EB_U64 cbFullDistortion[DIST_CALC_TOTAL] , + EB_U64 crFullDistortion[DIST_CALC_TOTAL] , + EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU], + EB_U32 componentMask, EB_U64 *cbCoeffBits, EB_U64 *crCoeffBits) { - (void)lcuPtr; + (void)lcuPtr; EB_U64 yTuCoeffBits; EB_U64 cbTuCoeffBits; EB_U64 crTuCoeffBits; - EB_U32 tuOriginIndex; - EB_U32 tuOriginX; - EB_U32 tuOriginY; - EB_U32 currentTuIndex; - EB_U32 chromaShift; + EB_U32 tuOriginIndex; + EB_U32 tuOriginX; + EB_U32 tuOriginY; + EB_U32 currentTuIndex; + EB_U32 chromaShift; EB_U32 tuChromaOriginIndex; - EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; - EbPictureBufferDesc_t *transformBuffer; - EB_U32 tuTotalCount; - EB_U32 tuSize; - EB_U32 chromaTuSize; - const TransformUnitStats_t *tuStatPtr; - EB_U32 tuItr = 0; + EB_U64 tuFullDistortion[3][DIST_CALC_TOTAL]; + EbPictureBufferDesc_t *transformBuffer; + EB_U32 tuTotalCount; + EB_U32 tuSize; + EB_U32 chromaTuSize; + const TransformUnitStats_t *tuStatPtr; + EB_U32 tuItr = 0; if (cuStatsPtr->size == MAX_LCU_SIZE){ currentTuIndex = 1; @@ -914,24 +914,24 @@ void CuFullDistortionFastTuMode_R ( tuTotalCount = 1; } - do { + do { tuStatPtr = GetTransformUnitStats(currentTuIndex); tuOriginX = TU_ORIGIN_ADJUST(cuStatsPtr->originX, cuStatsPtr->size, tuStatPtr->offsetX); tuOriginY = TU_ORIGIN_ADJUST(cuStatsPtr->originY, cuStatsPtr->size, tuStatPtr->offsetY); tuSize = cuStatsPtr->size >> tuStatPtr->depth; chromaTuSize = tuSize == 4 ? tuSize : (tuSize >> 1); - tuOriginIndex = tuOriginX + tuOriginY * candidateBuffer->residualQuantCoeffPtr->strideY ; + tuOriginIndex = tuOriginX + tuOriginY * candidateBuffer->residualQuantCoeffPtr->strideY ; tuChromaOriginIndex = tuSize == 4 ? - tuOriginIndex : + tuOriginIndex : ((tuOriginX + tuOriginY * candidateBuffer->residualQuantCoeffPtr->strideCb) >> 1); // Reset the Bit Costs yTuCoeffBits = 0; - cbTuCoeffBits = 0; + cbTuCoeffBits = 0; crTuCoeffBits = 0; - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK){ + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK){ EB_U32 countNonZeroCoeffsAll[3]; countNonZeroCoeffsAll[0] = countNonZeroCoeffs[0][currentTuIndex]; @@ -939,7 +939,7 @@ void CuFullDistortionFastTuMode_R ( countNonZeroCoeffsAll[2] = countNonZeroCoeffs[2][currentTuIndex]; EB_PF_MODE correctedPFMode = contextPtr->pfMdMode; - + if(chromaTuSize == 4) correctedPFMode = PF_OFF; else if(chromaTuSize == 8 && contextPtr->pfMdMode == PF_N4) @@ -984,7 +984,7 @@ void CuFullDistortionFastTuMode_R ( else { // *Full Distortion (SSE) // *Note - there are known issues with how this distortion metric is currently - // calculated. The amount of scaling between the two arrays is not + // calculated. The amount of scaling between the two arrays is not // equivalent. PictureFullDistortion_R( transformBuffer, @@ -993,7 +993,7 @@ void CuFullDistortionFastTuMode_R ( candidateBuffer->reconCoeffPtr, (tuSize >> contextPtr->pfMdMode), (chromaTuSize >> correctedPFMode), - PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, + PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, tuFullDistortion[0], tuFullDistortion[1], tuFullDistortion[2], @@ -1006,7 +1006,7 @@ void CuFullDistortionFastTuMode_R ( tuFullDistortion[1][DIST_CALC_PREDICTION] = (tuFullDistortion[1][DIST_CALC_PREDICTION] + (EB_U64)(1 << (chromaShift - 1))) >> chromaShift; tuFullDistortion[2][DIST_CALC_RESIDUAL] = (tuFullDistortion[2][DIST_CALC_RESIDUAL] + (EB_U64)(1 << (chromaShift - 1))) >> chromaShift; tuFullDistortion[2][DIST_CALC_PREDICTION] = (tuFullDistortion[2][DIST_CALC_PREDICTION] + (EB_U64)(1 << (chromaShift - 1))) >> chromaShift; - + } TuEstimateCoeffBits_R( @@ -1031,362 +1031,362 @@ void CuFullDistortionFastTuMode_R ( &(candidateBuffer->candBuffCoeffCtxModel), contextPtr->CabacCost); - TuCalcCost( + TuCalcCost( contextPtr->cuSize, candidatePtr, currentTuIndex, tuSize, chromaTuSize, countNonZeroCoeffs[0][currentTuIndex], - countNonZeroCoeffs[1][currentTuIndex], - countNonZeroCoeffs[2][currentTuIndex], + countNonZeroCoeffs[1][currentTuIndex], + countNonZeroCoeffs[2][currentTuIndex], tuFullDistortion[0], tuFullDistortion[1], tuFullDistortion[2], - PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, + PICTURE_BUFFER_DESC_CHROMA_MASK,//componentMask, &yTuCoeffBits, &cbTuCoeffBits, &crTuCoeffBits, contextPtr->qp, contextPtr->fullLambda, - contextPtr->fullChromaLambda); + contextPtr->fullChromaLambda); - *cbCoeffBits += cbTuCoeffBits; + *cbCoeffBits += cbTuCoeffBits; *crCoeffBits += crTuCoeffBits; cbFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[1][DIST_CALC_RESIDUAL]; crFullDistortion[DIST_CALC_RESIDUAL] += tuFullDistortion[2][DIST_CALC_RESIDUAL]; cbFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[1][DIST_CALC_PREDICTION]; crFullDistortion[DIST_CALC_PREDICTION] += tuFullDistortion[2][DIST_CALC_PREDICTION]; - } + } ++tuItr; - currentTuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + currentTuIndex = tuIndexList[tuStatPtr->depth][tuItr]; - } while (tuItr < tuTotalCount); + } while (tuItr < tuTotalCount); } EB_U32 ExitInterDepthDecision( - ModeDecisionContext_t *contextPtr, - EB_U32 leafIndex, - LargestCodingUnit_t *tbPtr, - EB_U32 lcuAddr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_U64 fullLambda, - MdRateEstimationContext_t *mdRateEstimationPtr, - PictureControlSet_t *pictureControlSetPtr) + ModeDecisionContext_t *contextPtr, + EB_U32 leafIndex, + LargestCodingUnit_t *tbPtr, + EB_U32 lcuAddr, + EB_U32 tbOriginX, + EB_U32 tbOriginY, + EB_U64 fullLambda, + MdRateEstimationContext_t *mdRateEstimationPtr, + PictureControlSet_t *pictureControlSetPtr) { - EB_U32 lastCuIndex; - EB_U32 leftCuIndex; - EB_U32 topCuIndex; - EB_U32 topLeftCuIndex; - EB_U32 depthZeroCandidateCuIndex; - EB_U32 depthOneCandidateCuIndex = leafIndex; - EB_U32 depthTwoCandidateCuIndex = leafIndex; - EB_U64 depthNRate = 0; - EB_U64 depthNPlusOneRate = 0; - EB_U64 depthNCost = 0; - EB_U64 depthNPlusOneCost = 0; - EB_U32 cuOriginX; - EB_U32 cuOriginY; - EB_U32 tbMaxDepth = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth; - - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - const CodedUnitStats_t *curCuStatsPtr; - const CodedUnitStats_t *depthTwoCuStatsPtr; - const CodedUnitStats_t *depthOneCuStatsPtr; - const CodedUnitStats_t *depthZeroCuStatsPtr; - - (void)lcuAddr; - lastCuIndex = leafIndex; - curCuStatsPtr = GetCodedUnitStats(leafIndex); - cuOriginX = tbOriginX + curCuStatsPtr->originX; - cuOriginY = tbOriginY + curCuStatsPtr->originY; - - - - //Parent is winner, update its cost, and trigger and inter-depth check-point. - EB_U64 SplitRate = 0; - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[leafIndex], - 0, - &SplitRate, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - sequenceControlSetPtr->maxLcuDepth); - - contextPtr->mdLocalCuUnit[leafIndex].cost += SplitRate; - - if (curCuStatsPtr->depth == 0) { - contextPtr->groupOf16x16BlocksCount = 0; - } - else if (curCuStatsPtr->depth == 1) { - contextPtr->groupOf16x16BlocksCount++; - contextPtr->groupOf8x8BlocksCount = 0; - } - else if (curCuStatsPtr->depth == 2) { - contextPtr->groupOf8x8BlocksCount++; - } - - - /*** Stage 0: Inter depth decision: depth 2 vs depth 3 ***/ - - // Walks to the last coded 8x8 block for merging - if ((GROUP_OF_4_8x8_BLOCKS(cuOriginX, cuOriginY))) { - - depthTwoCandidateCuIndex = leafIndex - DEPTH_THREE_STEP - DEPTH_THREE_STEP - DEPTH_THREE_STEP - 1; - - contextPtr->groupOf8x8BlocksCount++; - - // From the last coded cu index, get the indices of the left, top, and top left cus - leftCuIndex = leafIndex - DEPTH_THREE_STEP; - topCuIndex = leftCuIndex - DEPTH_THREE_STEP; - topLeftCuIndex = topCuIndex - DEPTH_THREE_STEP; - - // From the top left index, get the index of the candidate pu for merging - depthTwoCandidateCuIndex = topLeftCuIndex - 1; - - // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation - // This needs to be done in the case that the N block was initially not calculated. - - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; - - // Compute depth N cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 0, - &depthNRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; - - depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[leafIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - - - // Inter depth comparison: depth 2 vs depth 3 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthTwoCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; - } - - - } - - // Stage 1: Inter depth decision: depth 1 vs depth 2 - - // Walks to the last coded 16x16 block for merging - depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); - cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; - cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; - - if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && - (contextPtr->groupOf8x8BlocksCount == 4)){ - - - depthOneCandidateCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP - DEPTH_TWO_STEP - DEPTH_TWO_STEP - 1; - - contextPtr->groupOf8x8BlocksCount = 0; - contextPtr->groupOf16x16BlocksCount++; - - // From the last coded pu index, get the indices of the left, top, and top left pus - leftCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP; - topCuIndex = leftCuIndex - DEPTH_TWO_STEP; - topLeftCuIndex = topCuIndex - DEPTH_TWO_STEP; - - // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation - // This needs to be done in the case that the N block was initially not calculated. - - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; - - // From the top left index, get the index of the candidate pu for merging - depthOneCandidateCuIndex = topLeftCuIndex - 1; - - depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); - if (depthOneCuStatsPtr->depth == 1) { - - // Compute depth N cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 0, - &depthNRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - - - // Inter depth comparison: depth 1 vs depth 2 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthOneCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; - } - - - } - } - - // Stage 2: Inter depth decision: depth 0 vs depth 1 - - // Walks to the last coded 32x32 block for merging - // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates - depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); - cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; - cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; - if ((pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) - && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && - (contextPtr->groupOf16x16BlocksCount == 4)) { - - depthZeroCandidateCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP - DEPTH_ONE_STEP - DEPTH_ONE_STEP - 1; - - contextPtr->groupOf16x16BlocksCount = 0; - - // From the last coded pu index, get the indices of the left, top, and top left pus - leftCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP; - topCuIndex = leftCuIndex - DEPTH_ONE_STEP; - topLeftCuIndex = topCuIndex - DEPTH_ONE_STEP; - - // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation - // This needs to be done in the case that the N block was initially not calculated. - - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; - - // From the top left index, get the index of the candidate pu for merging - depthZeroCandidateCuIndex = topLeftCuIndex - 1; - - depthZeroCuStatsPtr = GetCodedUnitStats(depthZeroCandidateCuIndex); - if (depthZeroCuStatsPtr->depth == 0) { - - // Compute depth N cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 0, - &depthNRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - - // Inter depth comparison: depth 0 vs depth 1 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; - lastCuIndex = depthZeroCandidateCuIndex; - } - - - } - } - - return lastCuIndex; + EB_U32 lastCuIndex; + EB_U32 leftCuIndex; + EB_U32 topCuIndex; + EB_U32 topLeftCuIndex; + EB_U32 depthZeroCandidateCuIndex; + EB_U32 depthOneCandidateCuIndex = leafIndex; + EB_U32 depthTwoCandidateCuIndex = leafIndex; + EB_U64 depthNRate = 0; + EB_U64 depthNPlusOneRate = 0; + EB_U64 depthNCost = 0; + EB_U64 depthNPlusOneCost = 0; + EB_U32 cuOriginX; + EB_U32 cuOriginY; + EB_U32 tbMaxDepth = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth; + + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + const CodedUnitStats_t *curCuStatsPtr; + const CodedUnitStats_t *depthTwoCuStatsPtr; + const CodedUnitStats_t *depthOneCuStatsPtr; + const CodedUnitStats_t *depthZeroCuStatsPtr; + + (void)lcuAddr; + lastCuIndex = leafIndex; + curCuStatsPtr = GetCodedUnitStats(leafIndex); + cuOriginX = tbOriginX + curCuStatsPtr->originX; + cuOriginY = tbOriginY + curCuStatsPtr->originY; + + + + //Parent is winner, update its cost, and trigger and inter-depth check-point. + EB_U64 SplitRate = 0; + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[leafIndex], + 0, + &SplitRate, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + sequenceControlSetPtr->maxLcuDepth); + + contextPtr->mdLocalCuUnit[leafIndex].cost += SplitRate; + + if (curCuStatsPtr->depth == 0) { + contextPtr->groupOf16x16BlocksCount = 0; + } + else if (curCuStatsPtr->depth == 1) { + contextPtr->groupOf16x16BlocksCount++; + contextPtr->groupOf8x8BlocksCount = 0; + } + else if (curCuStatsPtr->depth == 2) { + contextPtr->groupOf8x8BlocksCount++; + } + + + /*** Stage 0: Inter depth decision: depth 2 vs depth 3 ***/ + + // Walks to the last coded 8x8 block for merging + if ((GROUP_OF_4_8x8_BLOCKS(cuOriginX, cuOriginY))) { + + depthTwoCandidateCuIndex = leafIndex - DEPTH_THREE_STEP - DEPTH_THREE_STEP - DEPTH_THREE_STEP - 1; + + contextPtr->groupOf8x8BlocksCount++; + + // From the last coded cu index, get the indices of the left, top, and top left cus + leftCuIndex = leafIndex - DEPTH_THREE_STEP; + topCuIndex = leftCuIndex - DEPTH_THREE_STEP; + topLeftCuIndex = topCuIndex - DEPTH_THREE_STEP; + + // From the top left index, get the index of the candidate pu for merging + depthTwoCandidateCuIndex = topLeftCuIndex - 1; + + // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation + // This needs to be done in the case that the N block was initially not calculated. + + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + + // Compute depth N cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 0, + &depthNRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; + + depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[leafIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + + + // Inter depth comparison: depth 2 vs depth 3 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthTwoCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; + } + + + } + + // Stage 1: Inter depth decision: depth 1 vs depth 2 + + // Walks to the last coded 16x16 block for merging + depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); + cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; + cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; + + if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && + (contextPtr->groupOf8x8BlocksCount == 4)){ + + + depthOneCandidateCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP - DEPTH_TWO_STEP - DEPTH_TWO_STEP - 1; + + contextPtr->groupOf8x8BlocksCount = 0; + contextPtr->groupOf16x16BlocksCount++; + + // From the last coded pu index, get the indices of the left, top, and top left pus + leftCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP; + topCuIndex = leftCuIndex - DEPTH_TWO_STEP; + topLeftCuIndex = topCuIndex - DEPTH_TWO_STEP; + + // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation + // This needs to be done in the case that the N block was initially not calculated. + + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + + // From the top left index, get the index of the candidate pu for merging + depthOneCandidateCuIndex = topLeftCuIndex - 1; + + depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); + if (depthOneCuStatsPtr->depth == 1) { + + // Compute depth N cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 0, + &depthNRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + + + // Inter depth comparison: depth 1 vs depth 2 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthOneCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; + } + + + } + } + + // Stage 2: Inter depth decision: depth 0 vs depth 1 + + // Walks to the last coded 32x32 block for merging + // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates + depthOneCuStatsPtr = GetCodedUnitStats(depthOneCandidateCuIndex); + cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; + cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; + if ((pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE) + && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && + (contextPtr->groupOf16x16BlocksCount == 4)) { + + depthZeroCandidateCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP - DEPTH_ONE_STEP - DEPTH_ONE_STEP - 1; + + contextPtr->groupOf16x16BlocksCount = 0; + + // From the last coded pu index, get the indices of the left, top, and top left pus + leftCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP; + topCuIndex = leftCuIndex - DEPTH_ONE_STEP; + topLeftCuIndex = topCuIndex - DEPTH_ONE_STEP; + + // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation + // This needs to be done in the case that the N block was initially not calculated. + + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + + // From the top left index, get the index of the candidate pu for merging + depthZeroCandidateCuIndex = topLeftCuIndex - 1; + + depthZeroCuStatsPtr = GetCodedUnitStats(depthZeroCandidateCuIndex); + if (depthZeroCuStatsPtr->depth == 0) { + + // Compute depth N cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 0, + &depthNRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + + // Inter depth comparison: depth 0 vs depth 1 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; + lastCuIndex = depthZeroCandidateCuIndex; + } + + + } + } + + return lastCuIndex; } EB_BOOL StopSplitCondition( @@ -1403,7 +1403,7 @@ EB_BOOL StopSplitCondition( EB_BOOL stopSplitFlag = EB_TRUE; if ( pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL85_DEPTH_MODE || - pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL84_DEPTH_MODE || + pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_FULL84_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_FULL85_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_FULL84_DEPTH_MODE || pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_AVC_DEPTH_MODE)) ) { @@ -1413,9 +1413,9 @@ EB_BOOL StopSplitCondition( stopSplitFlag = EB_FALSE; } else{ - if (sequenceControlSetPtr->staticConfig.qp >= 20 && - pictureControlSetPtr->sliceType != EB_I_PICTURE && - pictureControlSetPtr->temporalLayerIndex == 0 && + if (sequenceControlSetPtr->staticConfig.qp >= 20 && + pictureControlSetPtr->sliceType != EB_I_PICTURE && + pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->ParentPcsPtr->logoPicFlag && pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuAddr].edgeBlockNum) { @@ -1443,8 +1443,8 @@ EB_BOOL StopSplitCondition( stopSplitFlag = (interSlice && (stopAtDepth0 || stopAtDepth1 || stopAtDepth2)) ? EB_TRUE : EB_FALSE; if (!lcuParams->isCompleteLcu || - pictureControlSetPtr->ParentPcsPtr->lcuIsolatedNonHomogeneousAreaArray[lcuAddr] || - (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE && pictureControlSetPtr->lcuPtrArray[lcuAddr]->auraStatus == AURA_STATUS_1)) { + pictureControlSetPtr->ParentPcsPtr->lcuIsolatedNonHomogeneousAreaArray[lcuAddr] || + (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE && pictureControlSetPtr->lcuPtrArray[lcuAddr]->auraStatus == AURA_STATUS_1)) { stopSplitFlag = EB_FALSE; } @@ -1509,7 +1509,7 @@ EB_U32 ProductPerformInterDepthDecision( leafIndex); if (lastDepthFlag || stopSplitFlag) { - tbPtr->codedLeafArrayPtr[leafIndex]->splitFlag = EB_FALSE; + tbPtr->codedLeafArrayPtr[leafIndex]->splitFlag = EB_FALSE; if (curCuStatsPtr->depth == 1) { @@ -1539,67 +1539,67 @@ EB_U32 ProductPerformInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; - - depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[leafIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - // Inter depth comparison: depth 2 vs depth 3 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthTwoCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; + + depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[leafIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + // Inter depth comparison: depth 2 vs depth 3 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthTwoCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; + } } - - // Stage 1: Inter depth decision: depth 1 vs depth 2 - + + // Stage 1: Inter depth decision: depth 1 vs depth 2 + // Walks to the last coded 16x16 block for merging depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; - if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && + if (GROUP_OF_4_16x16_BLOCKS(cuOriginX, cuOriginY) && (contextPtr->groupOf8x8BlocksCount == 4 ) ){ depthOneCandidateCuIndex = depthTwoCandidateCuIndex - DEPTH_TWO_STEP - DEPTH_TWO_STEP - DEPTH_TWO_STEP - 1; @@ -1615,10 +1615,10 @@ EB_U32 ProductPerformInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthOneCandidateCuIndex = topLeftCuIndex - 1; @@ -1627,75 +1627,75 @@ EB_U32 ProductPerformInterDepthDecision( if (depthOneCuStatsPtr->depth == 1) { // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; - - // Inter depth comparison: depth 1 vs depth 2 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthOneCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; + + // Inter depth comparison: depth 1 vs depth 2 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthOneCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; + } } } - // Stage 2: Inter depth decision: depth 0 vs depth 1 + // Stage 2: Inter depth decision: depth 0 vs depth 1 // Walks to the last coded 32x32 block for merging // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates @@ -1703,7 +1703,7 @@ EB_U32 ProductPerformInterDepthDecision( cuOriginX = tbOriginX + depthTwoCuStatsPtr->originX; cuOriginY = tbOriginY + depthTwoCuStatsPtr->originY; if ((pictureControlSetPtr->sliceType == EB_P_PICTURE || pictureControlSetPtr->sliceType == EB_B_PICTURE ) - && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && + && GROUP_OF_4_32x32_BLOCKS(cuOriginX, cuOriginY) && (contextPtr->groupOf16x16BlocksCount == 4)) { depthZeroCandidateCuIndex = depthOneCandidateCuIndex - DEPTH_ONE_STEP - DEPTH_ONE_STEP - DEPTH_ONE_STEP - 1; @@ -1718,56 +1718,56 @@ EB_U32 ProductPerformInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthZeroCandidateCuIndex = topLeftCuIndex - 1; - + depthZeroCuStatsPtr = GetCodedUnitStats(depthZeroCandidateCuIndex); if (depthZeroCuStatsPtr->depth == 0) { - + // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; - - // Inter depth comparison: depth 0 vs depth 1 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; - lastCuIndex = depthZeroCandidateCuIndex; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; + + // Inter depth comparison: depth 0 vs depth 1 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; + lastCuIndex = depthZeroCandidateCuIndex; + } } @@ -1849,60 +1849,60 @@ EB_U32 PillarInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; - - depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[leafIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - // Inter depth comparison: depth 2 vs depth 3 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthTwoCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = MAX_CU_COST; + + depthNCost = contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[leafIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + // Inter depth comparison: depth 2 vs depth 3 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthTwoCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthTwoCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost = depthNPlusOneCost; + } } - // Stage 1: Inter depth decision: depth 1 vs depth 2 + // Stage 1: Inter depth decision: depth 1 vs depth 2 // Walks to the last coded 16x16 block for merging depthTwoCuStatsPtr = GetCodedUnitStats(depthTwoCandidateCuIndex); @@ -1924,10 +1924,10 @@ EB_U32 PillarInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthOneCandidateCuIndex = topLeftCuIndex - 1; @@ -1936,74 +1936,74 @@ EB_U32 PillarInterDepthDecision( if (depthOneCuStatsPtr->depth == 1) { // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; - - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - CHECK_REPORT_ERROR( - (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), - encodeContextPtr->appCallbackPtr, - EB_ENC_FL_ERROR4); - - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; - - // Inter depth comparison: depth 1 vs depth 2 - if (depthNCost <= depthNPlusOneCost) { - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; - lastCuIndex = depthOneCandidateCuIndex; - } - else { - // If the cost is not low enough: - // update the cost of the candidate pu for merging - // this update is required for the next inter depth decision - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + depthNRate; + + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[depthTwoCandidateCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[leftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + CHECK_REPORT_ERROR( + (contextPtr->mdLocalCuUnit[topLeftCuIndex].cost != MAX_CU_COST), + encodeContextPtr->appCallbackPtr, + EB_ENC_FL_ERROR4); + + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW12) / 100; + + // Inter depth comparison: depth 1 vs depth 2 + if (depthNCost <= depthNPlusOneCost) { + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthOneCandidateCuIndex]->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNCost; + lastCuIndex = depthOneCandidateCuIndex; + } + else { + // If the cost is not low enough: + // update the cost of the candidate pu for merging + // this update is required for the next inter depth decision + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost = depthNPlusOneCost; + } } } - // Stage 2: Inter depth decision: depth 0 vs depth 1 + // Stage 2: Inter depth decision: depth 0 vs depth 1 // Walks to the last coded 32x32 block for merging // Stage 2 isn't performed in I slices since the abcense of 64x64 candidates @@ -2026,10 +2026,10 @@ EB_U32 PillarInterDepthDecision( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].leftNeighborDepth; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborMode = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborMode; + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[topLeftCuIndex].topNeighborDepth; // From the top left index, get the index of the candidate pu for merging depthZeroCandidateCuIndex = topLeftCuIndex - 1; @@ -2038,44 +2038,44 @@ EB_U32 PillarInterDepthDecision( if (depthZeroCuStatsPtr->depth == 0) { // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], 0, &depthNRate, fullLambda, mdRateEstimationPtr, - tbMaxDepth); - if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) - contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; - depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; - // Compute depth N+1 cost - SplitFlagRate( - contextPtr, - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], - 1, - &depthNPlusOneRate, - fullLambda, - mdRateEstimationPtr, - tbMaxDepth); - depthNPlusOneCost = - contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + - contextPtr->mdLocalCuUnit[leftCuIndex].cost + - contextPtr->mdLocalCuUnit[topCuIndex].cost + - contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + - depthNPlusOneRate; - if (depthNPlusOneCost < MAX_CU_COST) - depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; - - // Inter depth comparison: depth 0 vs depth 1 - if (depthNCost <= depthNPlusOneCost){ - - // If the cost is low enough to warrant not spliting further: - // 1. set the split flag of the candidate pu for merging to false - // 2. update the last pu index - tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; - lastCuIndex = depthZeroCandidateCuIndex; - } + tbMaxDepth); + if (contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].testedCuFlag == EB_FALSE) + contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost = MAX_CU_COST; + depthNCost = contextPtr->mdLocalCuUnit[depthZeroCandidateCuIndex].cost + depthNRate; + // Compute depth N+1 cost + SplitFlagRate( + contextPtr, + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex], + 1, + &depthNPlusOneRate, + fullLambda, + mdRateEstimationPtr, + tbMaxDepth); + depthNPlusOneCost = + contextPtr->mdLocalCuUnit[depthOneCandidateCuIndex].cost + + contextPtr->mdLocalCuUnit[leftCuIndex].cost + + contextPtr->mdLocalCuUnit[topCuIndex].cost + + contextPtr->mdLocalCuUnit[topLeftCuIndex].cost + + depthNPlusOneRate; + if (depthNPlusOneCost < MAX_CU_COST) + depthNPlusOneCost = depthNPlusOneCost + ((EB_S64)depthNPlusOneCost*interDepthW01) / 100; + + // Inter depth comparison: depth 0 vs depth 1 + if (depthNCost <= depthNPlusOneCost){ + + // If the cost is low enough to warrant not spliting further: + // 1. set the split flag of the candidate pu for merging to false + // 2. update the last pu index + tbPtr->codedLeafArrayPtr[depthZeroCandidateCuIndex]->splitFlag = EB_FALSE; + lastCuIndex = depthZeroCandidateCuIndex; + } } } diff --git a/Source/Lib/Codec/EbFullLoop.h b/Source/Lib/Codec/EbFullLoop.h index f38dbf3bc..a127008db 100644 --- a/Source/Lib/Codec/EbFullLoop.h +++ b/Source/Lib/Codec/EbFullLoop.h @@ -21,8 +21,8 @@ extern "C" { EB_U32 componentMask, EB_U32 cbQp, EB_U32 crQp, - EB_U32 *cbCountNonZeroCoeffs, - EB_U32 *crCountNonZeroCoeffs); + EB_U32 *cbCountNonZeroCoeffs, + EB_U32 *crCountNonZeroCoeffs); void CuFullDistortionFastTuMode_R( EbPictureBufferDesc_t *inputPicturePtr, @@ -30,12 +30,12 @@ extern "C" { LargestCodingUnit_t *lcuPtr, ModeDecisionCandidateBuffer_t *candidateBuffer, ModeDecisionContext_t *contextPtr, - ModeDecisionCandidate_t *candidatePtr, - const CodedUnitStats_t *cuStatsPtr, + ModeDecisionCandidate_t *candidatePtr, + const CodedUnitStats_t *cuStatsPtr, EB_U64 cbFullDistortion[DIST_CALC_TOTAL], EB_U64 crFullDistortion[DIST_CALC_TOTAL], EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU], - EB_U32 componentMask, + EB_U32 componentMask, EB_U64 *cbCoeffBits, EB_U64 *crCoeffBits); @@ -47,7 +47,7 @@ extern "C" { const CodedUnitStats_t *cuStatsPtr, PictureControlSet_t *pictureControlSetPtr, EB_U32 qp, - EB_U32 *yCountNonZeroCoeffs, + EB_U32 *yCountNonZeroCoeffs, EB_U64 *yCoeffBits, EB_U64 *yFullDistortion); @@ -62,16 +62,16 @@ extern "C" { MdRateEstimationContext_t *mdRateEstimationPtr, PictureControlSet_t *pictureControlSetPtr); - EB_U32 ExitInterDepthDecision( - ModeDecisionContext_t *contextPtr, - EB_U32 leafIndex, - LargestCodingUnit_t *tbPtr, - EB_U32 lcuAddr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_U64 fullLambda, - MdRateEstimationContext_t *mdRateEstimationPtr, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 ExitInterDepthDecision( + ModeDecisionContext_t *contextPtr, + EB_U32 leafIndex, + LargestCodingUnit_t *tbPtr, + EB_U32 lcuAddr, + EB_U32 tbOriginX, + EB_U32 tbOriginY, + EB_U64 fullLambda, + MdRateEstimationContext_t *mdRateEstimationPtr, + PictureControlSet_t *pictureControlSetPtr); extern EB_U32 PillarInterDepthDecision( ModeDecisionContext_t *contextPtr, diff --git a/Source/Lib/Codec/EbHmCode.c b/Source/Lib/Codec/EbHmCode.c index 279cb9d6a..c0ca51683 100644 --- a/Source/Lib/Codec/EbHmCode.c +++ b/Source/Lib/Codec/EbHmCode.c @@ -39,208 +39,208 @@ * returns 4x4 Sum of Absolute Transformed Differences *******************************************/ EB_U64 Compute4x4Satd( - EB_S16 *diff) // input parameter, diff samples Ptr + EB_S16 *diff) // input parameter, diff samples Ptr { - EB_U64 satdBlock4x4 = 0; - EB_S16 m[16], d[16]; - EB_U32 k; - - /*===== hadamard transform =====*/ - m[0] = diff[0] + diff[12]; - m[1] = diff[1] + diff[13]; - m[2] = diff[2] + diff[14]; - m[3] = diff[3] + diff[15]; - m[4] = diff[4] + diff[8]; - m[5] = diff[5] + diff[9]; - m[6] = diff[6] + diff[10]; - m[7] = diff[7] + diff[11]; - m[8] = diff[4] - diff[8]; - m[9] = diff[5] - diff[9]; - m[10] = diff[6] - diff[10]; - m[11] = diff[7] - diff[11]; - m[12] = diff[0] - diff[12]; - m[13] = diff[1] - diff[13]; - m[14] = diff[2] - diff[14]; - m[15] = diff[3] - diff[15]; - - d[0] = m[0] + m[4]; - d[1] = m[1] + m[5]; - d[2] = m[2] + m[6]; - d[3] = m[3] + m[7]; - d[4] = m[8] + m[12]; - d[5] = m[9] + m[13]; - d[6] = m[10] + m[14]; - d[7] = m[11] + m[15]; - d[8] = m[0] - m[4]; - d[9] = m[1] - m[5]; - d[10] = m[2] - m[6]; - d[11] = m[3] - m[7]; - d[12] = m[12] - m[8]; - d[13] = m[13] - m[9]; - d[14] = m[14] - m[10]; - d[15] = m[15] - m[11]; - - m[0] = d[0] + d[3]; - m[1] = d[1] + d[2]; - m[2] = d[1] - d[2]; - m[3] = d[0] - d[3]; - m[4] = d[4] + d[7]; - m[5] = d[5] + d[6]; - m[6] = d[5] - d[6]; - m[7] = d[4] - d[7]; - m[8] = d[8] + d[11]; - m[9] = d[9] + d[10]; - m[10] = d[9] - d[10]; - m[11] = d[8] - d[11]; - m[12] = d[12] + d[15]; - m[13] = d[13] + d[14]; - m[14] = d[13] - d[14]; - m[15] = d[12] - d[15]; - - d[0] = m[0] + m[1]; - d[1] = m[0] - m[1]; - d[2] = m[2] + m[3]; - d[3] = m[3] - m[2]; - d[4] = m[4] + m[5]; - d[5] = m[4] - m[5]; - d[6] = m[6] + m[7]; - d[7] = m[7] - m[6]; - d[8] = m[8] + m[9]; - d[9] = m[8] - m[9]; - d[10] = m[10] + m[11]; - d[11] = m[11] - m[10]; - d[12] = m[12] + m[13]; - d[13] = m[12] - m[13]; - d[14] = m[14] + m[15]; - d[15] = m[15] - m[14]; - - for (k = 0; k<16; ++k) { - satdBlock4x4 += ABS(d[k]); - } - - satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); - - return satdBlock4x4; + EB_U64 satdBlock4x4 = 0; + EB_S16 m[16], d[16]; + EB_U32 k; + + /*===== hadamard transform =====*/ + m[0] = diff[0] + diff[12]; + m[1] = diff[1] + diff[13]; + m[2] = diff[2] + diff[14]; + m[3] = diff[3] + diff[15]; + m[4] = diff[4] + diff[8]; + m[5] = diff[5] + diff[9]; + m[6] = diff[6] + diff[10]; + m[7] = diff[7] + diff[11]; + m[8] = diff[4] - diff[8]; + m[9] = diff[5] - diff[9]; + m[10] = diff[6] - diff[10]; + m[11] = diff[7] - diff[11]; + m[12] = diff[0] - diff[12]; + m[13] = diff[1] - diff[13]; + m[14] = diff[2] - diff[14]; + m[15] = diff[3] - diff[15]; + + d[0] = m[0] + m[4]; + d[1] = m[1] + m[5]; + d[2] = m[2] + m[6]; + d[3] = m[3] + m[7]; + d[4] = m[8] + m[12]; + d[5] = m[9] + m[13]; + d[6] = m[10] + m[14]; + d[7] = m[11] + m[15]; + d[8] = m[0] - m[4]; + d[9] = m[1] - m[5]; + d[10] = m[2] - m[6]; + d[11] = m[3] - m[7]; + d[12] = m[12] - m[8]; + d[13] = m[13] - m[9]; + d[14] = m[14] - m[10]; + d[15] = m[15] - m[11]; + + m[0] = d[0] + d[3]; + m[1] = d[1] + d[2]; + m[2] = d[1] - d[2]; + m[3] = d[0] - d[3]; + m[4] = d[4] + d[7]; + m[5] = d[5] + d[6]; + m[6] = d[5] - d[6]; + m[7] = d[4] - d[7]; + m[8] = d[8] + d[11]; + m[9] = d[9] + d[10]; + m[10] = d[9] - d[10]; + m[11] = d[8] - d[11]; + m[12] = d[12] + d[15]; + m[13] = d[13] + d[14]; + m[14] = d[13] - d[14]; + m[15] = d[12] - d[15]; + + d[0] = m[0] + m[1]; + d[1] = m[0] - m[1]; + d[2] = m[2] + m[3]; + d[3] = m[3] - m[2]; + d[4] = m[4] + m[5]; + d[5] = m[4] - m[5]; + d[6] = m[6] + m[7]; + d[7] = m[7] - m[6]; + d[8] = m[8] + m[9]; + d[9] = m[8] - m[9]; + d[10] = m[10] + m[11]; + d[11] = m[11] - m[10]; + d[12] = m[12] + m[13]; + d[13] = m[12] - m[13]; + d[14] = m[14] + m[15]; + d[15] = m[15] - m[14]; + + for (k = 0; k<16; ++k) { + satdBlock4x4 += ABS(d[k]); + } + + satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); + + return satdBlock4x4; } EB_U64 Compute4x4Satd_U8( - EB_U8 *src, // input parameter, diff samples Ptr - EB_U64 *dcValue, - EB_U32 srcStride) + EB_U8 *src, // input parameter, diff samples Ptr + EB_U64 *dcValue, + EB_U32 srcStride) { - EB_U64 satdBlock4x4 = 0; - EB_S16 m[16], d[16]; - EB_U32 k; - - /*===== hadamard transform =====*/ - m[0] = src[0] + src[3 * srcStride]; - m[1] = src[1] + src[1 + (3 * srcStride)]; - m[2] = src[2] + src[2 + (3 * srcStride)]; - m[3] = src[3] + src[3 + (3 * srcStride)]; - m[4] = src[srcStride] + src[2 * srcStride]; - m[5] = src[1 + srcStride] + src[1 + (2 * srcStride)]; - m[6] = src[2 + srcStride] + src[2 + (2 * srcStride)]; - m[7] = src[3 + srcStride] + src[3 + (2 * srcStride)]; - m[8] = src[srcStride] - src[2 * srcStride]; - m[9] = src[1 + srcStride] - src[1 + (2 * srcStride)]; - m[10] = src[2 + srcStride] - src[2 + (2 * srcStride)]; - m[11] = src[3 + srcStride] - src[3 + (2 * srcStride)]; - m[12] = src[0] - src[3 * srcStride]; - m[13] = src[1] - src[1 + (3 * srcStride)]; - m[14] = src[2] - src[2 + (3 * srcStride)]; - m[15] = src[3] - src[3 + (3 * srcStride)]; - - d[0] = m[0] + m[4]; - d[1] = m[1] + m[5]; - d[2] = m[2] + m[6]; - d[3] = m[3] + m[7]; - d[4] = m[8] + m[12]; - d[5] = m[9] + m[13]; - d[6] = m[10] + m[14]; - d[7] = m[11] + m[15]; - d[8] = m[0] - m[4]; - d[9] = m[1] - m[5]; - d[10] = m[2] - m[6]; - d[11] = m[3] - m[7]; - d[12] = m[12] - m[8]; - d[13] = m[13] - m[9]; - d[14] = m[14] - m[10]; - d[15] = m[15] - m[11]; - - m[0] = d[0] + d[3]; - m[1] = d[1] + d[2]; - m[2] = d[1] - d[2]; - m[3] = d[0] - d[3]; - m[4] = d[4] + d[7]; - m[5] = d[5] + d[6]; - m[6] = d[5] - d[6]; - m[7] = d[4] - d[7]; - m[8] = d[8] + d[11]; - m[9] = d[9] + d[10]; - m[10] = d[9] - d[10]; - m[11] = d[8] - d[11]; - m[12] = d[12] + d[15]; - m[13] = d[13] + d[14]; - m[14] = d[13] - d[14]; - m[15] = d[12] - d[15]; - - d[0] = m[0] + m[1]; - d[1] = m[0] - m[1]; - d[2] = m[2] + m[3]; - d[3] = m[3] - m[2]; - d[4] = m[4] + m[5]; - d[5] = m[4] - m[5]; - d[6] = m[6] + m[7]; - d[7] = m[7] - m[6]; - d[8] = m[8] + m[9]; - d[9] = m[8] - m[9]; - d[10] = m[10] + m[11]; - d[11] = m[11] - m[10]; - d[12] = m[12] + m[13]; - d[13] = m[12] - m[13]; - d[14] = m[14] + m[15]; - d[15] = m[15] - m[14]; - - for (k = 0; k<16; ++k) { - satdBlock4x4 += ABS(d[k]); - } - - satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); - *dcValue += d[0]; - return satdBlock4x4; + EB_U64 satdBlock4x4 = 0; + EB_S16 m[16], d[16]; + EB_U32 k; + + /*===== hadamard transform =====*/ + m[0] = src[0] + src[3 * srcStride]; + m[1] = src[1] + src[1 + (3 * srcStride)]; + m[2] = src[2] + src[2 + (3 * srcStride)]; + m[3] = src[3] + src[3 + (3 * srcStride)]; + m[4] = src[srcStride] + src[2 * srcStride]; + m[5] = src[1 + srcStride] + src[1 + (2 * srcStride)]; + m[6] = src[2 + srcStride] + src[2 + (2 * srcStride)]; + m[7] = src[3 + srcStride] + src[3 + (2 * srcStride)]; + m[8] = src[srcStride] - src[2 * srcStride]; + m[9] = src[1 + srcStride] - src[1 + (2 * srcStride)]; + m[10] = src[2 + srcStride] - src[2 + (2 * srcStride)]; + m[11] = src[3 + srcStride] - src[3 + (2 * srcStride)]; + m[12] = src[0] - src[3 * srcStride]; + m[13] = src[1] - src[1 + (3 * srcStride)]; + m[14] = src[2] - src[2 + (3 * srcStride)]; + m[15] = src[3] - src[3 + (3 * srcStride)]; + + d[0] = m[0] + m[4]; + d[1] = m[1] + m[5]; + d[2] = m[2] + m[6]; + d[3] = m[3] + m[7]; + d[4] = m[8] + m[12]; + d[5] = m[9] + m[13]; + d[6] = m[10] + m[14]; + d[7] = m[11] + m[15]; + d[8] = m[0] - m[4]; + d[9] = m[1] - m[5]; + d[10] = m[2] - m[6]; + d[11] = m[3] - m[7]; + d[12] = m[12] - m[8]; + d[13] = m[13] - m[9]; + d[14] = m[14] - m[10]; + d[15] = m[15] - m[11]; + + m[0] = d[0] + d[3]; + m[1] = d[1] + d[2]; + m[2] = d[1] - d[2]; + m[3] = d[0] - d[3]; + m[4] = d[4] + d[7]; + m[5] = d[5] + d[6]; + m[6] = d[5] - d[6]; + m[7] = d[4] - d[7]; + m[8] = d[8] + d[11]; + m[9] = d[9] + d[10]; + m[10] = d[9] - d[10]; + m[11] = d[8] - d[11]; + m[12] = d[12] + d[15]; + m[13] = d[13] + d[14]; + m[14] = d[13] - d[14]; + m[15] = d[12] - d[15]; + + d[0] = m[0] + m[1]; + d[1] = m[0] - m[1]; + d[2] = m[2] + m[3]; + d[3] = m[3] - m[2]; + d[4] = m[4] + m[5]; + d[5] = m[4] - m[5]; + d[6] = m[6] + m[7]; + d[7] = m[7] - m[6]; + d[8] = m[8] + m[9]; + d[9] = m[8] - m[9]; + d[10] = m[10] + m[11]; + d[11] = m[11] - m[10]; + d[12] = m[12] + m[13]; + d[13] = m[12] - m[13]; + d[14] = m[14] + m[15]; + d[15] = m[15] - m[14]; + + for (k = 0; k<16; ++k) { + satdBlock4x4 += ABS(d[k]); + } + + satdBlock4x4 = ((satdBlock4x4 + 1) >> 1); + *dcValue += d[0]; + return satdBlock4x4; } //Table for updating the next state. MPS and LSP tables are combined. The higher bit would decide for MPS or LPS. 128 MPS and then 128 LPS //8 bits unsigned would be enough const EB_U32 NextStateMpsLps[] = { - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 124, 125, 126, 127, - 1, 0, 0, 1, 2, 3, 4, 5, 4, 5, 8, 9, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 18, 19, 22, 23, 22, 23, 24, 25, - 26, 27, 26, 27, 30, 31, 30, 31, 32, 33, 32, 33, 36, 37, 36, 37, - 38, 39, 38, 39, 42, 43, 42, 43, 44, 45, 44, 45, 46, 47, 48, 49, - 48, 49, 50, 51, 52, 53, 52, 53, 54, 55, 54, 55, 56, 57, 58, 59, - 58, 59, 60, 61, 60, 61, 60, 61, 62, 63, 64, 65, 64, 65, 66, 67, - 66, 67, 66, 67, 68, 69, 68, 69, 70, 71, 70, 71, 70, 71, 72, 73, - 72, 73, 72, 73, 74, 75, 74, 75, 74, 75, 76, 77, 76, 77, 126, 127 + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 124, 125, 126, 127, + 1, 0, 0, 1, 2, 3, 4, 5, 4, 5, 8, 9, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 18, 19, 22, 23, 22, 23, 24, 25, + 26, 27, 26, 27, 30, 31, 30, 31, 32, 33, 32, 33, 36, 37, 36, 37, + 38, 39, 38, 39, 42, 43, 42, 43, 44, 45, 44, 45, 46, 47, 48, 49, + 48, 49, 50, 51, 52, 53, 52, 53, 54, 55, 54, 55, 56, 57, 58, 59, + 58, 59, 60, 61, 60, 61, 60, 61, 62, 63, 64, 65, 64, 65, 66, 67, + 66, 67, 66, 67, 68, 69, 68, 69, 70, 71, 70, 71, 70, 71, 72, 73, + 72, 73, 72, 73, 74, 75, 74, 75, 74, 75, 76, 77, 76, 77, 126, 127 }; -const EB_U32 CabacEstimatedBits[] = +const EB_U32 CabacEstimatedBits[] = { - 0x07b23, 0x085f9, 0x074a0, 0x08cbc, 0x06ee4, 0x09354, 0x067f4, 0x09c1b, 0x060b0, 0x0a62a, 0x05a9c, 0x0af5b, 0x0548d, 0x0b955, 0x04f56, 0x0c2a9, - 0x04a87, 0x0cbf7, 0x045d6, 0x0d5c3, 0x04144, 0x0e01b, 0x03d88, 0x0e937, 0x039e0, 0x0f2cd, 0x03663, 0x0fc9e, 0x03347, 0x10600, 0x03050, 0x10f95, - 0x02d4d, 0x11a02, 0x02ad3, 0x12333, 0x0286e, 0x12cad, 0x02604, 0x136df, 0x02425, 0x13f48, 0x021f4, 0x149c4, 0x0203e, 0x1527b, 0x01e4d, 0x15d00, - 0x01c99, 0x166de, 0x01b18, 0x17017, 0x019a5, 0x17988, 0x01841, 0x18327, 0x016df, 0x18d50, 0x015d9, 0x19547, 0x0147c, 0x1a083, 0x0138e, 0x1a8a3, - 0x01251, 0x1b418, 0x01166, 0x1bd27, 0x01068, 0x1c77b, 0x00f7f, 0x1d18e, 0x00eda, 0x1d91a, 0x00e19, 0x1e254, 0x00d4f, 0x1ec9a, 0x00c90, 0x1f6e0, - 0x00c01, 0x1fef8, 0x00b5f, 0x208b1, 0x00ab6, 0x21362, 0x00a15, 0x21e46, 0x00988, 0x2285d, 0x00934, 0x22ea8, 0x008a8, 0x239b2, 0x0081d, 0x24577, - 0x007c9, 0x24ce6, 0x00763, 0x25663, 0x00710, 0x25e8f, 0x006a0, 0x26a26, 0x00672, 0x26f23, 0x005e8, 0x27ef8, 0x005ba, 0x284b5, 0x0055e, 0x29057, - 0x0050c, 0x29bab, 0x004c1, 0x2a674, 0x004a7, 0x2aa5e, 0x0046f, 0x2b32f, 0x0041f, 0x2c0ad, 0x003e7, 0x2ca8d, 0x003ba, 0x2d323, 0x0010c, 0x3bfbb + 0x07b23, 0x085f9, 0x074a0, 0x08cbc, 0x06ee4, 0x09354, 0x067f4, 0x09c1b, 0x060b0, 0x0a62a, 0x05a9c, 0x0af5b, 0x0548d, 0x0b955, 0x04f56, 0x0c2a9, + 0x04a87, 0x0cbf7, 0x045d6, 0x0d5c3, 0x04144, 0x0e01b, 0x03d88, 0x0e937, 0x039e0, 0x0f2cd, 0x03663, 0x0fc9e, 0x03347, 0x10600, 0x03050, 0x10f95, + 0x02d4d, 0x11a02, 0x02ad3, 0x12333, 0x0286e, 0x12cad, 0x02604, 0x136df, 0x02425, 0x13f48, 0x021f4, 0x149c4, 0x0203e, 0x1527b, 0x01e4d, 0x15d00, + 0x01c99, 0x166de, 0x01b18, 0x17017, 0x019a5, 0x17988, 0x01841, 0x18327, 0x016df, 0x18d50, 0x015d9, 0x19547, 0x0147c, 0x1a083, 0x0138e, 0x1a8a3, + 0x01251, 0x1b418, 0x01166, 0x1bd27, 0x01068, 0x1c77b, 0x00f7f, 0x1d18e, 0x00eda, 0x1d91a, 0x00e19, 0x1e254, 0x00d4f, 0x1ec9a, 0x00c90, 0x1f6e0, + 0x00c01, 0x1fef8, 0x00b5f, 0x208b1, 0x00ab6, 0x21362, 0x00a15, 0x21e46, 0x00988, 0x2285d, 0x00934, 0x22ea8, 0x008a8, 0x239b2, 0x0081d, 0x24577, + 0x007c9, 0x24ce6, 0x00763, 0x25663, 0x00710, 0x25e8f, 0x006a0, 0x26a26, 0x00672, 0x26f23, 0x005e8, 0x27ef8, 0x005ba, 0x284b5, 0x0055e, 0x29057, + 0x0050c, 0x29bab, 0x004c1, 0x2a674, 0x004a7, 0x2aa5e, 0x0046f, 0x2b32f, 0x0041f, 0x2c0ad, 0x003e7, 0x2ca8d, 0x003ba, 0x2d323, 0x0010c, 0x3bfbb }; diff --git a/Source/Lib/Codec/EbHmCode.h b/Source/Lib/Codec/EbHmCode.h index 66f63745c..26c7db903 100644 --- a/Source/Lib/Codec/EbHmCode.h +++ b/Source/Lib/Codec/EbHmCode.h @@ -41,18 +41,18 @@ extern "C" { EB_U64 Compute4x4Satd( - EB_S16 *diff); + EB_S16 *diff); EB_U64 Compute4x4Satd_U8( - EB_U8 *src, - EB_U64 *dcValue, - EB_U32 srcStride); + EB_U8 *src, + EB_U64 *dcValue, + EB_U32 srcStride); extern const EB_U32 NextStateMpsLps[]; extern const EB_U32 CabacEstimatedBits[]; #ifdef __cplusplus } -#endif +#endif #endif // EbHmCode_h \ No newline at end of file diff --git a/Source/Lib/Codec/EbInitialRateControlProcess.c b/Source/Lib/Codec/EbInitialRateControlProcess.c index 6226a29ba..17c64a284 100644 --- a/Source/Lib/Codec/EbInitialRateControlProcess.c +++ b/Source/Lib/Codec/EbInitialRateControlProcess.c @@ -28,130 +28,130 @@ static EB_BOOL CheckMvForPanHighAmp( - EB_U32 hierarchicalLevels, - EB_U32 temporalLayerIndex, - EB_S32 *xCurrentMv, - EB_S32 *xCandidateMv) + EB_U32 hierarchicalLevels, + EB_U32 temporalLayerIndex, + EB_S32 *xCurrentMv, + EB_S32 *xCandidateMv) { - if (*xCurrentMv * *xCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) - && ABS(*xCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*xCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*xCurrentMv - *xCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude + if (*xCurrentMv * *xCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) + && ABS(*xCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*xCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*xCurrentMv - *xCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude - return(EB_TRUE); - } + return(EB_TRUE); + } - else { - return(EB_FALSE); - } + else { + return(EB_FALSE); + } } static EB_BOOL CheckMvForTiltHighAmp( - EB_U32 hierarchicalLevels, - EB_U32 temporalLayerIndex, - EB_S32 *yCurrentMv, - EB_S32 *yCandidateMv) + EB_U32 hierarchicalLevels, + EB_U32 temporalLayerIndex, + EB_S32 *yCurrentMv, + EB_S32 *yCandidateMv) { - if (*yCurrentMv * *yCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) - && ABS(*yCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*yCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*yCurrentMv - *yCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude + if (*yCurrentMv * *yCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) + && ABS(*yCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*yCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*yCurrentMv - *yCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude - return(EB_TRUE); - } + return(EB_TRUE); + } - else { - return(EB_FALSE); - } + else { + return(EB_FALSE); + } } static EB_BOOL CheckMvForPan( - EB_U32 hierarchicalLevels, - EB_U32 temporalLayerIndex, - EB_S32 *xCurrentMv, - EB_S32 *yCurrentMv, - EB_S32 *xCandidateMv, - EB_S32 *yCandidateMv) + EB_U32 hierarchicalLevels, + EB_U32 temporalLayerIndex, + EB_S32 *xCurrentMv, + EB_S32 *yCurrentMv, + EB_S32 *xCandidateMv, + EB_S32 *yCandidateMv) { - if (*yCurrentMv < LOW_AMPLITUDE_TH - && *yCandidateMv < LOW_AMPLITUDE_TH - && *xCurrentMv * *xCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) - && ABS(*xCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*xCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*xCurrentMv - *xCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude - - return(EB_TRUE); - } + if (*yCurrentMv < LOW_AMPLITUDE_TH + && *yCandidateMv < LOW_AMPLITUDE_TH + && *xCurrentMv * *xCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) + && ABS(*xCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*xCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*xCurrentMv - *xCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude + + return(EB_TRUE); + } - else { - return(EB_FALSE); - } + else { + return(EB_FALSE); + } } static EB_BOOL CheckMvForTilt( - EB_U32 hierarchicalLevels, - EB_U32 temporalLayerIndex, - EB_S32 *xCurrentMv, - EB_S32 *yCurrentMv, - EB_S32 *xCandidateMv, - EB_S32 *yCandidateMv) + EB_U32 hierarchicalLevels, + EB_U32 temporalLayerIndex, + EB_S32 *xCurrentMv, + EB_S32 *yCurrentMv, + EB_S32 *xCandidateMv, + EB_S32 *yCandidateMv) { - if (*xCurrentMv < LOW_AMPLITUDE_TH - && *xCandidateMv < LOW_AMPLITUDE_TH - && *yCurrentMv * *yCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) - && ABS(*yCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*yCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude - && ABS(*yCurrentMv - *yCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude - - return(EB_TRUE); - } + if (*xCurrentMv < LOW_AMPLITUDE_TH + && *xCandidateMv < LOW_AMPLITUDE_TH + && *yCurrentMv * *yCandidateMv > 0 // both negative or both positives and both different than 0 i.e. same direction and non Stationary) + && ABS(*yCurrentMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*yCandidateMv) >= GLOBAL_MOTION_THRESHOLD[hierarchicalLevels][temporalLayerIndex] // high amplitude + && ABS(*yCurrentMv - *yCandidateMv) < LOW_AMPLITUDE_TH) { // close amplitude + + return(EB_TRUE); + } - else { - return(EB_FALSE); - } + else { + return(EB_FALSE); + } } static EB_BOOL CheckMvForNonUniformMotion( - EB_S32 *xCurrentMv, - EB_S32 *yCurrentMv, - EB_S32 *xCandidateMv, - EB_S32 *yCandidateMv) + EB_S32 *xCurrentMv, + EB_S32 *yCurrentMv, + EB_S32 *xCandidateMv, + EB_S32 *yCandidateMv) { - EB_S32 mvThreshold = 40;//LOW_AMPLITUDE_TH + 18; - // Either the x or the y direction is greater than threshold - if ((ABS(*xCurrentMv - *xCandidateMv) > mvThreshold) || (ABS(*yCurrentMv - *yCandidateMv) > mvThreshold)) { - return(EB_TRUE); - } - else { - return(EB_FALSE); - } + EB_S32 mvThreshold = 40;//LOW_AMPLITUDE_TH + 18; + // Either the x or the y direction is greater than threshold + if ((ABS(*xCurrentMv - *xCandidateMv) > mvThreshold) || (ABS(*yCurrentMv - *yCandidateMv) > mvThreshold)) { + return(EB_TRUE); + } + else { + return(EB_FALSE); + } } static void CheckForNonUniformMotionVectorField( SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U32 lcuIndex; - EB_U32 pictureWidthInLcu = (pictureControlSetPtr->enhancedPicturePtr->width + MAX_LCU_SIZE - 1) / MAX_LCU_SIZE; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - - EB_S32 xCurrentMv = 0; - EB_S32 yCurrentMv = 0; - EB_S32 xLeftMv = 0; - EB_S32 yLeftMv = 0; - EB_S32 xTopMv = 0; - EB_S32 yTopMv = 0; - EB_S32 xRightMv = 0; - EB_S32 yRightMv = 0; - EB_S32 xBottomMv = 0; - EB_S32 yBottomMv = 0; - EB_U32 countOfNonUniformNeighbors = 0; + EB_U32 lcuIndex; + EB_U32 pictureWidthInLcu = (pictureControlSetPtr->enhancedPicturePtr->width + MAX_LCU_SIZE - 1) / MAX_LCU_SIZE; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + + EB_S32 xCurrentMv = 0; + EB_S32 yCurrentMv = 0; + EB_S32 xLeftMv = 0; + EB_S32 yLeftMv = 0; + EB_S32 xTopMv = 0; + EB_S32 yTopMv = 0; + EB_S32 xRightMv = 0; + EB_S32 yRightMv = 0; + EB_S32 xBottomMv = 0; + EB_S32 yBottomMv = 0; + EB_U32 countOfNonUniformNeighbors = 0; for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { @@ -160,92 +160,92 @@ static void CheckForNonUniformMotionVectorField( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - countOfNonUniformNeighbors = 0; + countOfNonUniformNeighbors = 0; if (lcuParams->isCompleteLcu) { - // Current MV - EbHevcGetMv(pictureControlSetPtr, lcuIndex, &xCurrentMv, &yCurrentMv); - - // Left MV - if (lcuOriginX == 0) { - xLeftMv = 0; - yLeftMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex - 1, &xLeftMv, &yLeftMv); - } - - countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xLeftMv, &yLeftMv); - - // Top MV - if (lcuOriginY == 0) { - xTopMv = 0; - yTopMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex - pictureWidthInLcu, &xTopMv, &yTopMv); - } - - countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xTopMv, &yTopMv); - - // Right MV - if ((lcuOriginX + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->width) { - xRightMv = 0; - yRightMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex + 1, &xRightMv, &yRightMv); - } - - countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xRightMv, &yRightMv); - - // Bottom MV - if ((lcuOriginY + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->height) { - xBottomMv = 0; - yBottomMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex + pictureWidthInLcu, &xBottomMv, &yBottomMv); - } - - countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xBottomMv, &yBottomMv); - } - } + // Current MV + EbHevcGetMv(pictureControlSetPtr, lcuIndex, &xCurrentMv, &yCurrentMv); + + // Left MV + if (lcuOriginX == 0) { + xLeftMv = 0; + yLeftMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex - 1, &xLeftMv, &yLeftMv); + } + + countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xLeftMv, &yLeftMv); + + // Top MV + if (lcuOriginY == 0) { + xTopMv = 0; + yTopMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex - pictureWidthInLcu, &xTopMv, &yTopMv); + } + + countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xTopMv, &yTopMv); + + // Right MV + if ((lcuOriginX + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->width) { + xRightMv = 0; + yRightMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex + 1, &xRightMv, &yRightMv); + } + + countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xRightMv, &yRightMv); + + // Bottom MV + if ((lcuOriginY + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->height) { + xBottomMv = 0; + yBottomMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex + pictureWidthInLcu, &xBottomMv, &yBottomMv); + } + + countOfNonUniformNeighbors += CheckMvForNonUniformMotion(&xCurrentMv, &yCurrentMv, &xBottomMv, &yBottomMv); + } + } } void EbHevcDetectGlobalMotion( SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U32 lcuIndex; - EB_U32 pictureWidthInLcu = (pictureControlSetPtr->enhancedPicturePtr->width + MAX_LCU_SIZE - 1) / MAX_LCU_SIZE; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - - EB_U32 totalCheckedLcus = 0; - EB_U32 totalPanLcus = 0; - - EB_S32 xCurrentMv = 0; - EB_S32 yCurrentMv = 0; - EB_S32 xLeftMv = 0; - EB_S32 yLeftMv = 0; - EB_S32 xTopMv = 0; - EB_S32 yTopMv = 0; - EB_S32 xRightMv = 0; - EB_S32 yRightMv = 0; - EB_S32 xBottomMv = 0; - EB_S32 yBottomMv = 0; - - EB_S64 xTiltMvSum = 0; - EB_S64 yTiltMvSum = 0; - EB_U32 totalTiltLcus = 0; - - EB_U32 totalTiltHighAmpLcus = 0; - EB_U32 totalPanHighAmpLcus = 0; - - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + EB_U32 lcuIndex; + EB_U32 pictureWidthInLcu = (pictureControlSetPtr->enhancedPicturePtr->width + MAX_LCU_SIZE - 1) / MAX_LCU_SIZE; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + + EB_U32 totalCheckedLcus = 0; + EB_U32 totalPanLcus = 0; + + EB_S32 xCurrentMv = 0; + EB_S32 yCurrentMv = 0; + EB_S32 xLeftMv = 0; + EB_S32 yLeftMv = 0; + EB_S32 xTopMv = 0; + EB_S32 yTopMv = 0; + EB_S32 xRightMv = 0; + EB_S32 yRightMv = 0; + EB_S32 xBottomMv = 0; + EB_S32 yBottomMv = 0; + + EB_S64 xTiltMvSum = 0; + EB_S64 yTiltMvSum = 0; + EB_U32 totalTiltLcus = 0; + + EB_U32 totalTiltHighAmpLcus = 0; + EB_U32 totalPanHighAmpLcus = 0; + + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -254,93 +254,93 @@ void EbHevcDetectGlobalMotion( if (lcuParams->isCompleteLcu) { - // Current MV - EbHevcGetMv(pictureControlSetPtr, lcuIndex, &xCurrentMv, &yCurrentMv); + // Current MV + EbHevcGetMv(pictureControlSetPtr, lcuIndex, &xCurrentMv, &yCurrentMv); - // Left MV - if (lcuOriginX == 0) { - xLeftMv = 0; - yLeftMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex - 1, &xLeftMv, &yLeftMv); - } + // Left MV + if (lcuOriginX == 0) { + xLeftMv = 0; + yLeftMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex - 1, &xLeftMv, &yLeftMv); + } - // Top MV - if (lcuOriginY == 0) { - xTopMv = 0; - yTopMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex - pictureWidthInLcu, &xTopMv, &yTopMv); - } + // Top MV + if (lcuOriginY == 0) { + xTopMv = 0; + yTopMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex - pictureWidthInLcu, &xTopMv, &yTopMv); + } - // Right MV - if ((lcuOriginX + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->width) { - xRightMv = 0; - yRightMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex + 1, &xRightMv, &yRightMv); - } + // Right MV + if ((lcuOriginX + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->width) { + xRightMv = 0; + yRightMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex + 1, &xRightMv, &yRightMv); + } - // Bottom MV - if ((lcuOriginY + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->height) { - xBottomMv = 0; - yBottomMv = 0; - } - else { - EbHevcGetMv(pictureControlSetPtr, lcuIndex + pictureWidthInLcu, &xBottomMv, &yBottomMv); - } + // Bottom MV + if ((lcuOriginY + (MAX_LCU_SIZE << 1)) > pictureControlSetPtr->enhancedPicturePtr->height) { + xBottomMv = 0; + yBottomMv = 0; + } + else { + EbHevcGetMv(pictureControlSetPtr, lcuIndex + pictureWidthInLcu, &xBottomMv, &yBottomMv); + } - totalCheckedLcus++; + totalCheckedLcus++; - if ((EB_BOOL)(CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xLeftMv, &yLeftMv) || - CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xTopMv, &yTopMv) || - CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xRightMv, &yRightMv) || - CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xBottomMv, &yBottomMv))) { + if ((EB_BOOL)(CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xLeftMv, &yLeftMv) || + CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xTopMv, &yTopMv) || + CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xRightMv, &yRightMv) || + CheckMvForPan(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xBottomMv, &yBottomMv))) { - totalPanLcus++; + totalPanLcus++; - } + } - if ((EB_BOOL)(CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xLeftMv, &yLeftMv) || - CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xTopMv, &yTopMv) || - CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xRightMv, &yRightMv) || - CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xBottomMv, &yBottomMv))) { + if ((EB_BOOL)(CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xLeftMv, &yLeftMv) || + CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xTopMv, &yTopMv) || + CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xRightMv, &yRightMv) || + CheckMvForTilt(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &yCurrentMv, &xBottomMv, &yBottomMv))) { - totalTiltLcus++; + totalTiltLcus++; - xTiltMvSum += xCurrentMv; - yTiltMvSum += yCurrentMv; - } + xTiltMvSum += xCurrentMv; + yTiltMvSum += yCurrentMv; + } - if ((EB_BOOL)(CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xLeftMv) || - CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xTopMv) || - CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xRightMv) || - CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xBottomMv))) { + if ((EB_BOOL)(CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xLeftMv) || + CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xTopMv) || + CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xRightMv) || + CheckMvForPanHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &xCurrentMv, &xBottomMv))) { - totalPanHighAmpLcus++; + totalPanHighAmpLcus++; - } + } - if ((EB_BOOL)(CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yLeftMv) || - CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yTopMv) || - CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yRightMv) || - CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yBottomMv))) { + if ((EB_BOOL)(CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yLeftMv) || + CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yTopMv) || + CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yRightMv) || + CheckMvForTiltHighAmp(pictureControlSetPtr->hierarchicalLevels, pictureControlSetPtr->temporalLayerIndex, &yCurrentMv, &yBottomMv))) { - totalTiltHighAmpLcus++; + totalTiltHighAmpLcus++; - } + } - } - } - pictureControlSetPtr->isPan = EB_FALSE; - pictureControlSetPtr->isTilt = EB_FALSE; + } + } + pictureControlSetPtr->isPan = EB_FALSE; + pictureControlSetPtr->isTilt = EB_FALSE; if (totalCheckedLcus > 0) { // If more than PAN_LCU_PERCENTAGE % of LCUs are PAN @@ -357,17 +357,17 @@ void EbHevcDetectGlobalMotion( * Initial Rate Control Context Constructor ************************************************/ EB_ERRORTYPE InitialRateControlContextCtor( - InitialRateControlContext_t **contextDblPtr, - EbFifo_t *motionEstimationResultsInputFifoPtr, - EbFifo_t *initialrateControlResultsOutputFifoPtr) + InitialRateControlContext_t **contextDblPtr, + EbFifo_t *motionEstimationResultsInputFifoPtr, + EbFifo_t *initialrateControlResultsOutputFifoPtr) { - InitialRateControlContext_t *contextPtr; - EB_MALLOC(InitialRateControlContext_t*, contextPtr, sizeof(InitialRateControlContext_t), EB_N_PTR); - *contextDblPtr = contextPtr; - contextPtr->motionEstimationResultsInputFifoPtr = motionEstimationResultsInputFifoPtr; - contextPtr->initialrateControlResultsOutputFifoPtr = initialrateControlResultsOutputFifoPtr; + InitialRateControlContext_t *contextPtr; + EB_MALLOC(InitialRateControlContext_t*, contextPtr, sizeof(InitialRateControlContext_t), EB_N_PTR); + *contextDblPtr = contextPtr; + contextPtr->motionEstimationResultsInputFifoPtr = motionEstimationResultsInputFifoPtr; + contextPtr->initialrateControlResultsOutputFifoPtr = initialrateControlResultsOutputFifoPtr; - return EB_ErrorNone; + return EB_ErrorNone; } /************************************************ @@ -376,34 +376,34 @@ EB_ERRORTYPE InitialRateControlContextCtor( ** release them when appropriate ************************************************/ void EbHevcReleasePaReferenceObjects( - PictureParentControlSet_t *pictureControlSetPtr) + PictureParentControlSet_t *pictureControlSetPtr) { - // PA Reference Pictures - EB_U32 numOfListToSearch; - EB_U32 listIndex; - if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { + // PA Reference Pictures + EB_U32 numOfListToSearch; + EB_U32 listIndex; + if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { - numOfListToSearch = (pictureControlSetPtr->sliceType == EB_P_PICTURE) ? REF_LIST_0 : REF_LIST_1; + numOfListToSearch = (pictureControlSetPtr->sliceType == EB_P_PICTURE) ? REF_LIST_0 : REF_LIST_1; - // List Loop - for (listIndex = REF_LIST_0; listIndex <= numOfListToSearch; ++listIndex) { + // List Loop + for (listIndex = REF_LIST_0; listIndex <= numOfListToSearch; ++listIndex) { - // Release PA Reference Pictures - if (pictureControlSetPtr->refPaPicPtrArray[listIndex] != EB_NULL) { + // Release PA Reference Pictures + if (pictureControlSetPtr->refPaPicPtrArray[listIndex] != EB_NULL) { EbReleaseObject(((EbPaReferenceObject_t*)pictureControlSetPtr->refPaPicPtrArray[listIndex]->objectPtr)->pPcsPtr->pPcsWrapperPtr); - EbReleaseObject(pictureControlSetPtr->refPaPicPtrArray[listIndex]); - } - } - } + EbReleaseObject(pictureControlSetPtr->refPaPicPtrArray[listIndex]); + } + } + } - if (pictureControlSetPtr->paReferencePictureWrapperPtr != EB_NULL) { + if (pictureControlSetPtr->paReferencePictureWrapperPtr != EB_NULL) { EbReleaseObject(pictureControlSetPtr->pPcsWrapperPtr); - EbReleaseObject(pictureControlSetPtr->paReferencePictureWrapperPtr); - } + EbReleaseObject(pictureControlSetPtr->paReferencePictureWrapperPtr); + } - return; + return; } /************************************************ @@ -414,19 +414,19 @@ void EbHevcReleasePaReferenceObjects( ************************************************/ void EbHevcMeBasedGlobalMotionDetection( SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + PictureParentControlSet_t *pictureControlSetPtr) { - // PAN Generation - pictureControlSetPtr->isPan = EB_FALSE; - pictureControlSetPtr->isTilt = EB_FALSE; + // PAN Generation + pictureControlSetPtr->isPan = EB_FALSE; + pictureControlSetPtr->isTilt = EB_FALSE; - if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { + if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { EbHevcDetectGlobalMotion( sequenceControlSetPtr, pictureControlSetPtr); - } + } - return; + return; } @@ -478,74 +478,74 @@ void EbHevcStationaryEdgeCountLcu( ** LAD Window: min (8 or sliding window size) ************************************************/ void EbHevcUpdateGlobalMotionDetectionOverTime( - EncodeContext_t *encodeContextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + EncodeContext_t *encodeContextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - InitialRateControlReorderEntry_t *temporaryQueueEntryPtr; - PictureParentControlSet_t *temporaryPictureControlSetPtr; + InitialRateControlReorderEntry_t *temporaryQueueEntryPtr; + PictureParentControlSet_t *temporaryPictureControlSetPtr; - EB_U32 totalPanPictures = 0; - EB_U32 totalCheckedPictures = 0; - EB_U32 totalTiltPictures = 0; - EB_U32 totalTMVPEnableDetectedPictures = 0; - EB_U32 updateIsPanFramesToCheck; - EB_U32 inputQueueIndex; - EB_U32 framesToCheckIndex; + EB_U32 totalPanPictures = 0; + EB_U32 totalCheckedPictures = 0; + EB_U32 totalTiltPictures = 0; + EB_U32 totalTMVPEnableDetectedPictures = 0; + EB_U32 updateIsPanFramesToCheck; + EB_U32 inputQueueIndex; + EB_U32 framesToCheckIndex; - (void) sequenceControlSetPtr; + (void) sequenceControlSetPtr; - // Determine number of frames to check (8 frames) - updateIsPanFramesToCheck = MIN(8, pictureControlSetPtr->framesInSw); + // Determine number of frames to check (8 frames) + updateIsPanFramesToCheck = MIN(8, pictureControlSetPtr->framesInSw); - // Walk the first N entries in the sliding window - inputQueueIndex = encodeContextPtr->initialRateControlReorderQueueHeadIndex; - EB_U32 updateFramesToCheck = updateIsPanFramesToCheck; - for (framesToCheckIndex = 0; framesToCheckIndex < updateFramesToCheck; framesToCheckIndex++) { + // Walk the first N entries in the sliding window + inputQueueIndex = encodeContextPtr->initialRateControlReorderQueueHeadIndex; + EB_U32 updateFramesToCheck = updateIsPanFramesToCheck; + for (framesToCheckIndex = 0; framesToCheckIndex < updateFramesToCheck; framesToCheckIndex++) { - temporaryQueueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[inputQueueIndex]; - temporaryPictureControlSetPtr = ((PictureParentControlSet_t*)(temporaryQueueEntryPtr->parentPcsWrapperPtr)->objectPtr); + temporaryQueueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[inputQueueIndex]; + temporaryPictureControlSetPtr = ((PictureParentControlSet_t*)(temporaryQueueEntryPtr->parentPcsWrapperPtr)->objectPtr); - if (temporaryPictureControlSetPtr->sliceType != EB_I_PICTURE) { + if (temporaryPictureControlSetPtr->sliceType != EB_I_PICTURE) { - totalPanPictures += (temporaryPictureControlSetPtr->isPan == EB_TRUE); + totalPanPictures += (temporaryPictureControlSetPtr->isPan == EB_TRUE); - totalTiltPictures += (temporaryPictureControlSetPtr->isTilt == EB_TRUE); + totalTiltPictures += (temporaryPictureControlSetPtr->isTilt == EB_TRUE); - // Keep track of checked pictures - totalCheckedPictures++; - } + // Keep track of checked pictures + totalCheckedPictures++; + } - // Increment the inputQueueIndex Iterator - inputQueueIndex = (inputQueueIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; + // Increment the inputQueueIndex Iterator + inputQueueIndex = (inputQueueIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; - } + } - pictureControlSetPtr->isPan = EB_FALSE; - pictureControlSetPtr->isTilt = EB_FALSE; + pictureControlSetPtr->isPan = EB_FALSE; + pictureControlSetPtr->isTilt = EB_FALSE; - if (totalCheckedPictures) { - if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { - // If more than 75% of checked pictures are PAN then current picture is PAN - if ((((pictureControlSetPtr->hierarchicalLevels == 3)) || - ((pictureControlSetPtr->hierarchicalLevels == 4) && pictureControlSetPtr->temporalLayerIndex > 1) || - ((pictureControlSetPtr->hierarchicalLevels == 5) && pictureControlSetPtr->temporalLayerIndex > 2))){ + if (totalCheckedPictures) { + if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { + // If more than 75% of checked pictures are PAN then current picture is PAN + if ((((pictureControlSetPtr->hierarchicalLevels == 3)) || + ((pictureControlSetPtr->hierarchicalLevels == 4) && pictureControlSetPtr->temporalLayerIndex > 1) || + ((pictureControlSetPtr->hierarchicalLevels == 5) && pictureControlSetPtr->temporalLayerIndex > 2))){ - const EB_U32 HOMOGENIOUS_MOTION_TH[6] = { 20, 40, 50, 55, 60, 60 }; - if ((totalTMVPEnableDetectedPictures * 100 / totalCheckedPictures) > HOMOGENIOUS_MOTION_TH[pictureControlSetPtr->temporalLayerIndex]) { - pictureControlSetPtr->disableTmvpFlag = EB_FALSE; - } - } + const EB_U32 HOMOGENIOUS_MOTION_TH[6] = { 20, 40, 50, 55, 60, 60 }; + if ((totalTMVPEnableDetectedPictures * 100 / totalCheckedPictures) > HOMOGENIOUS_MOTION_TH[pictureControlSetPtr->temporalLayerIndex]) { + pictureControlSetPtr->disableTmvpFlag = EB_FALSE; + } + } - if ((totalPanPictures * 100 / totalCheckedPictures) > 75) { - pictureControlSetPtr->isPan = EB_TRUE; - } - } + if ((totalPanPictures * 100 / totalCheckedPictures) > 75) { + pictureControlSetPtr->isPan = EB_TRUE; + } + } - } - return; + } + return; } /************************************************ @@ -556,15 +556,15 @@ void EbHevcUpdateGlobalMotionDetectionOverTime( ************************************************/ void EbHevcUpdateBeaInfoOverTime( - EncodeContext_t *encodeContextPtr, - PictureParentControlSet_t *pictureControlSetPtr) + EncodeContext_t *encodeContextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { InitialRateControlReorderEntry_t *temporaryQueueEntryPtr; PictureParentControlSet_t *temporaryPictureControlSetPtr; - EB_U32 updateNonMovingIndexArrayFramesToCheck; + EB_U32 updateNonMovingIndexArrayFramesToCheck; EB_U16 lcuIdx; - EB_U16 framesToCheckIndex; - EB_U32 inputQueueIndex; + EB_U16 framesToCheckIndex; + EB_U32 inputQueueIndex; SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; @@ -610,22 +610,22 @@ void EbHevcUpdateBeaInfoOverTime( ** Used when no Lookahead is available ****************************************/ void EbHevcInitZzCostInfo( - PictureParentControlSet_t *pictureControlSetPtr) + PictureParentControlSet_t *pictureControlSetPtr) { EB_U16 lcuIdx; - // LCU loop - for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { - pictureControlSetPtr->zzCostArray[lcuIdx] = INVALID_ZZ_COST; + // LCU loop + for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { + pictureControlSetPtr->zzCostArray[lcuIdx] = INVALID_ZZ_COST; - } - pictureControlSetPtr->nonMovingIndexAverage = INVALID_ZZ_COST; + } + pictureControlSetPtr->nonMovingIndexAverage = INVALID_ZZ_COST; - // LCU Loop - for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { - pictureControlSetPtr->nonMovingIndexArray[lcuIdx] = INVALID_ZZ_COST; - } + // LCU Loop + for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { + pictureControlSetPtr->nonMovingIndexArray[lcuIdx] = INVALID_ZZ_COST; + } - return; + return; } /************************************************ @@ -635,31 +635,31 @@ void EbHevcInitZzCostInfo( ** LAD Window: min (2xmgpos+1 or sliding window size) ************************************************/ void EbHevcUpdateMotionFieldUniformityOverTime( - EncodeContext_t *encodeContextPtr, + EncodeContext_t *encodeContextPtr, SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + PictureParentControlSet_t *pictureControlSetPtr) { - InitialRateControlReorderEntry_t *temporaryQueueEntryPtr; - PictureParentControlSet_t *temporaryPictureControlSetPtr; - EB_U32 inputQueueIndex; - EB_U32 noFramesToCheck; - EB_U32 framesToCheckIndex; - //SVT_LOG("To update POC %d\tframesInSw = %d\n", pictureControlSetPtr->pictureNumber, pictureControlSetPtr->framesInSw); - - // Determine number of frames to check N + InitialRateControlReorderEntry_t *temporaryQueueEntryPtr; + PictureParentControlSet_t *temporaryPictureControlSetPtr; + EB_U32 inputQueueIndex; + EB_U32 noFramesToCheck; + EB_U32 framesToCheckIndex; + //SVT_LOG("To update POC %d\tframesInSw = %d\n", pictureControlSetPtr->pictureNumber, pictureControlSetPtr->framesInSw); + + // Determine number of frames to check N noFramesToCheck = MIN(MIN(((pictureControlSetPtr->predStructPtr->predStructPeriod << 1) + 1), pictureControlSetPtr->framesInSw), sequenceControlSetPtr->staticConfig.lookAheadDistance); - // Walk the first N entries in the sliding window starting picture + 1 - inputQueueIndex = (encodeContextPtr->initialRateControlReorderQueueHeadIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->initialRateControlReorderQueueHeadIndex; - for (framesToCheckIndex = 0; framesToCheckIndex < noFramesToCheck - 1; framesToCheckIndex++) { + // Walk the first N entries in the sliding window starting picture + 1 + inputQueueIndex = (encodeContextPtr->initialRateControlReorderQueueHeadIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->initialRateControlReorderQueueHeadIndex; + for (framesToCheckIndex = 0; framesToCheckIndex < noFramesToCheck - 1; framesToCheckIndex++) { - temporaryQueueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[inputQueueIndex]; - temporaryPictureControlSetPtr = ((PictureParentControlSet_t*)(temporaryQueueEntryPtr->parentPcsWrapperPtr)->objectPtr); + temporaryQueueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[inputQueueIndex]; + temporaryPictureControlSetPtr = ((PictureParentControlSet_t*)(temporaryQueueEntryPtr->parentPcsWrapperPtr)->objectPtr); - if (temporaryPictureControlSetPtr->endOfSequenceFlag) { - break; - } + if (temporaryPictureControlSetPtr->endOfSequenceFlag) { + break; + } // The values are calculated for every 4th frame if ((temporaryPictureControlSetPtr->pictureNumber & 3) == 0){ EbHevcStationaryEdgeCountLcu( @@ -668,12 +668,12 @@ void EbHevcUpdateMotionFieldUniformityOverTime( temporaryPictureControlSetPtr, pictureControlSetPtr->lcuTotalCount); } - // Increment the inputQueueIndex Iterator - inputQueueIndex = (inputQueueIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; + // Increment the inputQueueIndex Iterator + inputQueueIndex = (inputQueueIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; - } + } - return; + return; } /************************************************ @@ -683,148 +683,148 @@ void EbHevcUpdateMotionFieldUniformityOverTime( ** LAD Window: min (2xmgpos+1 or sliding window size) ************************************************/ void UpdateHomogeneityOverTime( - EncodeContext_t *encodeContextPtr, - PictureParentControlSet_t *pictureControlSetPtr) + EncodeContext_t *encodeContextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - InitialRateControlReorderEntry_t *temporaryQueueEntryPtr; - PictureParentControlSet_t *temporaryPictureControlSetPtr; - EB_U32 noFramesToCheck; + InitialRateControlReorderEntry_t *temporaryQueueEntryPtr; + PictureParentControlSet_t *temporaryPictureControlSetPtr; + EB_U32 noFramesToCheck; - EB_U16 *variancePtr; + EB_U16 *variancePtr; - EB_U64 meanSqrvariance64x64Based = 0, meanvariance64x64Based = 0; - EB_U16 countOfHomogeneousOverTime = 0; - EB_U32 inputQueueIndex; - EB_U32 framesToCheckIndex; - EB_U32 lcuIdx; + EB_U64 meanSqrvariance64x64Based = 0, meanvariance64x64Based = 0; + EB_U16 countOfHomogeneousOverTime = 0; + EB_U32 inputQueueIndex; + EB_U32 framesToCheckIndex; + EB_U32 lcuIdx; SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - pictureControlSetPtr->picHomogenousOverTimeLcuPercentage = 0; + pictureControlSetPtr->picHomogenousOverTimeLcuPercentage = 0; - // LCU Loop - for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { + // LCU Loop + for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { - meanSqrvariance64x64Based = 0; - meanvariance64x64Based = 0; + meanSqrvariance64x64Based = 0; + meanvariance64x64Based = 0; - // Initialize - pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] = 0xFFFFFFFFFFFFFFFF; + // Initialize + pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] = 0xFFFFFFFFFFFFFFFF; - pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx] = EB_FALSE; + pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx] = EB_FALSE; - // Update motionIndexArray of the current picture by averaging the motionIndexArray of the N future pictures - // Determine number of frames to check N + // Update motionIndexArray of the current picture by averaging the motionIndexArray of the N future pictures + // Determine number of frames to check N noFramesToCheck = MIN(MIN(((pictureControlSetPtr->predStructPtr->predStructPeriod << 1) + 1), pictureControlSetPtr->framesInSw), sequenceControlSetPtr->staticConfig.lookAheadDistance); - // Walk the first N entries in the sliding window starting picture + 1 - inputQueueIndex = (encodeContextPtr->initialRateControlReorderQueueHeadIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->initialRateControlReorderQueueHeadIndex; - for (framesToCheckIndex = 0; framesToCheckIndex < noFramesToCheck - 1; framesToCheckIndex++) { + // Walk the first N entries in the sliding window starting picture + 1 + inputQueueIndex = (encodeContextPtr->initialRateControlReorderQueueHeadIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->initialRateControlReorderQueueHeadIndex; + for (framesToCheckIndex = 0; framesToCheckIndex < noFramesToCheck - 1; framesToCheckIndex++) { - temporaryQueueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[inputQueueIndex]; - temporaryPictureControlSetPtr = ((PictureParentControlSet_t*)(temporaryQueueEntryPtr->parentPcsWrapperPtr)->objectPtr); - if (temporaryPictureControlSetPtr->sceneChangeFlag || temporaryPictureControlSetPtr->endOfSequenceFlag) { + temporaryQueueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[inputQueueIndex]; + temporaryPictureControlSetPtr = ((PictureParentControlSet_t*)(temporaryQueueEntryPtr->parentPcsWrapperPtr)->objectPtr); + if (temporaryPictureControlSetPtr->sceneChangeFlag || temporaryPictureControlSetPtr->endOfSequenceFlag) { - break; - } + break; + } - variancePtr = temporaryPictureControlSetPtr->variance[lcuIdx]; + variancePtr = temporaryPictureControlSetPtr->variance[lcuIdx]; - meanSqrvariance64x64Based += (variancePtr[ME_TIER_ZERO_PU_64x64])*(variancePtr[ME_TIER_ZERO_PU_64x64]); - meanvariance64x64Based += (variancePtr[ME_TIER_ZERO_PU_64x64]); + meanSqrvariance64x64Based += (variancePtr[ME_TIER_ZERO_PU_64x64])*(variancePtr[ME_TIER_ZERO_PU_64x64]); + meanvariance64x64Based += (variancePtr[ME_TIER_ZERO_PU_64x64]); - // Increment the inputQueueIndex Iterator - inputQueueIndex = (inputQueueIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; + // Increment the inputQueueIndex Iterator + inputQueueIndex = (inputQueueIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : inputQueueIndex + 1; - } // PCS loop + } // PCS loop - meanSqrvariance64x64Based = meanSqrvariance64x64Based / (noFramesToCheck - 1); - meanvariance64x64Based = meanvariance64x64Based / (noFramesToCheck - 1); + meanSqrvariance64x64Based = meanSqrvariance64x64Based / (noFramesToCheck - 1); + meanvariance64x64Based = meanvariance64x64Based / (noFramesToCheck - 1); - // Compute variance - pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] = meanSqrvariance64x64Based - meanvariance64x64Based * meanvariance64x64Based; + // Compute variance + pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] = meanSqrvariance64x64Based - meanvariance64x64Based * meanvariance64x64Based; - if (pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] <= (VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD)) { - pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx] = EB_TRUE; - } + if (pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] <= (VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD)) { + pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx] = EB_TRUE; + } - countOfHomogeneousOverTime += pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx]; + countOfHomogeneousOverTime += pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx]; - } // LCU loop + } // LCU loop - pictureControlSetPtr->picHomogenousOverTimeLcuPercentage = (EB_U8)(countOfHomogeneousOverTime * 100 / pictureControlSetPtr->lcuTotalCount); + pictureControlSetPtr->picHomogenousOverTimeLcuPercentage = (EB_U8)(countOfHomogeneousOverTime * 100 / pictureControlSetPtr->lcuTotalCount); - return; + return; } void ResetHomogeneityStructures( - PictureParentControlSet_t *pictureControlSetPtr) + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U32 lcuIdx; + EB_U32 lcuIdx; - pictureControlSetPtr->picHomogenousOverTimeLcuPercentage = 0; + pictureControlSetPtr->picHomogenousOverTimeLcuPercentage = 0; - // Reset the structure - for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { - pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] = 0xFFFFFFFFFFFFFFFF; - pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx] = EB_FALSE; - } + // Reset the structure + for (lcuIdx = 0; lcuIdx < pictureControlSetPtr->lcuTotalCount; ++lcuIdx) { + pictureControlSetPtr->lcuVarianceOfVarianceOverTime[lcuIdx] = 0xFFFFFFFFFFFFFFFF; + pictureControlSetPtr->isLcuHomogeneousOverTime[lcuIdx] = EB_FALSE; + } - return; + return; } InitialRateControlReorderEntry_t * EbHevcDeterminePictureOffsetInQueue( - EncodeContext_t *encodeContextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - MotionEstimationResults_t *inputResultsPtr) + EncodeContext_t *encodeContextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + MotionEstimationResults_t *inputResultsPtr) { - InitialRateControlReorderEntry_t *queueEntryPtr; - EB_S32 queueEntryIndex; + InitialRateControlReorderEntry_t *queueEntryPtr; + EB_S32 queueEntryIndex; - queueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->initialRateControlReorderQueue[encodeContextPtr->initialRateControlReorderQueueHeadIndex]->pictureNumber); - queueEntryIndex += encodeContextPtr->initialRateControlReorderQueueHeadIndex; - queueEntryIndex = (queueEntryIndex > INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndex - INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH : queueEntryIndex; - queueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[queueEntryIndex]; - queueEntryPtr->parentPcsWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; - queueEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; + queueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->initialRateControlReorderQueue[encodeContextPtr->initialRateControlReorderQueueHeadIndex]->pictureNumber); + queueEntryIndex += encodeContextPtr->initialRateControlReorderQueueHeadIndex; + queueEntryIndex = (queueEntryIndex > INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndex - INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH : queueEntryIndex; + queueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[queueEntryIndex]; + queueEntryPtr->parentPcsWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; + queueEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; - return queueEntryPtr; + return queueEntryPtr; } void EbHevcGetHistogramQueueData( - SequenceControlSet_t *sequenceControlSetPtr, - EncodeContext_t *encodeContextPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + EncodeContext_t *encodeContextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - HlRateControlHistogramEntry_t *histogramQueueEntryPtr; - EB_S32 histogramQueueEntryIndex; - - // Determine offset from the Head Ptr for HLRC histogram queue - EbBlockOnMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); - histogramQueueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->hlRateControlHistorgramQueue[encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber); - histogramQueueEntryIndex += encodeContextPtr->hlRateControlHistorgramQueueHeadIndex; - histogramQueueEntryIndex = (histogramQueueEntryIndex > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? - histogramQueueEntryIndex - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : - histogramQueueEntryIndex; - histogramQueueEntryPtr = encodeContextPtr->hlRateControlHistorgramQueue[histogramQueueEntryIndex]; - - - //histogramQueueEntryPtr->parentPcsWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; - histogramQueueEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; - histogramQueueEntryPtr->endOfSequenceFlag = pictureControlSetPtr->endOfSequenceFlag; - histogramQueueEntryPtr->sliceType = pictureControlSetPtr->sliceType; - histogramQueueEntryPtr->temporalLayerIndex = pictureControlSetPtr->temporalLayerIndex; - histogramQueueEntryPtr->fullLcuCount = pictureControlSetPtr->fullLcuCount; - histogramQueueEntryPtr->lifeCount = 0; - histogramQueueEntryPtr->passedToHlrc = EB_FALSE; - histogramQueueEntryPtr->isCoded = EB_FALSE; - histogramQueueEntryPtr->totalNumBitsCoded = 0; + HlRateControlHistogramEntry_t *histogramQueueEntryPtr; + EB_S32 histogramQueueEntryIndex; + + // Determine offset from the Head Ptr for HLRC histogram queue + EbBlockOnMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); + histogramQueueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->hlRateControlHistorgramQueue[encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber); + histogramQueueEntryIndex += encodeContextPtr->hlRateControlHistorgramQueueHeadIndex; + histogramQueueEntryIndex = (histogramQueueEntryIndex > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? + histogramQueueEntryIndex - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : + histogramQueueEntryIndex; + histogramQueueEntryPtr = encodeContextPtr->hlRateControlHistorgramQueue[histogramQueueEntryIndex]; + + + //histogramQueueEntryPtr->parentPcsWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; + histogramQueueEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; + histogramQueueEntryPtr->endOfSequenceFlag = pictureControlSetPtr->endOfSequenceFlag; + histogramQueueEntryPtr->sliceType = pictureControlSetPtr->sliceType; + histogramQueueEntryPtr->temporalLayerIndex = pictureControlSetPtr->temporalLayerIndex; + histogramQueueEntryPtr->fullLcuCount = pictureControlSetPtr->fullLcuCount; + histogramQueueEntryPtr->lifeCount = 0; + histogramQueueEntryPtr->passedToHlrc = EB_FALSE; + histogramQueueEntryPtr->isCoded = EB_FALSE; + histogramQueueEntryPtr->totalNumBitsCoded = 0; EB_MEMCPY( histogramQueueEntryPtr->meDistortionHistogram, pictureControlSetPtr->meDistortionHistogram, @@ -835,38 +835,38 @@ void EbHevcGetHistogramQueueData( pictureControlSetPtr->oisDistortionHistogram, sizeof(EB_U16) * NUMBER_OF_INTRA_SAD_INTERVALS); - EbReleaseMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); - //SVT_LOG("Test1 POC: %d\t POC: %d\t LifeCount: %d\n", histogramQueueEntryPtr->pictureNumber, pictureControlSetPtr->pictureNumber, histogramQueueEntryPtr->lifeCount); + EbReleaseMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); + //SVT_LOG("Test1 POC: %d\t POC: %d\t LifeCount: %d\n", histogramQueueEntryPtr->pictureNumber, pictureControlSetPtr->pictureNumber, histogramQueueEntryPtr->lifeCount); - return; + return; } void EbHevcUpdateHistogramQueueEntry( - SequenceControlSet_t *sequenceControlSetPtr, - EncodeContext_t *encodeContextPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + EncodeContext_t *encodeContextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - HlRateControlHistogramEntry_t *histogramQueueEntryPtr; - EB_S32 histogramQueueEntryIndex; + HlRateControlHistogramEntry_t *histogramQueueEntryPtr; + EB_S32 histogramQueueEntryIndex; - EbBlockOnMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); + EbBlockOnMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); - histogramQueueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->hlRateControlHistorgramQueue[encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber); - histogramQueueEntryIndex += encodeContextPtr->hlRateControlHistorgramQueueHeadIndex; - histogramQueueEntryIndex = (histogramQueueEntryIndex > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? - histogramQueueEntryIndex - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : - histogramQueueEntryIndex; + histogramQueueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->hlRateControlHistorgramQueue[encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber); + histogramQueueEntryIndex += encodeContextPtr->hlRateControlHistorgramQueueHeadIndex; + histogramQueueEntryIndex = (histogramQueueEntryIndex > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? + histogramQueueEntryIndex - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : + histogramQueueEntryIndex; CHECK_REPORT_ERROR(histogramQueueEntryIndex >= 0, encodeContextPtr->appCallbackPtr, EB_ENC_RC_ERROR8); - histogramQueueEntryPtr = encodeContextPtr->hlRateControlHistorgramQueue[histogramQueueEntryIndex]; - histogramQueueEntryPtr->lifeCount += pictureControlSetPtr->historgramLifeCount; - histogramQueueEntryPtr->passedToHlrc = EB_TRUE; + histogramQueueEntryPtr = encodeContextPtr->hlRateControlHistorgramQueue[histogramQueueEntryIndex]; + histogramQueueEntryPtr->lifeCount += pictureControlSetPtr->historgramLifeCount; + histogramQueueEntryPtr->passedToHlrc = EB_TRUE; - EbReleaseMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); + EbReleaseMutex(sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueMutex); - return; + return; } /************************************************ @@ -882,50 +882,50 @@ void EbHevcUpdateHistogramQueueEntry( ************************************************/ void* InitialRateControlKernel(void *inputPtr) { - InitialRateControlContext_t *contextPtr = (InitialRateControlContext_t*)inputPtr; - PictureParentControlSet_t *pictureControlSetPtr; - PictureParentControlSet_t *pictureControlSetPtrTemp; - EncodeContext_t *encodeContextPtr; - SequenceControlSet_t *sequenceControlSetPtr; - - EbObjectWrapper_t *inputResultsWrapperPtr; - MotionEstimationResults_t *inputResultsPtr; - - EbObjectWrapper_t *outputResultsWrapperPtr; - InitialRateControlResults_t *outputResultsPtr; - - // Queue variables - EB_U32 queueEntryIndexTemp; - EB_U32 queueEntryIndexTemp2; - InitialRateControlReorderEntry_t *queueEntryPtr; - - EB_BOOL moveSlideWondowFlag = EB_TRUE; - EB_BOOL endOfSequenceFlag = EB_TRUE; - EB_U8 framesInSw; + InitialRateControlContext_t *contextPtr = (InitialRateControlContext_t*)inputPtr; + PictureParentControlSet_t *pictureControlSetPtr; + PictureParentControlSet_t *pictureControlSetPtrTemp; + EncodeContext_t *encodeContextPtr; + SequenceControlSet_t *sequenceControlSetPtr; + + EbObjectWrapper_t *inputResultsWrapperPtr; + MotionEstimationResults_t *inputResultsPtr; + + EbObjectWrapper_t *outputResultsWrapperPtr; + InitialRateControlResults_t *outputResultsPtr; + + // Queue variables + EB_U32 queueEntryIndexTemp; + EB_U32 queueEntryIndexTemp2; + InitialRateControlReorderEntry_t *queueEntryPtr; + + EB_BOOL moveSlideWondowFlag = EB_TRUE; + EB_BOOL endOfSequenceFlag = EB_TRUE; + EB_U8 framesInSw; EB_U8 temporalLayerIndex; - EbObjectWrapper_t *referencePictureWrapperPtr; + EbObjectWrapper_t *referencePictureWrapperPtr; #if !OUT_ALLOC - EbObjectWrapper_t *outputStreamWrapperPtr; + EbObjectWrapper_t *outputStreamWrapperPtr; #endif - for (;;) { + for (;;) { - // Get Input Full Object - EbGetFullObject( - contextPtr->motionEstimationResultsInputFifoPtr, - &inputResultsWrapperPtr); + // Get Input Full Object + EbGetFullObject( + contextPtr->motionEstimationResultsInputFifoPtr, + &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - inputResultsPtr = (MotionEstimationResults_t*)inputResultsWrapperPtr->objectPtr; - pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; + inputResultsPtr = (MotionEstimationResults_t*)inputResultsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld IRC IN \n", pictureControlSetPtr->pictureNumber); #endif pictureControlSetPtr->meSegmentsCompletionMask++; if (pictureControlSetPtr->meSegmentsCompletionMask == pictureControlSetPtr->meSegmentsTotalCount) { - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - encodeContextPtr = (EncodeContext_t*)sequenceControlSetPtr->encodeContextPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + encodeContextPtr = (EncodeContext_t*)sequenceControlSetPtr->encodeContextPtr; // Mark picture when global motion is detected using ME results //reset intraCodedEstimationLcu @@ -933,204 +933,204 @@ void* InitialRateControlKernel(void *inputPtr) sequenceControlSetPtr, pictureControlSetPtr); - // Release Pa Ref pictures when not needed - EbHevcReleasePaReferenceObjects( - pictureControlSetPtr); - - //**************************************************** - // Input Motion Analysis Results into Reordering Queue - //**************************************************** - - // Determine offset from the Head Ptr - queueEntryPtr = EbHevcDeterminePictureOffsetInQueue( - encodeContextPtr, - pictureControlSetPtr, - inputResultsPtr); - - if (sequenceControlSetPtr->staticConfig.rateControlMode) - { - if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0){ - - // Getting the Histogram Queue Data - EbHevcGetHistogramQueueData( - sequenceControlSetPtr, - encodeContextPtr, - pictureControlSetPtr); - } - } - - for (temporalLayerIndex = 0; temporalLayerIndex < EB_MAX_TEMPORAL_LAYERS; temporalLayerIndex++){ - pictureControlSetPtr->framesInInterval[temporalLayerIndex] = 0; - } - - pictureControlSetPtr->framesInSw = 0; - pictureControlSetPtr->historgramLifeCount = 0; + // Release Pa Ref pictures when not needed + EbHevcReleasePaReferenceObjects( + pictureControlSetPtr); + + //**************************************************** + // Input Motion Analysis Results into Reordering Queue + //**************************************************** + + // Determine offset from the Head Ptr + queueEntryPtr = EbHevcDeterminePictureOffsetInQueue( + encodeContextPtr, + pictureControlSetPtr, + inputResultsPtr); + + if (sequenceControlSetPtr->staticConfig.rateControlMode) + { + if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0){ + + // Getting the Histogram Queue Data + EbHevcGetHistogramQueueData( + sequenceControlSetPtr, + encodeContextPtr, + pictureControlSetPtr); + } + } + + for (temporalLayerIndex = 0; temporalLayerIndex < EB_MAX_TEMPORAL_LAYERS; temporalLayerIndex++){ + pictureControlSetPtr->framesInInterval[temporalLayerIndex] = 0; + } + + pictureControlSetPtr->framesInSw = 0; + pictureControlSetPtr->historgramLifeCount = 0; pictureControlSetPtr->sceneChangeInGop = EB_FALSE; - moveSlideWondowFlag = EB_TRUE; - while (moveSlideWondowFlag){ - - // Check if the sliding window condition is valid - queueEntryIndexTemp = encodeContextPtr->initialRateControlReorderQueueHeadIndex; - if (encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp]->parentPcsWrapperPtr != EB_NULL){ - endOfSequenceFlag = (((PictureParentControlSet_t*)(encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp]->parentPcsWrapperPtr)->objectPtr))->endOfSequenceFlag; - } - else{ - endOfSequenceFlag = EB_FALSE; - } - framesInSw = 0; - while (moveSlideWondowFlag && !endOfSequenceFlag && - queueEntryIndexTemp <= encodeContextPtr->initialRateControlReorderQueueHeadIndex + sequenceControlSetPtr->staticConfig.lookAheadDistance){ - // framesInSw <= sequenceControlSetPtr->staticConfig.lookAheadDistance){ - - framesInSw++; - - queueEntryIndexTemp2 = (queueEntryIndexTemp > INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH : queueEntryIndexTemp; - - moveSlideWondowFlag = (EB_BOOL)(moveSlideWondowFlag && (encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr != EB_NULL)); - if (encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr != EB_NULL){ - // check if it is the last frame. If we have reached the last frame, we would output the buffered frames in the Queue. - endOfSequenceFlag = ((PictureParentControlSet_t*)(encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr)->objectPtr)->endOfSequenceFlag; - } - else{ - endOfSequenceFlag = EB_FALSE; - } - queueEntryIndexTemp++; - } - - - if (moveSlideWondowFlag) { - - //get a new entry spot - queueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[encodeContextPtr->initialRateControlReorderQueueHeadIndex]; - pictureControlSetPtr = ((PictureParentControlSet_t*)(queueEntryPtr->parentPcsWrapperPtr)->objectPtr); - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - pictureControlSetPtr->framesInSw = framesInSw; - queueEntryIndexTemp = encodeContextPtr->initialRateControlReorderQueueHeadIndex; - endOfSequenceFlag = EB_FALSE; - // find the framesInInterval for the peroid I frames - while (!endOfSequenceFlag && - queueEntryIndexTemp <= encodeContextPtr->initialRateControlReorderQueueHeadIndex + sequenceControlSetPtr->staticConfig.lookAheadDistance){ - - queueEntryIndexTemp2 = (queueEntryIndexTemp > INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH : queueEntryIndexTemp; - pictureControlSetPtrTemp = ((PictureParentControlSet_t*)(encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr)->objectPtr); - if (sequenceControlSetPtr->intraPeriodLength != -1){ - if (pictureControlSetPtr->pictureNumber % ((sequenceControlSetPtr->intraPeriodLength + 1)) == 0){ - pictureControlSetPtr->framesInInterval[pictureControlSetPtrTemp->temporalLayerIndex] ++; - if (pictureControlSetPtrTemp->sceneChangeFlag) - pictureControlSetPtr->sceneChangeInGop = EB_TRUE; - } - } - - pictureControlSetPtrTemp->historgramLifeCount++; - endOfSequenceFlag = pictureControlSetPtrTemp->endOfSequenceFlag; - queueEntryIndexTemp++; - } - - - - if ((sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) && (framesInSw < (sequenceControlSetPtr->staticConfig.lookAheadDistance + 1))) - pictureControlSetPtr->endOfSequenceRegion = EB_TRUE; - else - pictureControlSetPtr->endOfSequenceRegion = EB_FALSE; - - if (sequenceControlSetPtr->staticConfig.rateControlMode) - { - // Determine offset from the Head Ptr for HLRC histogram queue and set the life count - if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0){ - - // Update Histogram Queue Entry Life count - EbHevcUpdateHistogramQueueEntry( - sequenceControlSetPtr, - encodeContextPtr, - pictureControlSetPtr); - } - } - - // Mark each input picture as PAN or not - // If a lookahead is present then check PAN for a period of time - if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { - - // Check for Pan,Tilt, Zoom and other global motion detectors over the future pictures in the lookahead - EbHevcUpdateGlobalMotionDetectionOverTime( - encodeContextPtr, - sequenceControlSetPtr, - pictureControlSetPtr); - } - else { - if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { - EbHevcDetectGlobalMotion( + moveSlideWondowFlag = EB_TRUE; + while (moveSlideWondowFlag){ + + // Check if the sliding window condition is valid + queueEntryIndexTemp = encodeContextPtr->initialRateControlReorderQueueHeadIndex; + if (encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp]->parentPcsWrapperPtr != EB_NULL){ + endOfSequenceFlag = (((PictureParentControlSet_t*)(encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp]->parentPcsWrapperPtr)->objectPtr))->endOfSequenceFlag; + } + else{ + endOfSequenceFlag = EB_FALSE; + } + framesInSw = 0; + while (moveSlideWondowFlag && !endOfSequenceFlag && + queueEntryIndexTemp <= encodeContextPtr->initialRateControlReorderQueueHeadIndex + sequenceControlSetPtr->staticConfig.lookAheadDistance){ + // framesInSw <= sequenceControlSetPtr->staticConfig.lookAheadDistance){ + + framesInSw++; + + queueEntryIndexTemp2 = (queueEntryIndexTemp > INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH : queueEntryIndexTemp; + + moveSlideWondowFlag = (EB_BOOL)(moveSlideWondowFlag && (encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr != EB_NULL)); + if (encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr != EB_NULL){ + // check if it is the last frame. If we have reached the last frame, we would output the buffered frames in the Queue. + endOfSequenceFlag = ((PictureParentControlSet_t*)(encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr)->objectPtr)->endOfSequenceFlag; + } + else{ + endOfSequenceFlag = EB_FALSE; + } + queueEntryIndexTemp++; + } + + + if (moveSlideWondowFlag) { + + //get a new entry spot + queueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[encodeContextPtr->initialRateControlReorderQueueHeadIndex]; + pictureControlSetPtr = ((PictureParentControlSet_t*)(queueEntryPtr->parentPcsWrapperPtr)->objectPtr); + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + pictureControlSetPtr->framesInSw = framesInSw; + queueEntryIndexTemp = encodeContextPtr->initialRateControlReorderQueueHeadIndex; + endOfSequenceFlag = EB_FALSE; + // find the framesInInterval for the peroid I frames + while (!endOfSequenceFlag && + queueEntryIndexTemp <= encodeContextPtr->initialRateControlReorderQueueHeadIndex + sequenceControlSetPtr->staticConfig.lookAheadDistance){ + + queueEntryIndexTemp2 = (queueEntryIndexTemp > INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH : queueEntryIndexTemp; + pictureControlSetPtrTemp = ((PictureParentControlSet_t*)(encodeContextPtr->initialRateControlReorderQueue[queueEntryIndexTemp2]->parentPcsWrapperPtr)->objectPtr); + if (sequenceControlSetPtr->intraPeriodLength != -1){ + if (pictureControlSetPtr->pictureNumber % ((sequenceControlSetPtr->intraPeriodLength + 1)) == 0){ + pictureControlSetPtr->framesInInterval[pictureControlSetPtrTemp->temporalLayerIndex] ++; + if (pictureControlSetPtrTemp->sceneChangeFlag) + pictureControlSetPtr->sceneChangeInGop = EB_TRUE; + } + } + + pictureControlSetPtrTemp->historgramLifeCount++; + endOfSequenceFlag = pictureControlSetPtrTemp->endOfSequenceFlag; + queueEntryIndexTemp++; + } + + + + if ((sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) && (framesInSw < (sequenceControlSetPtr->staticConfig.lookAheadDistance + 1))) + pictureControlSetPtr->endOfSequenceRegion = EB_TRUE; + else + pictureControlSetPtr->endOfSequenceRegion = EB_FALSE; + + if (sequenceControlSetPtr->staticConfig.rateControlMode) + { + // Determine offset from the Head Ptr for HLRC histogram queue and set the life count + if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0){ + + // Update Histogram Queue Entry Life count + EbHevcUpdateHistogramQueueEntry( sequenceControlSetPtr, + encodeContextPtr, pictureControlSetPtr); - } - } - - // BACKGROUND ENHANCEMENT PART II - if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { - // Update BEA information based on Lookahead information - EbHevcUpdateBeaInfoOverTime( - encodeContextPtr, - pictureControlSetPtr); - - } - else { - // Reset zzCost information to default When there's no lookahead available - EbHevcInitZzCostInfo( - pictureControlSetPtr); - } - - // Use the temporal layer 0 isLcuMotionFieldNonUniform array for all the other layer pictures in the mini GOP - if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { - - // Updat uniformly moving LCUs based on Collocated LCUs in LookAhead window - EbHevcUpdateMotionFieldUniformityOverTime( - encodeContextPtr, + } + } + + // Mark each input picture as PAN or not + // If a lookahead is present then check PAN for a period of time + if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { + + // Check for Pan,Tilt, Zoom and other global motion detectors over the future pictures in the lookahead + EbHevcUpdateGlobalMotionDetectionOverTime( + encodeContextPtr, sequenceControlSetPtr, - pictureControlSetPtr); - } - - if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { - // Compute and store variance of LCus over time and determine homogenuity temporally - UpdateHomogeneityOverTime( - encodeContextPtr, - pictureControlSetPtr); - } - else { - // Reset Homogeneity Structures to default if no lookahead is detected - ResetHomogeneityStructures( - pictureControlSetPtr); - } - - // Get Empty Reference Picture Object - EbGetEmptyObject( - sequenceControlSetPtr->encodeContextPtr->referencePicturePoolFifoPtr, - &referencePictureWrapperPtr); - ((PictureParentControlSet_t*)(queueEntryPtr->parentPcsWrapperPtr->objectPtr))->referencePictureWrapperPtr = referencePictureWrapperPtr; - - // Give the new Reference a nominal liveCount of 1 - EbObjectIncLiveCount( - ((PictureParentControlSet_t*)(queueEntryPtr->parentPcsWrapperPtr->objectPtr))->referencePictureWrapperPtr, - 1); - //OPTION 1: get the buffer in resource coordination + pictureControlSetPtr); + } + else { + if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { + EbHevcDetectGlobalMotion( + sequenceControlSetPtr, + pictureControlSetPtr); + } + } + + // BACKGROUND ENHANCEMENT PART II + if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { + // Update BEA information based on Lookahead information + EbHevcUpdateBeaInfoOverTime( + encodeContextPtr, + pictureControlSetPtr); + + } + else { + // Reset zzCost information to default When there's no lookahead available + EbHevcInitZzCostInfo( + pictureControlSetPtr); + } + + // Use the temporal layer 0 isLcuMotionFieldNonUniform array for all the other layer pictures in the mini GOP + if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { + + // Updat uniformly moving LCUs based on Collocated LCUs in LookAhead window + EbHevcUpdateMotionFieldUniformityOverTime( + encodeContextPtr, + sequenceControlSetPtr, + pictureControlSetPtr); + } + + if (!pictureControlSetPtr->endOfSequenceFlag && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { + // Compute and store variance of LCus over time and determine homogenuity temporally + UpdateHomogeneityOverTime( + encodeContextPtr, + pictureControlSetPtr); + } + else { + // Reset Homogeneity Structures to default if no lookahead is detected + ResetHomogeneityStructures( + pictureControlSetPtr); + } + + // Get Empty Reference Picture Object + EbGetEmptyObject( + sequenceControlSetPtr->encodeContextPtr->referencePicturePoolFifoPtr, + &referencePictureWrapperPtr); + ((PictureParentControlSet_t*)(queueEntryPtr->parentPcsWrapperPtr->objectPtr))->referencePictureWrapperPtr = referencePictureWrapperPtr; + + // Give the new Reference a nominal liveCount of 1 + EbObjectIncLiveCount( + ((PictureParentControlSet_t*)(queueEntryPtr->parentPcsWrapperPtr->objectPtr))->referencePictureWrapperPtr, + 1); + //OPTION 1: get the buffer in resource coordination #if !OUT_ALLOC - EbGetEmptyObject( - sequenceControlSetPtr->encodeContextPtr->streamOutputFifoPtr, - &outputStreamWrapperPtr); + EbGetEmptyObject( + sequenceControlSetPtr->encodeContextPtr->streamOutputFifoPtr, + &outputStreamWrapperPtr); - pictureControlSetPtr->outputStreamWrapperPtr = outputStreamWrapperPtr; + pictureControlSetPtr->outputStreamWrapperPtr = outputStreamWrapperPtr; #endif // Get Empty Results Object - EbGetEmptyObject( - contextPtr->initialrateControlResultsOutputFifoPtr, - &outputResultsWrapperPtr); - - outputResultsPtr = (InitialRateControlResults_t*)outputResultsWrapperPtr->objectPtr; - outputResultsPtr->pictureControlSetWrapperPtr = queueEntryPtr->parentPcsWrapperPtr; - ///////////////////////////// - // Post the Full Results Object - EbPostFullObject(outputResultsWrapperPtr); + EbGetEmptyObject( + contextPtr->initialrateControlResultsOutputFifoPtr, + &outputResultsWrapperPtr); + + outputResultsPtr = (InitialRateControlResults_t*)outputResultsWrapperPtr->objectPtr; + outputResultsPtr->pictureControlSetWrapperPtr = queueEntryPtr->parentPcsWrapperPtr; + ///////////////////////////// + // Post the Full Results Object + EbPostFullObject(outputResultsWrapperPtr); #if LATENCY_PROFILE double latency = 0.0; EB_U64 finishTimeSeconds = 0; @@ -1150,24 +1150,24 @@ void* InitialRateControlKernel(void *inputPtr) latency); #endif - // Reset the Reorder Queue Entry - queueEntryPtr->pictureNumber += INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH; - queueEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; + // Reset the Reorder Queue Entry + queueEntryPtr->pictureNumber += INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH; + queueEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - // Increment the Reorder Queue head Ptr - encodeContextPtr->initialRateControlReorderQueueHeadIndex = - (encodeContextPtr->initialRateControlReorderQueueHeadIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->initialRateControlReorderQueueHeadIndex + 1; + // Increment the Reorder Queue head Ptr + encodeContextPtr->initialRateControlReorderQueueHeadIndex = + (encodeContextPtr->initialRateControlReorderQueueHeadIndex == INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->initialRateControlReorderQueueHeadIndex + 1; - queueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[encodeContextPtr->initialRateControlReorderQueueHeadIndex]; - } - } - } + queueEntryPtr = encodeContextPtr->initialRateControlReorderQueue[encodeContextPtr->initialRateControlReorderQueueHeadIndex]; + } + } + } #if DEADLOCK_DEBUG SVT_LOG("POC %lld IRC OUT \n", pictureControlSetPtr->pictureNumber); #endif - // Release the Input Results - EbReleaseObject(inputResultsWrapperPtr); + // Release the Input Results + EbReleaseObject(inputResultsWrapperPtr); - } - return EB_NULL; + } + return EB_NULL; } diff --git a/Source/Lib/Codec/EbInitialRateControlProcess.h b/Source/Lib/Codec/EbInitialRateControlProcess.h index e4443c18f..947e7c38f 100644 --- a/Source/Lib/Codec/EbInitialRateControlProcess.h +++ b/Source/Lib/Codec/EbInitialRateControlProcess.h @@ -20,7 +20,7 @@ extern "C" { typedef struct InitialRateControlContext_s { EbFifo_t *motionEstimationResultsInputFifoPtr; - EbFifo_t *initialrateControlResultsOutputFifoPtr; + EbFifo_t *initialrateControlResultsOutputFifoPtr; } InitialRateControlContext_t; diff --git a/Source/Lib/Codec/EbInitialRateControlReorderQueue.c b/Source/Lib/Codec/EbInitialRateControlReorderQueue.c index 70c28390c..d75804eb1 100644 --- a/Source/Lib/Codec/EbInitialRateControlReorderQueue.c +++ b/Source/Lib/Codec/EbInitialRateControlReorderQueue.c @@ -6,7 +6,7 @@ #include #include "EbInitialRateControlReorderQueue.h" -EB_ERRORTYPE InitialRateControlReorderEntryCtor( +EB_ERRORTYPE InitialRateControlReorderEntryCtor( InitialRateControlReorderEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -14,12 +14,12 @@ EB_ERRORTYPE InitialRateControlReorderEntryCtor( (*entryDblPtr)->pictureNumber = pictureNumber; (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - + return EB_ErrorNone; } -EB_ERRORTYPE HlRateControlHistogramEntryCtor( +EB_ERRORTYPE HlRateControlHistogramEntryCtor( HlRateControlHistogramEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -30,7 +30,7 @@ EB_ERRORTYPE HlRateControlHistogramEntryCtor( (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - // ME and OIS Distortion Histograms + // ME and OIS Distortion Histograms EB_MALLOC(EB_U16*, (*entryDblPtr)->meDistortionHistogram, sizeof(EB_U16) * NUMBER_OF_SAD_INTERVALS, EB_N_PTR); EB_MALLOC(EB_U16*, (*entryDblPtr)->oisDistortionHistogram, sizeof(EB_U16) * NUMBER_OF_INTRA_SAD_INTERVALS, EB_N_PTR); diff --git a/Source/Lib/Codec/EbInitialRateControlReorderQueue.h b/Source/Lib/Codec/EbInitialRateControlReorderQueue.h index b62982e03..f400648e6 100644 --- a/Source/Lib/Codec/EbInitialRateControlReorderQueue.h +++ b/Source/Lib/Codec/EbInitialRateControlReorderQueue.h @@ -17,11 +17,11 @@ extern "C" { * Initial Rate Control Reorder Queue Entry ************************************************/ typedef struct InitialRateControlReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *parentPcsWrapperPtr; -} InitialRateControlReorderEntry_t; +} InitialRateControlReorderEntry_t; -extern EB_ERRORTYPE InitialRateControlReorderEntryCtor( +extern EB_ERRORTYPE InitialRateControlReorderEntryCtor( InitialRateControlReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); @@ -30,25 +30,25 @@ extern EB_ERRORTYPE InitialRateControlReorderEntryCtor( * High Level Rate Control Histogram Queue Entry ************************************************/ typedef struct HlRateControlHistogramEntry_s { - EB_U64 pictureNumber; - EB_S16 lifeCount; + EB_U64 pictureNumber; + EB_S16 lifeCount; EB_BOOL passedToHlrc; EB_BOOL isCoded; EB_U64 totalNumBitsCoded; EbObjectWrapper_t *parentPcsWrapperPtr; - EB_BOOL endOfSequenceFlag; + EB_BOOL endOfSequenceFlag; EB_U64 predBitsRefQp[MAX_REF_QP_NUM]; - EB_PICTURE sliceType; - EB_U32 temporalLayerIndex; + EB_PICTURE sliceType; + EB_U32 temporalLayerIndex; - - // Motion Estimation Distortion and OIS Historgram + + // Motion Estimation Distortion and OIS Historgram EB_U16 *meDistortionHistogram; EB_U16 *oisDistortionHistogram; EB_U32 fullLcuCount; -} HlRateControlHistogramEntry_t; +} HlRateControlHistogramEntry_t; -extern EB_ERRORTYPE HlRateControlHistogramEntryCtor( +extern EB_ERRORTYPE HlRateControlHistogramEntryCtor( HlRateControlHistogramEntry_t **entryDblPtr, EB_U32 pictureNumber); diff --git a/Source/Lib/Codec/EbInitialRateControlResults.c b/Source/Lib/Codec/EbInitialRateControlResults.c index 82a5d97bd..702769fe2 100644 --- a/Source/Lib/Codec/EbInitialRateControlResults.c +++ b/Source/Lib/Codec/EbInitialRateControlResults.c @@ -8,7 +8,7 @@ #include "EbInitialRateControlResults.h" EB_ERRORTYPE InitialRateControlResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { InitialRateControlResults_t *objectPtr; @@ -17,7 +17,7 @@ EB_ERRORTYPE InitialRateControlResultsCtor( *objectDblPtr = (EB_PTR) objectPtr; objectInitDataPtr = 0; (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbInitialRateControlResults.h b/Source/Lib/Codec/EbInitialRateControlResults.h index cf83ab1e7..02ed0bfef 100644 --- a/Source/Lib/Codec/EbInitialRateControlResults.h +++ b/Source/Lib/Codec/EbInitialRateControlResults.h @@ -28,10 +28,10 @@ typedef struct InitialRateControlResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE InitialRateControlResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbInterPrediction.c b/Source/Lib/Codec/EbInterPrediction.c index 25364a86b..74b7e5a66 100644 --- a/Source/Lib/Codec/EbInterPrediction.c +++ b/Source/Lib/Codec/EbInterPrediction.c @@ -20,7 +20,7 @@ EB_ERRORTYPE InterPredictionContextCtor( InterPredictionContext_t **interPredictionContext, - EB_U16 maxCUWidth, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit) @@ -45,13 +45,13 @@ EB_ERRORTYPE InterPredictionContextCtor( void RoundMvOnTheFly( - EB_S16 *motionVector_x, - EB_S16 *motionVector_y) + EB_S16 *motionVector_x, + EB_S16 *motionVector_y) { - *motionVector_x = (*motionVector_x + 2)&~0x03; - *motionVector_y = (*motionVector_y + 2)&~0x03; + *motionVector_x = (*motionVector_x + 2)&~0x03; + *motionVector_y = (*motionVector_y + 2)&~0x03; - return; + return; } @@ -250,7 +250,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( puOriginIndex, puChromaOriginIndex, componentMask, - contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf0); + contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf0); } @@ -392,7 +392,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( componentMask, contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf0, contextPtr->mcpContext->avcStyleMcpIntermediateResultBuf1, - contextPtr->mcpContext->avcStyleMcpTwoDInterpolationFirstPassFilterResultBuf); + contextPtr->mcpContext->avcStyleMcpTwoDInterpolationFirstPassFilterResultBuf); } break; @@ -413,57 +413,57 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( * PreLoad Reference Block for 16bit mode ***************************************************/ void UnPackReferenceBlock( - EbPictureBufferDesc_t *refFramePic, - EB_U32 posX, - EB_U32 posY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *dst, - EB_U32 componentMask) + EbPictureBufferDesc_t *refFramePic, + EB_U32 posX, + EB_U32 posY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *dst, + EB_U32 componentMask) { - puWidth += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation - puHeight += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation - EB_U32 inPosx = (posX >> 2) - 4; // -4 to account for 8-tap interpolation - EB_U32 inPosy = (posY >> 2) - 4; // -4 to account for 8-tap interpolation - EB_U16 *ptr16; - - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - ptr16 = (EB_U16 *)refFramePic->bufferY + inPosx + inPosy*refFramePic->strideY; - - Extract8BitdataSafeSub( - ptr16, - refFramePic->strideY, - dst->bufferY, - dst->strideY, - puWidth, - puHeight - ); - } - - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - ptr16 = (EB_U16 *)refFramePic->bufferCb + (inPosx >> 1) + (inPosy >> 1) * refFramePic->strideCb; - - Extract8BitdataSafeSub( - ptr16, - refFramePic->strideCb, - dst->bufferCb, - dst->strideCb, - puWidth >> 1, - puHeight >> 1 - ); - - ptr16 = (EB_U16 *)refFramePic->bufferCr + (inPosx >> 1) + (inPosy >> 1) *refFramePic->strideCr; - - Extract8BitdataSafeSub( - ptr16, - refFramePic->strideCr, - dst->bufferCr, - dst->strideCr, - puWidth >> 1, - puHeight >> 1 - ); - } + puWidth += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation + puHeight += 8; // 4 + PU_WIDTH + 4 to account for 8-tap interpolation + EB_U32 inPosx = (posX >> 2) - 4; // -4 to account for 8-tap interpolation + EB_U32 inPosy = (posY >> 2) - 4; // -4 to account for 8-tap interpolation + EB_U16 *ptr16; + + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + ptr16 = (EB_U16 *)refFramePic->bufferY + inPosx + inPosy*refFramePic->strideY; + + Extract8BitdataSafeSub( + ptr16, + refFramePic->strideY, + dst->bufferY, + dst->strideY, + puWidth, + puHeight + ); + } + + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + ptr16 = (EB_U16 *)refFramePic->bufferCb + (inPosx >> 1) + (inPosy >> 1) * refFramePic->strideCb; + + Extract8BitdataSafeSub( + ptr16, + refFramePic->strideCb, + dst->bufferCb, + dst->strideCb, + puWidth >> 1, + puHeight >> 1 + ); + + ptr16 = (EB_U16 *)refFramePic->bufferCr + (inPosx >> 1) + (inPosy >> 1) *refFramePic->strideCr; + + Extract8BitdataSafeSub( + ptr16, + refFramePic->strideCr, + dst->bufferCr, + dst->strideCr, + puWidth >> 1, + puHeight >> 1 + ); + } } @@ -492,7 +492,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); EB_U32 puChromaOriginIndex = ((((puOriginY & (63)) * 32) + (puOriginX & (63))) >> 1); - + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; @@ -509,13 +509,13 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( // Setup List 0 if (candidateBufferPtr->candidatePtr->predictionDirection[puIndex] == UNI_PRED_LIST_0 || candidateBufferPtr->candidatePtr->predictionDirection[puIndex] == BI_PRED) { - + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; if (mdContextPtr->cuUseRefSrcFlag) refPicList0 = referenceObject->refDenSrcPicture; else - refPicList0 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture ; + refPicList0 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture ; motionVector_x = candidateBufferPtr->candidatePtr->motionVector_x_L0; @@ -552,7 +552,7 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( if (mdContextPtr->cuUseRefSrcFlag) refPicList1 = referenceObject->refDenSrcPicture; else - refPicList1 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture; + refPicList1 = is16bit ? referenceObject->referencePicture16bit : referenceObject->referencePicture; motionVector_x = candidateBufferPtr->candidatePtr->motionVector_x_L1; @@ -585,30 +585,30 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( case UNI_PRED_LIST_0: - if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { + if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { if (refPicList0) - UnPackReferenceBlock( - refPicList0, - refList0PosX, - refList0PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL0, - componentMask); - - UniPredHevcInterpolationMd( - contextPtr->mcpContext->localReferenceBlock8BITL0, - refList0PosX, - refList0PosY, - puWidth, - puHeight, - candidateBufferPtr->predictionPtr, - puOriginIndex, - puChromaOriginIndex, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, - contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, - EB_TRUE, - componentMask); + UnPackReferenceBlock( + refPicList0, + refList0PosX, + refList0PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL0, + componentMask); + + UniPredHevcInterpolationMd( + contextPtr->mcpContext->localReferenceBlock8BITL0, + refList0PosX, + refList0PosY, + puWidth, + puHeight, + candidateBufferPtr->predictionPtr, + puOriginIndex, + puChromaOriginIndex, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, + contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, + EB_TRUE, + componentMask); } else { @@ -633,30 +633,30 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( case UNI_PRED_LIST_1: - if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { + if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { if (refPicList1) - UnPackReferenceBlock( - refPicList1, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL1, - componentMask); - - UniPredHevcInterpolationMd( - contextPtr->mcpContext->localReferenceBlock8BITL1, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - candidateBufferPtr->predictionPtr, - puOriginIndex, - puChromaOriginIndex, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, - contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, - EB_TRUE, - componentMask); + UnPackReferenceBlock( + refPicList1, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL1, + componentMask); + + UniPredHevcInterpolationMd( + contextPtr->mcpContext->localReferenceBlock8BITL1, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + candidateBufferPtr->predictionPtr, + puOriginIndex, + puChromaOriginIndex, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, + contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, + EB_TRUE, + componentMask); } else { @@ -681,44 +681,44 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( case BI_PRED: - if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { + if (is16bit && mdContextPtr->cuUseRefSrcFlag == EB_FALSE) { if (refPicList0) - UnPackReferenceBlock( - refPicList0, - refList0PosX, - refList0PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL0, - componentMask); + UnPackReferenceBlock( + refPicList0, + refList0PosX, + refList0PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL0, + componentMask); if (refPicList1) - UnPackReferenceBlock( - refPicList1, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - contextPtr->mcpContext->localReferenceBlock8BITL1, - componentMask); - - BiPredHevcInterpolationMd( - contextPtr->mcpContext->localReferenceBlock8BITL0, - contextPtr->mcpContext->localReferenceBlock8BITL1, - refList0PosX, - refList0PosY, - refList1PosX, - refList1PosY, - puWidth, - puHeight, - candidateBufferPtr->predictionPtr, - puOriginIndex, - puChromaOriginIndex, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, - contextPtr->mcpContext->motionCompensationIntermediateResultBuf1, - contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, - EB_TRUE, - componentMask); + UnPackReferenceBlock( + refPicList1, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + contextPtr->mcpContext->localReferenceBlock8BITL1, + componentMask); + + BiPredHevcInterpolationMd( + contextPtr->mcpContext->localReferenceBlock8BITL0, + contextPtr->mcpContext->localReferenceBlock8BITL1, + refList0PosX, + refList0PosY, + refList1PosX, + refList1PosY, + puWidth, + puHeight, + candidateBufferPtr->predictionPtr, + puOriginIndex, + puChromaOriginIndex, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf0, + contextPtr->mcpContext->motionCompensationIntermediateResultBuf1, + contextPtr->mcpContext->TwoDInterpolationFirstPassFilterResultBuf, + EB_TRUE, + componentMask); } @@ -760,11 +760,11 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( * Inter Prediction used in the Encode Pass ***************************************************/ EB_ERRORTYPE EncodePassInterPrediction( - MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + MvUnit_t *mvUnit, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, @@ -774,10 +774,10 @@ EB_ERRORTYPE EncodePassInterPrediction( EbPictureBufferDesc_t *refPicList0 = 0; EbPictureBufferDesc_t *refPicList1 = 0; EbReferenceObject_t *referenceObject; - EB_U16 refList0PosX = 0; - EB_U16 refList0PosY = 0; - EB_U16 refList1PosX = 0; - EB_U16 refList1PosY = 0; + EB_U16 refList0PosX = 0; + EB_U16 refList0PosY = 0; + EB_U16 refList1PosX = 0; + EB_U16 refList1PosY = 0; EB_COLOR_FORMAT colorFormat=predictionPtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; @@ -786,7 +786,7 @@ EB_ERRORTYPE EncodePassInterPrediction( EB_U32 puOriginIndex = ((predictionPtr->originY +puOriginY) * predictionPtr->strideY) + (predictionPtr->originX+puOriginX); EB_U32 puChromaOriginIndex = (((predictionPtr->originY+puOriginY) * predictionPtr->strideCb) >> subHeightCMinus1) + ((predictionPtr->originX+puOriginX) >> subWidthCMinus1); SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; + EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; // Setup List 0 if(mvUnit->predDirection == UNI_PRED_LIST_0 || mvUnit->predDirection == BI_PRED) { @@ -809,12 +809,12 @@ EB_ERRORTYPE EncodePassInterPrediction( CHECK_REPORT_ERROR( (refList0PosX < ((refPicList0->width + (refPicList0->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); CHECK_REPORT_ERROR( (refList0PosY < ((refPicList0->height + (refPicList0->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); } @@ -845,12 +845,12 @@ EB_ERRORTYPE EncodePassInterPrediction( CHECK_REPORT_ERROR( (refList1PosX < ((refPicList1->width + (refPicList1->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); CHECK_REPORT_ERROR( (refList1PosY < ((refPicList1->height + (refPicList1->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_INVLD_MCP_ERROR); } @@ -914,7 +914,7 @@ EB_ERRORTYPE EncodePassInterPrediction( default: CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, + encodeContextPtr->appCallbackPtr, EB_ENC_INTER_PRED_ERROR0); break; } @@ -928,10 +928,10 @@ EB_ERRORTYPE EncodePassInterPrediction( ***************************************************/ EB_ERRORTYPE EncodePassInterPrediction16bit( MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, MotionCompensationPredictionContext_t *mcpContext) @@ -941,10 +941,10 @@ EB_ERRORTYPE EncodePassInterPrediction16bit( EbPictureBufferDesc_t *refPicList0 = 0; EbPictureBufferDesc_t *refPicList1 = 0; EbReferenceObject_t *referenceObject; - EB_U16 refList0PosX = 0; - EB_U16 refList0PosY = 0; - EB_U16 refList1PosX = 0; - EB_U16 refList1PosY = 0; + EB_U16 refList0PosX = 0; + EB_U16 refList0PosY = 0; + EB_U16 refList1PosX = 0; + EB_U16 refList1PosY = 0; const EB_COLOR_FORMAT colorFormat = predictionPtr->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; @@ -955,93 +955,93 @@ EB_ERRORTYPE EncodePassInterPrediction16bit( EB_U32 puChromaOriginIndex = ((predictionPtr->originX + puOriginX) >> subWidthCMinus1) + (((predictionPtr->originY+puOriginY) * predictionPtr->strideCb) >> subHeightCMinus1); SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; - - // Setup List 0 - if (mvUnit->predDirection == UNI_PRED_LIST_0 || mvUnit->predDirection == BI_PRED) { - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; - refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; - - // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 - //refList0PosX = (EB_U32) CLIP3((EB_S32)((refPicList0->originX-71) << 2), (EB_S32)((refPicList0->width + refPicList0->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList0->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_0][puIndex]); - refList0PosX = (EB_U32)CLIP3( - (EB_S32)((refPicList0->originX - 71) << 2), - (EB_S32)((refPicList0->width + refPicList0->originX + 7) << 2), - (EB_S32)((puOriginX + refPicList0->originX) << 2) + mvUnit->mv[REF_LIST_0].x); - //refList0PosY = (EB_U32) CLIP3((EB_S32)((refPicList0->originY-71) << 2),(EB_S32)((refPicList0->height + refPicList0->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList0->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_0][puIndex]); - refList0PosY = (EB_U32)CLIP3( - (EB_S32)((refPicList0->originY - 71) << 2), - (EB_S32)((refPicList0->height + refPicList0->originY + 7) << 2), - (EB_S32)((puOriginY + refPicList0->originY) << 2) + mvUnit->mv[REF_LIST_0].y); - - - CHECK_REPORT_ERROR( - (refList0PosX < ((refPicList0->width + (refPicList0->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - CHECK_REPORT_ERROR( - (refList0PosY < ((refPicList0->height + (refPicList0->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - EB_U32 lumaOffSet = ((refList0PosX >> 2) - 4) * 2 + ((refList0PosY >> 2) - 4) * 2 * refPicList0->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // - EB_U32 cbOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCb; //Jing:double check for 444 - EB_U32 crOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCr; - //EB_U8 verticalIdx; - - mcpContext->localReferenceBlockL0->bufferY = refPicList0->bufferY + lumaOffSet; - mcpContext->localReferenceBlockL0->bufferCb = refPicList0->bufferCb + cbOffset; - mcpContext->localReferenceBlockL0->bufferCr = refPicList0->bufferCr + crOffset; - mcpContext->localReferenceBlockL0->strideY = refPicList0->strideY; - mcpContext->localReferenceBlockL0->strideCb = refPicList0->strideCb; - mcpContext->localReferenceBlockL0->strideCr = refPicList0->strideCr; - } - - // Setup List 1 - if (mvUnit->predDirection == UNI_PRED_LIST_1 || mvUnit->predDirection == BI_PRED) { - - referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; - refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; - - // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 - //refList1PosX = (EB_U32) CLIP3((EB_S32)((refPicList1->originX-71) << 2), (EB_S32)((refPicList1->width + refPicList1->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList1->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_1][puIndex]); - refList1PosX = (EB_U32)CLIP3( - (EB_S32)((refPicList1->originX - 71) << 2), - (EB_S32)((refPicList1->width + refPicList1->originX + 7) << 2), - (EB_S32)((puOriginX + refPicList1->originX) << 2) + mvUnit->mv[REF_LIST_1].x); - //refList1PosY = (EB_U32) CLIP3((EB_S32)((refPicList1->originY-71) << 2), (EB_S32)((refPicList1->height + refPicList1->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList1->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_1][puIndex]); - refList1PosY = (EB_U32)CLIP3( - (EB_S32)((refPicList1->originY - 71) << 2), - (EB_S32)((refPicList1->height + refPicList1->originY + 7) << 2), - (EB_S32)((puOriginY + refPicList1->originY) << 2) + mvUnit->mv[REF_LIST_1].y); - - CHECK_REPORT_ERROR( - (refList1PosX < ((refPicList1->width + (refPicList1->originX << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - CHECK_REPORT_ERROR( - (refList1PosY < ((refPicList1->height + (refPicList1->originY << 1)) << 2)), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_INVLD_MCP_ERROR); - - //mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; - //mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCb; - //mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCr; - EB_U32 lumaOffSet = ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // - EB_U32 cbOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCb; - EB_U32 crOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCr; - //EB_U8 verticalIdx; - - mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + lumaOffSet; - mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + cbOffset; - mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + crOffset; - - mcpContext->localReferenceBlockL1->strideY = refPicList1->strideY; - mcpContext->localReferenceBlockL1->strideCb = refPicList1->strideCb; - mcpContext->localReferenceBlockL1->strideCr = refPicList1->strideCr; - } + EncodeContext_t *encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; + + // Setup List 0 + if (mvUnit->predDirection == UNI_PRED_LIST_0 || mvUnit->predDirection == BI_PRED) { + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; + refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; + + // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 + //refList0PosX = (EB_U32) CLIP3((EB_S32)((refPicList0->originX-71) << 2), (EB_S32)((refPicList0->width + refPicList0->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList0->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_0][puIndex]); + refList0PosX = (EB_U32)CLIP3( + (EB_S32)((refPicList0->originX - 71) << 2), + (EB_S32)((refPicList0->width + refPicList0->originX + 7) << 2), + (EB_S32)((puOriginX + refPicList0->originX) << 2) + mvUnit->mv[REF_LIST_0].x); + //refList0PosY = (EB_U32) CLIP3((EB_S32)((refPicList0->originY-71) << 2),(EB_S32)((refPicList0->height + refPicList0->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList0->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_0][puIndex]); + refList0PosY = (EB_U32)CLIP3( + (EB_S32)((refPicList0->originY - 71) << 2), + (EB_S32)((refPicList0->height + refPicList0->originY + 7) << 2), + (EB_S32)((puOriginY + refPicList0->originY) << 2) + mvUnit->mv[REF_LIST_0].y); + + + CHECK_REPORT_ERROR( + (refList0PosX < ((refPicList0->width + (refPicList0->originX << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + CHECK_REPORT_ERROR( + (refList0PosY < ((refPicList0->height + (refPicList0->originY << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + EB_U32 lumaOffSet = ((refList0PosX >> 2) - 4) * 2 + ((refList0PosY >> 2) - 4) * 2 * refPicList0->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // + EB_U32 cbOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCb; //Jing:double check for 444 + EB_U32 crOffset = ((refList0PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList0PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList0->strideCr; + //EB_U8 verticalIdx; + + mcpContext->localReferenceBlockL0->bufferY = refPicList0->bufferY + lumaOffSet; + mcpContext->localReferenceBlockL0->bufferCb = refPicList0->bufferCb + cbOffset; + mcpContext->localReferenceBlockL0->bufferCr = refPicList0->bufferCr + crOffset; + mcpContext->localReferenceBlockL0->strideY = refPicList0->strideY; + mcpContext->localReferenceBlockL0->strideCb = refPicList0->strideCb; + mcpContext->localReferenceBlockL0->strideCr = refPicList0->strideCr; + } + + // Setup List 1 + if (mvUnit->predDirection == UNI_PRED_LIST_1 || mvUnit->predDirection == BI_PRED) { + + referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; + refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; + + // minus 71 is derived from the expression -64 + 1 - 8, and plus 7 is derived from expression -1 + 8 + //refList1PosX = (EB_U32) CLIP3((EB_S32)((refPicList1->originX-71) << 2), (EB_S32)((refPicList1->width + refPicList1->originX + 7)<<2) , (EB_S32) ((puOriginX + tbOriginX + refPicList1->originX)<<2) + candidateBufferPtr->candidatePtr->motionVector_x[REF_LIST_1][puIndex]); + refList1PosX = (EB_U32)CLIP3( + (EB_S32)((refPicList1->originX - 71) << 2), + (EB_S32)((refPicList1->width + refPicList1->originX + 7) << 2), + (EB_S32)((puOriginX + refPicList1->originX) << 2) + mvUnit->mv[REF_LIST_1].x); + //refList1PosY = (EB_U32) CLIP3((EB_S32)((refPicList1->originY-71) << 2), (EB_S32)((refPicList1->height + refPicList1->originY + 7)<<2) , (EB_S32) ((puOriginY + tbOriginY + refPicList1->originY)<<2) + candidateBufferPtr->candidatePtr->motionVector_y[REF_LIST_1][puIndex]); + refList1PosY = (EB_U32)CLIP3( + (EB_S32)((refPicList1->originY - 71) << 2), + (EB_S32)((refPicList1->height + refPicList1->originY + 7) << 2), + (EB_S32)((puOriginY + refPicList1->originY) << 2) + mvUnit->mv[REF_LIST_1].y); + + CHECK_REPORT_ERROR( + (refList1PosX < ((refPicList1->width + (refPicList1->originX << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + CHECK_REPORT_ERROR( + (refList1PosY < ((refPicList1->height + (refPicList1->originY << 1)) << 2)), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_INVLD_MCP_ERROR); + + //mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; + //mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCb; + //mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + ((refList1PosX >> 3) - 2) * 2 + ((refList1PosY >> 3) - 2) * 2 * refPicList1->strideCr; + EB_U32 lumaOffSet = ((refList1PosX >> 2) - 4) * 2 + ((refList1PosY >> 2) - 4) * 2 * refPicList1->strideY; //refPicList0->originX + refPicList0->originY*refPicList0->strideY; // + EB_U32 cbOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCb; + EB_U32 crOffset = ((refList1PosX >> (2 + subWidthCMinus1)) - 2) * 2 + ((refList1PosY >> (2 + subHeightCMinus1)) - 2) * 2 * refPicList1->strideCr; + //EB_U8 verticalIdx; + + mcpContext->localReferenceBlockL1->bufferY = refPicList1->bufferY + lumaOffSet; + mcpContext->localReferenceBlockL1->bufferCb = refPicList1->bufferCb + cbOffset; + mcpContext->localReferenceBlockL1->bufferCr = refPicList1->bufferCr + crOffset; + + mcpContext->localReferenceBlockL1->strideY = refPicList1->strideY; + mcpContext->localReferenceBlockL1->strideCb = refPicList1->strideCb; + mcpContext->localReferenceBlockL1->strideCr = refPicList1->strideCr; + } switch(mvUnit->predDirection) { @@ -1103,9 +1103,9 @@ EB_ERRORTYPE EncodePassInterPrediction16bit( break; default: - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_INTER_PRED_ERROR0); + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_INTER_PRED_ERROR0); break; } diff --git a/Source/Lib/Codec/EbInterPrediction.h b/Source/Lib/Codec/EbInterPrediction.h index 16167cb0d..2cfb22cd6 100644 --- a/Source/Lib/Codec/EbInterPrediction.h +++ b/Source/Lib/Codec/EbInterPrediction.h @@ -22,14 +22,14 @@ extern "C" { #define MVBOUNDHIGH 348 // (80+7)<<2 #define REFPADD_QPEL 320 // (16+64)<<2 - void RoundMvOnTheFly( - EB_S16 *motionVector_x, - EB_S16 *motionVector_y); + void RoundMvOnTheFly( + EB_S16 *motionVector_x, + EB_S16 *motionVector_y); struct ModeDecisionContext_s; typedef struct InterPredictionContext_s { - + // mcp context MotionCompensationPredictionContext_t *mcpContext; @@ -40,8 +40,8 @@ typedef struct InterPredictionContext_s { } InterPredictionContext_t; extern EB_ERRORTYPE InterPredictionContextCtor( - InterPredictionContext_t **interPredictionContext, - EB_U16 maxCUWidth, + InterPredictionContext_t **interPredictionContext, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit); @@ -50,10 +50,10 @@ extern EB_ERRORTYPE InterPredictionContextDtor( InterPredictionContext_t *interPredictionContext); extern EB_ERRORTYPE Inter2Nx2NPuPredictionInterpolationFree( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr); EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( struct ModeDecisionContext_s *contextPtr, @@ -65,20 +65,20 @@ EB_ERRORTYPE Inter2Nx2NPuPredictionHevc( extern EB_ERRORTYPE EncodePassInterPrediction( MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, MotionCompensationPredictionContext_t *mcpContext); extern EB_ERRORTYPE EncodePassInterPrediction16bit( MvUnit_t *mvUnit, - EB_U16 puOriginX, - EB_U16 puOriginY, - EB_U8 puWidth, - EB_U8 puHeight, + EB_U16 puOriginX, + EB_U16 puOriginY, + EB_U8 puWidth, + EB_U8 puHeight, PictureControlSet_t *pictureControlSetPtr, EbPictureBufferDesc_t *predictionPtr, MotionCompensationPredictionContext_t *mcpContext); diff --git a/Source/Lib/Codec/EbIntraPrediction.c b/Source/Lib/Codec/EbIntraPrediction.c index 3905e21e9..1c5cc878d 100644 --- a/Source/Lib/Codec/EbIntraPrediction.c +++ b/Source/Lib/Codec/EbIntraPrediction.c @@ -383,7 +383,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( } // Top Block Loop - reconArrayIndex = originX; + reconArrayIndex = originX; while(blockIndex < topBlockEnd && neighborAvailable == EB_FALSE) { modeArrayIndex = GetNeighborArrayUnitTopIndex( @@ -543,7 +543,7 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( } // Top Block Loop - reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; + reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; while(blockIndex < topBlockEnd) { modeArrayIndex = GetNeighborArrayUnitTopIndex( @@ -562,9 +562,9 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( if(neighborAvailable == EB_TRUE) { - EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); - EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); - EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); + EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); + EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex >> subWidthCMinus1], MIN_PU_SIZE >> subWidthCMinus1); // Set pad value (end of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; @@ -675,8 +675,8 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( */ //Luma - EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); - EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); sampleWriteLoc = yBorderReverse + (size<<1) - 1 ; sampleWriteLocFilt = yBorderFiltReverse + (size<<1) - 1 ; @@ -689,8 +689,8 @@ EB_ERRORTYPE GenerateIntraReferenceSamplesEncodePass( } //Chroma - EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); - EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); sampleWriteLocCb = cbBorderReverse + (puChromaSize<<1) - 1 ; sampleWriteLocCr = crBorderReverse + (puChromaSize<<1) - 1 ; @@ -1051,7 +1051,7 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( if(neighborAvailable == EB_TRUE) { // Copy samples in reverse order - EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EB_MEMCPY(lumaWritePtr, &topLumaReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); // Set pad value (end of block) lumaPadValue = topLumaReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; @@ -1150,8 +1150,8 @@ EB_ERRORTYPE GenerateLumaIntraReferenceSamplesEncodePass( junk */ - EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); - EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); + EB_MEMCPY(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); sampleWriteLoc = yBorderReverse + (size<<1) - 1 ; sampleWriteLocFilt = yBorderFiltReverse + (size<<1) - 1 ; @@ -1546,8 +1546,8 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( if(neighborAvailable == EB_TRUE) { - EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); - EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EB_MEMCPY(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EB_MEMCPY(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); // Set pad value (end of block) cbPadValue = topCbReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; @@ -1615,8 +1615,8 @@ EB_ERRORTYPE GenerateChromaIntraReferenceSamplesEncodePass( junk */ - EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); - EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + EB_MEMCPY(cbBorderReverse + (puChromaSize<<1), cbBorder + (puChromaSize<<1), (puChromaSize<<1)+1); + EB_MEMCPY(crBorderReverse + (puChromaSize<<1), crBorder + (puChromaSize<<1), (puChromaSize<<1)+1); sampleWriteLocCb = cbBorderReverse + (puChromaSize << 1) - 1 ; sampleWriteLocCr = crBorderReverse + (puChromaSize << 1) - 1 ; @@ -2021,7 +2021,7 @@ EB_ERRORTYPE GenerateIntraReference16bitSamplesEncodePass( } // Top Block Loop - reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; + reconArrayIndex = originX + (blockIndex - topLeftBlockEnd) * MIN_PU_SIZE; while(blockIndex < topBlockEnd) { modeArrayIndex = GetNeighborArrayUnitTopIndex( @@ -2628,8 +2628,8 @@ EB_ERRORTYPE GenerateLumaIntraReference16bitSamplesEncodePass( junk */ - EbHevcMemcpy16bit(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); - EbHevcMemcpy16bit(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); + EbHevcMemcpy16bit(yBorderReverse + (size<<1), yBorder + (size<<1), (size<<1)+1); + EbHevcMemcpy16bit(yBorderFiltReverse + (size<<1), yBorderFilt + (size<<1), (size<<1)+1); sampleWriteLoc = yBorderReverse + (size<<1) - 1 ; sampleWriteLocFilt = yBorderFiltReverse + (size<<1) - 1 ; @@ -3030,8 +3030,8 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( if(neighborAvailable == EB_TRUE) { - EbHevcMemcpy16bit(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); - EbHevcMemcpy16bit(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EbHevcMemcpy16bit(cbWritePtr, &topCbReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); + EbHevcMemcpy16bit(crWritePtr, &topCrReconNeighborArray[reconArrayIndex], MIN_PU_SIZE); // Set pad value (end of block) cbPadValue = topCbReconNeighborArray[reconArrayIndex + MIN_PU_SIZE - 1]; @@ -3104,8 +3104,8 @@ EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( junk */ - EbHevcMemcpy16bit(cbBorderReverse + (puChromaSize << 1), cbBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); - EbHevcMemcpy16bit(crBorderReverse + (puChromaSize << 1), crBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); + EbHevcMemcpy16bit(cbBorderReverse + (puChromaSize << 1), cbBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); + EbHevcMemcpy16bit(crBorderReverse + (puChromaSize << 1), crBorder + (puChromaSize << 1), (puChromaSize << 1) + 1); sampleWriteLocCb = cbBorderReverse + (puChromaSize<<1) - 1 ; sampleWriteLocCr = crBorderReverse + (puChromaSize<<1) - 1 ; @@ -3150,7 +3150,7 @@ static void IntraModeAngular_27To33( EB_S32 intraPredAngle = intraModeAngularTable[mode - INTRA_VERTICAL_MODE]; refSampMain = refSamples + (size << 1); - IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( size, refSampMain, predictionPtr, @@ -3206,10 +3206,10 @@ static void IntraModeAngular_19To25( EB_S32 idx; EB_U32 index; - if (INTRA_VERTICAL_MODE - mode < 9 ) { // check for index range, has to be less than size of array - intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; - invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; - } + if (INTRA_VERTICAL_MODE - mode < 9 ) { // check for index range, has to be less than size of array + intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; + invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; + } //We just need to copy above Reference pixels only for ONE TIME for all modes of this group //where Filtered or non-Filtered are always used (8x8,32x32) @@ -3233,7 +3233,7 @@ static void IntraModeAngular_19To25( } - IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraAngVertical_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( size, refSampMain, predictionPtr, @@ -3268,9 +3268,9 @@ static void IntraModeAngular16bit_19To25( EB_U32 index; if (INTRA_VERTICAL_MODE - mode < 9) { // check for index range, has to be less than size of array - intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; - invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; - } + intraPredAngle = intraModeAngularTableNegative[INTRA_VERTICAL_MODE - mode]; + invAngle = invIntraModeAngularTable[INTRA_VERTICAL_MODE - mode]; + } //We just need to copy above Reference pixels only for ONE TIME for all modes of this group //where Filtered or non-Filtered are always used (8x8,32x32) @@ -3294,7 +3294,7 @@ static void IntraModeAngular16bit_19To25( } - IntraAngVertical_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraAngVertical_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( size, refSampMain, predictionPtr, @@ -3351,7 +3351,7 @@ static void IntraModeAngular_11To17( } - IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( size, refSampMain, predictionPtr, @@ -3433,7 +3433,7 @@ static void IntraModeAngular_3To9( refSampMain = refSamples-1; - IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraAngHorizontal_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( size, refSampMain, predictionPtr, @@ -3460,7 +3460,7 @@ static void IntraModeAngular16bit_3To9( refSampMain = refSamples-1; - IntraAngHorizontal_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraAngHorizontal_16bit_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( size, refSampMain, predictionPtr, @@ -3642,22 +3642,22 @@ static inline void IntraModeAngular16bit_all( is the main function to compute intra prediction for a PU */ EB_ERRORTYPE IntraPredictionCl( - ModeDecisionContext_t *mdContextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr) + ModeDecisionContext_t *mdContextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; const EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; EB_U32 chromaMode; - const EB_U32 puOriginX = mdContextPtr->cuOriginX; - const EB_U32 puOriginY = mdContextPtr->cuOriginY; - const EB_U32 puWidth = mdContextPtr->cuStats->size; - const EB_U32 puHeight = mdContextPtr->cuStats->size; + const EB_U32 puOriginX = mdContextPtr->cuOriginX; + const EB_U32 puOriginY = mdContextPtr->cuOriginY; + const EB_U32 puWidth = mdContextPtr->cuStats->size; + const EB_U32 puHeight = mdContextPtr->cuStats->size; - IntraReferenceSamples_t * const contextPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); - const EncodeContext_t * const encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + IntraReferenceSamples_t * const contextPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); + const EncodeContext_t * const encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; // Map the mode to the function table index EB_U32 funcIndex = @@ -3682,21 +3682,21 @@ EB_ERRORTYPE IntraPredictionCl( CHECK_REPORT_ERROR( - (puWidth == puHeight), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTRA_PRED_ERROR2); + (puWidth == puHeight), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTRA_PRED_ERROR2); - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) - { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) + { + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraLumaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); - } + GenerateIntraLumaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); + } puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); puSize = puWidth; @@ -3714,7 +3714,7 @@ EB_ERRORTYPE IntraPredictionCl( yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -3792,15 +3792,15 @@ EB_ERRORTYPE IntraPredictionCl( if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) - { + if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) + { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraChromaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + GenerateIntraChromaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); - } + } // The chromaMode is always DM chromaMode = (EB_U32) lumaMode; @@ -3818,7 +3818,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -3828,7 +3828,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3852,7 +3852,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3866,7 +3866,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -3876,7 +3876,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3890,7 +3890,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -3900,7 +3900,7 @@ EB_ERRORTYPE IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -3969,7 +3969,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( EB_U32 chromaMode; IntraReferenceSamples_t *contextPtr = (IntraReferenceSamples_t*)(((ModeDecisionContext_t*)predictionContextPtr)->intraRefPtr); - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; // Map the mode to the function table index EB_U32 funcIndex = @@ -3994,9 +3994,9 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( (void)pictureControlSetPtr; CHECK_REPORT_ERROR( - (puWidth == puHeight), - encodeContextPtr->appCallbackPtr, - EB_ENC_INTRA_PRED_ERROR2); + (puWidth == puHeight), + encodeContextPtr->appCallbackPtr, + EB_ENC_INTRA_PRED_ERROR2); if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { @@ -4019,7 +4019,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4032,7 +4032,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( yIntraReferenceArray = contextPtr->yIntraReferenceArrayReverse; - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4047,7 +4047,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( contextPtr->yIntraReferenceArrayReverse; - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4060,7 +4060,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( yIntraReferenceArray = (diffMode > intraLumaFilterTable[Log2f(puWidth)-2])? contextPtr->yIntraFilteredReferenceArrayReverse : contextPtr->yIntraReferenceArrayReverse; - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, yIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4114,7 +4114,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -4124,7 +4124,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4138,7 +4138,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -4148,7 +4148,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArray, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4162,7 +4162,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -4172,7 +4172,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4186,7 +4186,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cb Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->cbIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), @@ -4196,7 +4196,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( // Cr Intra Prediction if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( chromaPuSize, contextPtr->crIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), @@ -4249,14 +4249,14 @@ EB_ERRORTYPE Intra4x4IntraPredictionCl( } EB_ERRORTYPE Intra4x4IntraPredictionOl( - EB_U32 puIndex, + EB_U32 puIndex, EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, EB_U32 lcuSize, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, ModeDecisionCandidateBuffer_t *candidateBufferPtr, EB_PTR predictionContextPtr) { @@ -4272,18 +4272,18 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( (openLoopIntraCandidateIndex == INTRA_HORIZONTAL_MODE) ? 3 : 4; - IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(((ModeDecisionContext_t*)predictionContextPtr)->intraRefPtr); + IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(((ModeDecisionContext_t*)predictionContextPtr)->intraRefPtr); (void) puHeight; - (void) componentMask; - (void) pictureControlSetPtr; - (void) puIndex; + (void) componentMask; + (void) pictureControlSetPtr; + (void) puIndex; switch(funcIndex) { case 0: - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4294,7 +4294,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( case 1: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4305,7 +4305,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( case 2: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4316,7 +4316,7 @@ EB_ERRORTYPE Intra4x4IntraPredictionOl( case 3: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), @@ -4407,7 +4407,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( switch(lumaMode) { case EB_INTRA_PLANAR: - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4417,7 +4417,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_DC: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4427,7 +4427,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_VERTICAL: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4437,7 +4437,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( break; case EB_INTRA_HORIZONTAL: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, yIntraReferenceArrayReverse, predictionPtr->bufferY + lumaOffset, @@ -4510,7 +4510,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( switch(chromaModeAdj) { case EB_INTRA_PLANAR: // Cb Intra Prediction - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, @@ -4518,7 +4518,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( EB_FALSE); // Cr Intra Prediction - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4530,7 +4530,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( case EB_INTRA_VERTICAL: // Cb Intra Prediction - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, @@ -4538,7 +4538,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( EB_FALSE); // Cr Intra Prediction - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4550,7 +4550,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( case EB_INTRA_HORIZONTAL: // Cb Intra Prediction - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, @@ -4559,7 +4559,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( // Cr Intra Prediction - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4571,7 +4571,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( case EB_INTRA_DC: // Cb Intra Prediction - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, cbIntraReferenceArrayReverse, predictionPtr->bufferCb + chromaOffset, @@ -4580,7 +4580,7 @@ EB_ERRORTYPE EncodePassIntraPrediction( // Cr Intra Prediction - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puChromaSize, crIntraReferenceArrayReverse, predictionPtr->bufferCr + chromaOffset, @@ -4930,14 +4930,14 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( EB_U8 *yBorderReverse = intraRefPtr->yIntraReferenceArrayReverse; EB_U8 *yBorder = intraRefPtr->yIntraReferenceArray; EB_U8 *yBorderLoc; - EB_U32 width = inputPtr->width; - EB_U32 height = inputPtr->height; - EB_U32 blockSizeHalf = blockSize << 1; + EB_U32 width = inputPtr->width; + EB_U32 height = inputPtr->height; + EB_U32 blockSizeHalf = blockSize << 1; const EB_BOOL pictureLeftBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureLeftEdgeFlag == EB_TRUE && (srcOriginX & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; const EB_BOOL pictureTopBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureTopEdgeFlag == EB_TRUE && (srcOriginY & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; // Adjust the Source ptr to start at the origin of the block being updated - srcPtr = inputPtr->bufferY + (((srcOriginY + inputPtr->originY) * stride) + (srcOriginX + inputPtr->originX)); + srcPtr = inputPtr->bufferY + (((srcOriginY + inputPtr->originY) * stride) + (srcOriginX + inputPtr->originX)); // Adjust the Destination ptr to start at the origin of the Intra reference array dstPtr = yBorderReverse; @@ -4983,7 +4983,7 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( readPtr = srcPtr - stride; count = ((srcOriginX + count) > width) ? count - ((srcOriginX + count) - width) : count; - EB_MEMCPY(dstPtr, readPtr, count); + EB_MEMCPY(dstPtr, readPtr, count); dstPtr += (blockSizeHalf - count); } else { @@ -5010,7 +5010,7 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOL( junk */ - EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); yBorderLoc = yBorder + blockSizeHalf - 1 ; for(count = 0; count< blockSizeHalf; count++){ @@ -5043,43 +5043,43 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( EB_U8 *cbDstPtr; EB_U8 *cbReadPtr; - EB_U8 *crSrcPtr; + EB_U8 *crSrcPtr; EB_U8 *crDstPtr; EB_U8 *crReadPtr; EB_U32 count; EB_U8 *cbBorderReverse = intraRefPtr->cbIntraReferenceArrayReverse; - EB_U8 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; + EB_U8 *crBorderReverse = intraRefPtr->crIntraReferenceArrayReverse; EB_U8 *cbBorder = intraRefPtr->cbIntraReferenceArray; - EB_U8 *crBorder = intraRefPtr->crIntraReferenceArray; + EB_U8 *crBorder = intraRefPtr->crIntraReferenceArray; EB_U8 *cbBorderLoc; - EB_U8 *crBorderLoc; - EB_U32 width = inputPtr->width >> 1; - EB_U32 height = inputPtr->height >> 1; - EB_U32 blockSizeHalf = blockSize << 1; + EB_U8 *crBorderLoc; + EB_U32 width = inputPtr->width >> 1; + EB_U32 height = inputPtr->height >> 1; + EB_U32 blockSizeHalf = blockSize << 1; const EB_BOOL pictureLeftBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureLeftEdgeFlag == EB_TRUE && (srcOriginX & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; const EB_BOOL pictureTopBoundary = (lcuPtr->lcuEdgeInfoPtr->pictureTopEdgeFlag == EB_TRUE && (srcOriginY & (lcuPtr->size - 1)) == 0) ? EB_TRUE : EB_FALSE; // Adjust the Source ptr to start at the origin of the block being updated - cbSrcPtr = inputPtr->bufferCb + (((cuChromaOriginY + (inputPtr->originY >> 1)) * cbStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); - crSrcPtr = inputPtr->bufferCr + (((cuChromaOriginY + (inputPtr->originY >> 1)) * crStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); + cbSrcPtr = inputPtr->bufferCb + (((cuChromaOriginY + (inputPtr->originY >> 1)) * cbStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); + crSrcPtr = inputPtr->bufferCr + (((cuChromaOriginY + (inputPtr->originY >> 1)) * crStride) + (cuChromaOriginX + (inputPtr->originX >> 1))); // Adjust the Destination ptr to start at the origin of the Intra reference array - cbDstPtr = cbBorderReverse; + cbDstPtr = cbBorderReverse; crDstPtr = crBorderReverse; //Initialise the Luma Intra Reference Array to the mid range value 128 (for CUs at the picture boundaries) - EB_MEMSET(cbDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); - EB_MEMSET(crDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); + EB_MEMSET(cbDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); + EB_MEMSET(crDstPtr, MIDRANGE_VALUE_8BIT, (blockSize << 2) + 1); - (void)stride; + (void)stride; // Get the left-column count = blockSizeHalf; if (pictureLeftBoundary == EB_FALSE) { cbReadPtr = cbSrcPtr - 1; - crReadPtr = crSrcPtr - 1; + crReadPtr = crSrcPtr - 1; count = ((cuChromaOriginY + count) > height) ? count - ((cuChromaOriginY + count) - height) : count; for(idx = 0; idx < count; ++idx) { @@ -5088,17 +5088,17 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( cbReadPtr += cbStride; cbDstPtr ++; - *crDstPtr = *crReadPtr; + *crDstPtr = *crReadPtr; crReadPtr += crStride; crDstPtr ++; } cbDstPtr += (blockSizeHalf- count); - crDstPtr += (blockSizeHalf- count); + crDstPtr += (blockSizeHalf- count); } else { - cbDstPtr += count; + cbDstPtr += count; crDstPtr += count; } @@ -5108,13 +5108,13 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( *cbDstPtr = *cbReadPtr; cbDstPtr ++; - crReadPtr = crSrcPtr - crStride- 1 ; + crReadPtr = crSrcPtr - crStride- 1 ; *crDstPtr = *crReadPtr; crDstPtr ++; } else { cbDstPtr ++; - crDstPtr ++; + crDstPtr ++; } // Get the top-row @@ -5124,12 +5124,12 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( cbReadPtr = cbSrcPtr - cbStride; count = ((cuChromaOriginX + count) > width) ? count - ((cuChromaOriginX + count) - width) : count; - EB_MEMCPY(cbDstPtr, cbReadPtr, count); + EB_MEMCPY(cbDstPtr, cbReadPtr, count); cbDstPtr += (blockSizeHalf - count); - crReadPtr = crSrcPtr - crStride; - EB_MEMCPY(crDstPtr, crReadPtr, count); + crReadPtr = crSrcPtr - crStride; + EB_MEMCPY(crDstPtr, crReadPtr, count); crDstPtr += (blockSizeHalf - count); } else { @@ -5142,7 +5142,7 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( intraRefPtr->AboveReadyFlagCb = EB_FALSE; intraRefPtr->LeftReadyFlagCb = EB_FALSE; - intraRefPtr->AboveReadyFlagCr = EB_FALSE; + intraRefPtr->AboveReadyFlagCr = EB_FALSE; intraRefPtr->LeftReadyFlagCr = EB_FALSE; //For SIMD purposes, provide a copy of the reference buffer with reverse order of Left samples @@ -5159,17 +5159,17 @@ EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( junk */ - EB_MEMCPY(cbBorder + blockSizeHalf, cbBorderReverse + blockSizeHalf, blockSizeHalf + 1); - EB_MEMCPY(crBorder + blockSizeHalf, crBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(cbBorder + blockSizeHalf, cbBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(crBorder + blockSizeHalf, crBorderReverse + blockSizeHalf, blockSizeHalf + 1); cbBorderLoc = cbBorder + blockSizeHalf - 1 ; - crBorderLoc = crBorder + blockSizeHalf - 1 ; + crBorderLoc = crBorder + blockSizeHalf - 1 ; for(count = 0; count< blockSizeHalf; count++){ *cbBorderLoc = cbBorderReverse[count]; cbBorderLoc--; - *crBorderLoc = crBorderReverse[count]; + *crBorderLoc = crBorderReverse[count]; crBorderLoc--; } @@ -5201,9 +5201,9 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( EB_U8 *yBorder = intraRefPtr->yIntraReferenceArray; EB_U8 *yBorderLoc; - EB_U32 width = inputPtr->width; - EB_U32 height = inputPtr->height; - EB_U32 blockSizeHalf = blockSize << 1; + EB_U32 width = inputPtr->width; + EB_U32 height = inputPtr->height; + EB_U32 blockSizeHalf = blockSize << 1; // Adjust the Source ptr to start at the origin of the block being updated srcPtr = inputPtr->bufferY + (((srcOriginY + inputPtr->originY) * stride) + (srcOriginX + inputPtr->originX)); @@ -5254,7 +5254,7 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( readPtr = srcPtr - stride; count = ((srcOriginX + count) > width) ? count - ((srcOriginX + count) - width) : count; - EB_MEMCPY(dstPtr, readPtr, count); + EB_MEMCPY(dstPtr, readPtr, count); dstPtr += (blockSizeHalf - count); } else { @@ -5281,7 +5281,7 @@ EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( junk */ - EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); + EB_MEMCPY(yBorder + blockSizeHalf, yBorderReverse + blockSizeHalf, blockSizeHalf + 1); yBorderLoc = yBorder + blockSizeHalf - 1 ; for(count = 0; countintraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5326,7 +5326,7 @@ EB_ERRORTYPE IntraPredictionOpenLoop( case 1: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( cuSize, contextPtr->intraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5337,7 +5337,7 @@ EB_ERRORTYPE IntraPredictionOpenLoop( case 2: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( cuSize, contextPtr->intraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5348,7 +5348,7 @@ EB_ERRORTYPE IntraPredictionOpenLoop( case 3: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( cuSize, contextPtr->intraRefPtr->yIntraReferenceArrayReverse, (&(contextPtr->meContextPtr->lcuBuffer[0])), @@ -5385,19 +5385,19 @@ EB_ERRORTYPE IntraPredictionOpenLoop( performs Open-loop Intra candidate Search for a CU */ EB_ERRORTYPE IntraPredictionOl( - ModeDecisionContext_t *mdContextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr) + ModeDecisionContext_t *mdContextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr) { EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 puOriginX = mdContextPtr->cuOriginX; - EB_U32 puOriginY = mdContextPtr->cuOriginY; - EB_U32 puWidth = mdContextPtr->cuStats->size; - EB_U32 puHeight = mdContextPtr->cuStats->size; - const EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); + EB_U32 puOriginX = mdContextPtr->cuOriginX; + EB_U32 puOriginY = mdContextPtr->cuOriginY; + EB_U32 puWidth = mdContextPtr->cuStats->size; + EB_U32 puHeight = mdContextPtr->cuStats->size; + const EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); EB_U32 openLoopIntraCandidateIndex = candidateBufferPtr->candidatePtr->intraLumaMode; @@ -5411,251 +5411,251 @@ EB_ERRORTYPE IntraPredictionOl( (openLoopIntraCandidateIndex == INTRA_HORIZONTAL_MODE) ? 3 : 4; - IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); + IntraReferenceSamples_t *intraRefPtr = (IntraReferenceSamples_t*)(mdContextPtr->intraRefPtr); (void) puHeight; - (void) pictureControlSetPtr; - (void) puIndex; + (void) pictureControlSetPtr; + (void) puIndex; - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) - { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + if (mdContextPtr->lumaIntraRefSamplesGenDone == EB_FALSE) + { + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraLumaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); - } + GenerateIntraLumaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); + } - switch (funcIndex) { + switch (funcIndex) { - case 0: + case 0: - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 1: + case 1: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 2: + case 2: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 3: + case 3: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puSize, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - EB_FALSE); + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puSize, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + EB_FALSE); - break; + break; - case 4: + case 4: - IntraModeAngular_all( - openLoopIntraCandidateIndex, - puSize, - intraRefPtr->yIntraReferenceArray, - intraRefPtr->yIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), - 64, - intraRefPtr->ReferenceAboveLineY, - &intraRefPtr->AboveReadyFlagY, - intraRefPtr->ReferenceLeftLineY, - &intraRefPtr->LeftReadyFlagY); + IntraModeAngular_all( + openLoopIntraCandidateIndex, + puSize, + intraRefPtr->yIntraReferenceArray, + intraRefPtr->yIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferY[puOriginIndex]), + 64, + intraRefPtr->ReferenceAboveLineY, + &intraRefPtr->AboveReadyFlagY, + intraRefPtr->ReferenceLeftLineY, + &intraRefPtr->LeftReadyFlagY); - break; + break; - default: - break; - } - } + default: + break; + } + } - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) - { + if (mdContextPtr->chromaIntraRefSamplesGenDone == EB_FALSE) + { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; - GenerateIntraChromaReferenceSamplesMd( - mdContextPtr, - inputPicturePtr); + GenerateIntraChromaReferenceSamplesMd( + mdContextPtr, + inputPicturePtr); - } + } - // The chromaMode is always DM - EB_U32 chromaMode = (EB_U32)openLoopIntraCandidateIndex; + // The chromaMode is always DM + EB_U32 chromaMode = (EB_U32)openLoopIntraCandidateIndex; EB_U32 puChromaOriginIndex = (((puOriginY & (63)) * 32) + (puOriginX & (63)))>>1; - EB_U32 chromaPuSize = puWidth >> 1; - - intraRefPtr->AboveReadyFlagCb = EB_FALSE; - intraRefPtr->AboveReadyFlagCr = EB_FALSE; - intraRefPtr->LeftReadyFlagCb = EB_FALSE; - intraRefPtr->LeftReadyFlagCr = EB_FALSE; - - switch (funcIndex) { - - case 0: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 2: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArray, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - candidateBufferPtr->predictionPtr->strideCb, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArray, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 3: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 1: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuSize, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - 32, - EB_FALSE); - } - - break; - - case 4: - - // Cb Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - IntraModeAngular_all( - chromaMode, - chromaPuSize, - intraRefPtr->cbIntraReferenceArray, - intraRefPtr->cbIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), - candidateBufferPtr->predictionPtr->strideCb, - intraRefPtr->ReferenceAboveLineCb, - &intraRefPtr->AboveReadyFlagCb, - intraRefPtr->ReferenceLeftLineCb, - &intraRefPtr->LeftReadyFlagCb); - } - - // Cr Intra Prediction - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - IntraModeAngular_all( - chromaMode, - chromaPuSize, - intraRefPtr->crIntraReferenceArray, - intraRefPtr->crIntraReferenceArrayReverse, - &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), - candidateBufferPtr->predictionPtr->strideCr, - intraRefPtr->ReferenceAboveLineCr, - &intraRefPtr->AboveReadyFlagCr, - intraRefPtr->ReferenceLeftLineCr, - &intraRefPtr->LeftReadyFlagCr); - } - - break; - - default: - break; - } - } + EB_U32 chromaPuSize = puWidth >> 1; + + intraRefPtr->AboveReadyFlagCb = EB_FALSE; + intraRefPtr->AboveReadyFlagCr = EB_FALSE; + intraRefPtr->LeftReadyFlagCb = EB_FALSE; + intraRefPtr->LeftReadyFlagCr = EB_FALSE; + + switch (funcIndex) { + + case 0: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 2: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArray, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + candidateBufferPtr->predictionPtr->strideCb, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraVerticalChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArray, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 3: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraHorzChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 1: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraDCChroma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuSize, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + 32, + EB_FALSE); + } + + break; + + case 4: + + // Cb Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + IntraModeAngular_all( + chromaMode, + chromaPuSize, + intraRefPtr->cbIntraReferenceArray, + intraRefPtr->cbIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCb[puChromaOriginIndex]), + candidateBufferPtr->predictionPtr->strideCb, + intraRefPtr->ReferenceAboveLineCb, + &intraRefPtr->AboveReadyFlagCb, + intraRefPtr->ReferenceLeftLineCb, + &intraRefPtr->LeftReadyFlagCb); + } + + // Cr Intra Prediction + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + IntraModeAngular_all( + chromaMode, + chromaPuSize, + intraRefPtr->crIntraReferenceArray, + intraRefPtr->crIntraReferenceArrayReverse, + &(candidateBufferPtr->predictionPtr->bufferCr[puChromaOriginIndex]), + candidateBufferPtr->predictionPtr->strideCr, + intraRefPtr->ReferenceAboveLineCr, + &intraRefPtr->AboveReadyFlagCr, + intraRefPtr->ReferenceLeftLineCr, + &intraRefPtr->LeftReadyFlagCr); + } + + break; + + default: + break; + } + } return return_error; } @@ -5671,10 +5671,10 @@ EB_ERRORTYPE IntraPredOnSrc( EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 puOriginX = mdContextPtr->cuOriginX; - EB_U32 puOriginY = mdContextPtr->cuOriginY; - EB_U32 puWidth = mdContextPtr->cuStats->size; - EB_U32 puHeight = mdContextPtr->cuStats->size; + EB_U32 puOriginX = mdContextPtr->cuOriginX; + EB_U32 puOriginY = mdContextPtr->cuOriginY; + EB_U32 puWidth = mdContextPtr->cuStats->size; + EB_U32 puHeight = mdContextPtr->cuStats->size; const EB_U32 puOriginIndex = ((puOriginY & (63)) * 64) + (puOriginX & (63)); EB_U32 openLoopIntraCandidateIndex = intraMode; @@ -5711,7 +5711,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 0: - IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraPlanar_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), @@ -5722,7 +5722,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 1: - IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraDCLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), @@ -5733,7 +5733,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 2: - IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + IntraVerticalLuma_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), @@ -5744,7 +5744,7 @@ EB_ERRORTYPE IntraPredOnSrc( case 3: - IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + IntraHorzLuma_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( puSize, intraRefPtr->yIntraReferenceArrayReverse, &(predictionPtr->bufferY[puOriginIndex]), diff --git a/Source/Lib/Codec/EbIntraPrediction.h b/Source/Lib/Codec/EbIntraPrediction.h index cdc5e0716..ac31a9491 100644 --- a/Source/Lib/Codec/EbIntraPrediction.h +++ b/Source/Lib/Codec/EbIntraPrediction.h @@ -25,7 +25,7 @@ #ifdef __cplusplus extern "C" { #endif -#define MAX_PU_SIZE 64 +#define MAX_PU_SIZE 64 struct ModeDecisionContext_s; @@ -38,7 +38,7 @@ typedef struct IntraReferenceSamples_s { EB_U8 *cbIntraFilteredReferenceArray; EB_U8 *crIntraFilteredReferenceArray; - EB_U8 *yIntraReferenceArrayReverse; + EB_U8 *yIntraReferenceArrayReverse; EB_U8 *yIntraFilteredReferenceArrayReverse; EB_U8 *cbIntraReferenceArrayReverse; EB_U8 *cbIntraFilteredReferenceArrayReverse; @@ -72,7 +72,7 @@ typedef struct IntraReference16bitSamples_s { EB_U16 *cbIntraFilteredReferenceArray; EB_U16 *crIntraFilteredReferenceArray; - EB_U16 *yIntraReferenceArrayReverse; + EB_U16 *yIntraReferenceArrayReverse; EB_U16 *yIntraFilteredReferenceArrayReverse; EB_U16 *cbIntraReferenceArrayReverse; EB_U16 *cbIntraFilteredReferenceArrayReverse; @@ -233,16 +233,16 @@ extern EB_ERRORTYPE GenerateChromaIntraReference16bitSamplesEncodePass( EB_BOOL pictureRightBoundary); extern EB_ERRORTYPE IntraPredictionCl( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr); extern EB_ERRORTYPE IntraPredictionOl( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr); extern EB_ERRORTYPE EncodePassIntraPrediction( void *refSamples, @@ -356,7 +356,7 @@ static const EB_U32 chromaMappingTable[] = { extern EB_ERRORTYPE UpdateNeighborSamplesArrayOL( IntraReferenceSamples_t *intraRefPtr, - EbPictureBufferDesc_t *inputPtr, + EbPictureBufferDesc_t *inputPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, @@ -365,11 +365,11 @@ extern EB_ERRORTYPE UpdateNeighborSamplesArrayOL( extern EB_ERRORTYPE UpdateChromaNeighborSamplesArrayOL( IntraReferenceSamples_t *intraRefPtr, - EbPictureBufferDesc_t *inputPtr, + EbPictureBufferDesc_t *inputPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, - EB_U32 cbStride, + EB_U32 cbStride, EB_U32 crStride, EB_U32 cuChromaOriginX, EB_U32 cuChromaOriginY, @@ -390,7 +390,7 @@ extern EB_ERRORTYPE UpdateNeighborSamplesArrayOpenLoop( EB_U32 blockSize); extern EB_ERRORTYPE IntraPredictionOpenLoop( - EB_U32 cuSize, + EB_U32 cuSize, MotionEstimationContext_t *contextPtr, EB_U32 openLoopIntraCandidate); @@ -408,24 +408,24 @@ extern EB_ERRORTYPE Intra4x4IntraPredictionCl( EB_PTR predictionContextPtr); extern EB_ERRORTYPE Intra4x4IntraPredictionOl( - EB_U32 puIndex, + EB_U32 puIndex, EB_U32 puOriginX, EB_U32 puOriginY, EB_U32 puWidth, EB_U32 puHeight, EB_U32 lcuSize, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_PTR predictionContextPtr); + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_PTR predictionContextPtr); extern void GenerateIntraLumaReferenceSamplesMd( - struct ModeDecisionContext_s *mdContextPtr, - EbPictureBufferDesc_t *inputPicturePtr); + struct ModeDecisionContext_s *mdContextPtr, + EbPictureBufferDesc_t *inputPicturePtr); extern void GenerateIntraChromaReferenceSamplesMd( - struct ModeDecisionContext_s *mdContextPtr, - EbPictureBufferDesc_t *inputPicturePtr); + struct ModeDecisionContext_s *mdContextPtr, + EbPictureBufferDesc_t *inputPicturePtr); /*************************************** * Function Ptr Types @@ -438,11 +438,11 @@ typedef void(*EB_INTRA_NOANG_TYPE)( const EB_BOOL skip); typedef EB_U32(*EB_NEIGHBOR_DC_INTRA_TYPE)( - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr, - EB_U32 srcOriginX, - EB_U32 srcOriginY, - EB_U32 blockSize); + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr, + EB_U32 srcOriginX, + EB_U32 srcOriginY, + EB_U32 blockSize); typedef void(*EB_INTRA_NOANG_16bit_TYPE)( const EB_U32 size, @@ -463,7 +463,7 @@ typedef void(*EB_INTRA_ANG_16BIT_TYPE)( EB_U32 size, //input parameter, denotes the size of the current PU EB_U16 *refSampMain, //input parameter, pointer to the reference samples EB_U16 *predictionPtr, //output parameter, pointer to the prediction - EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr + EB_U32 predictionBufferStride, //input parameter, denotes the stride for the prediction ptr const EB_BOOL skip, EB_S32 intraPredAngle); @@ -533,15 +533,15 @@ static EB_INTRA_NOANG_TYPE FUNC_TABLE IntraDCLuma_funcPtrArray[EB_ASM_TYPE_TOTAL IntraModeDCLuma, // AVX2 IntraModeDCLuma_AVX2_INTRIN, - + }; EB_U32 UpdateNeighborDcIntraPred( - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr, - EB_U32 srcOriginX, - EB_U32 srcOriginY, - EB_U32 blockSize); + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr, + EB_U32 srcOriginX, + EB_U32 srcOriginY, + EB_U32 blockSize); static EB_INTRA_NOANG_16bit_TYPE FUNC_TABLE IntraDCLuma_16bit_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT diff --git a/Source/Lib/Codec/EbMcp.c b/Source/Lib/Codec/EbMcp.c index e2986d62a..5227a62ce 100644 --- a/Source/Lib/Codec/EbMcp.c +++ b/Source/Lib/Codec/EbMcp.c @@ -25,7 +25,7 @@ EB_ERRORTYPE MotionCompensationPredictionContextCtor( MotionCompensationPredictionContext_t **contextDblPtr, - EB_U16 maxCUWidth, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit) @@ -60,10 +60,10 @@ EB_ERRORTYPE MotionCompensationPredictionContextCtor( initData.maxHeight = maxCUHeight + 16; // +8 needed for interpolation; the rest to accommodate MCP assembly kernels initData.bitDepth = EB_16BIT; initData.colorFormat = EB_YUV420; - initData.leftPadding = 0; - initData.rightPadding = 0; - initData.topPadding = 0; - initData.botPadding = 0; + initData.leftPadding = 0; + initData.rightPadding = 0; + initData.topPadding = 0; + initData.botPadding = 0; initData.splitMode = EB_FALSE; @@ -97,79 +97,79 @@ EB_ERRORTYPE MotionCompensationPredictionContextCtor( } void UniPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPic, - EB_U32 posX, - EB_U32 posY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *tempBuf0, - EB_S16 *tempBuf1, - EB_BOOL is16bit, - EB_U32 componentMask) + EbPictureBufferDesc_t *refPic, + EB_U32 posX, + EB_U32 posY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *dst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *tempBuf0, + EB_S16 *tempBuf1, + EB_BOOL is16bit, + EB_U32 componentMask) { - EB_U32 integPosx; - EB_U32 integPosy; - EB_U8 fracPosx; - EB_U8 fracPosy; - EB_U32 chromaPuWidth = puWidth >> 1; - EB_U32 chromaPuHeight = puHeight >> 1; - - - (void)tempBuf1; - - //luma - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - //compute the luma fractional position - integPosx = (posX >> 2); - integPosy = (posY >> 2); - fracPosx = posX & 0x03; - fracPosy = posY & 0x03; - - uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - is16bit ? refPic->bufferY + 4 + 4 * refPic->strideY : refPic->bufferY + integPosx + integPosy*refPic->strideY, - refPic->strideY, - dst->bufferY + dstLumaIndex, - dst->strideY, - puWidth, - puHeight, - tempBuf0); - } - - //chroma - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - //compute the chroma fractional position - integPosx = (posX >> 3); - integPosy = (posY >> 3); - fracPosx = posX & 0x07; - fracPosy = posY & 0x07; - - - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16bit ? refPic->bufferCb + 2 + 2 * refPic->strideCb : refPic->bufferCb + integPosx + integPosy * refPic->strideCb, - refPic->strideCb, - dst->bufferCb + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16bit ? refPic->bufferCr + 2 + 2 * refPic->strideCr : refPic->bufferCr + integPosx + integPosy * refPic->strideCr, - refPic->strideCr, - dst->bufferCr + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - } //input parameter, please refer to the detailed explanation above. + EB_U32 integPosx; + EB_U32 integPosy; + EB_U8 fracPosx; + EB_U8 fracPosy; + EB_U32 chromaPuWidth = puWidth >> 1; + EB_U32 chromaPuHeight = puHeight >> 1; + + + (void)tempBuf1; + + //luma + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + //compute the luma fractional position + integPosx = (posX >> 2); + integPosy = (posY >> 2); + fracPosx = posX & 0x03; + fracPosy = posY & 0x03; + + uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + is16bit ? refPic->bufferY + 4 + 4 * refPic->strideY : refPic->bufferY + integPosx + integPosy*refPic->strideY, + refPic->strideY, + dst->bufferY + dstLumaIndex, + dst->strideY, + puWidth, + puHeight, + tempBuf0); + } + + //chroma + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + //compute the chroma fractional position + integPosx = (posX >> 3); + integPosy = (posY >> 3); + fracPosx = posX & 0x07; + fracPosy = posY & 0x07; + + + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16bit ? refPic->bufferCb + 2 + 2 * refPic->strideCb : refPic->bufferCb + integPosx + integPosy * refPic->strideCb, + refPic->strideCb, + dst->bufferCb + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16bit ? refPic->bufferCr + 2 + 2 * refPic->strideCr : refPic->bufferCr + integPosx + integPosy * refPic->strideCr, + refPic->strideCr, + dst->bufferCr + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + } //input parameter, please refer to the detailed explanation above. } void EncodeUniPredInterpolation( @@ -194,10 +194,10 @@ void EncodeUniPredInterpolation( EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; EB_U32 chromaPuWidth = puWidth >> subWidthCMinus1; EB_U32 chromaPuHeight = puHeight >> subHeightCMinus1; - + (void)tempBuf1; - + //luma //compute the luma fractional position integPosx = (posX >> 2); @@ -205,14 +205,14 @@ void EncodeUniPredInterpolation( fracPosx = posX & 0x03; fracPosy = posY & 0x03; - uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - refPic->bufferY + integPosx + integPosy*refPic->strideY, - refPic->strideY, - dst->bufferY + dstLumaIndex, - dst->strideY, - puWidth, - puHeight, - tempBuf0); + uniPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + refPic->bufferY + integPosx + integPosy*refPic->strideY, + refPic->strideY, + dst->bufferY + dstLumaIndex, + dst->strideY, + puWidth, + puHeight, + tempBuf0); //chroma //compute the chroma fractional position @@ -221,29 +221,29 @@ void EncodeUniPredInterpolation( fracPosx = (posX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); fracPosy = (posY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPic->bufferCb + integPosx + integPosy*refPic->strideCb, - refPic->strideCb, - dst->bufferCb + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPic->bufferCr + integPosx + integPosy*refPic->strideCr, - refPic->strideCr, - dst->bufferCr + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); + + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPic->bufferCb + integPosx + integPosy*refPic->strideCb, + refPic->strideCb, + dst->bufferCb + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + uniPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPic->bufferCr + integPosx + integPosy*refPic->strideCr, + refPic->strideCr, + dst->bufferCr + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); } void UniPredInterpolation16bit( @@ -278,14 +278,14 @@ void UniPredInterpolation16bit( fracPosx = posX & 0x03; fracPosy = posY & 0x03; - uniPredLuma16bitIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - (EB_U16 *)fullPelBlock->bufferY + 4 + 4 * fullPelBlock->strideY, - fullPelBlock->strideY, - (EB_U16*)(dst->bufferY) + dstLumaIndex, - dst->strideY, - puWidth, - puHeight, - tempBuf0); + uniPredLuma16bitIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + (EB_U16 *)fullPelBlock->bufferY + 4 + 4 * fullPelBlock->strideY, + fullPelBlock->strideY, + (EB_U16*)(dst->bufferY) + dstLumaIndex, + dst->strideY, + puWidth, + puHeight, + tempBuf0); //chroma //compute the chroma fractional position @@ -294,267 +294,267 @@ void UniPredInterpolation16bit( fracPosx = (posX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); fracPosy = (posY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); - uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlock->bufferCb + 2 + 2 * fullPelBlock->strideCb, - fullPelBlock->strideCb, - (EB_U16*)(dst->bufferCb) + dstChromaIndex, - dst->strideCb, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - - uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlock->bufferCr + 2 + 2 * fullPelBlock->strideCr, - fullPelBlock->strideCr, - (EB_U16*)(dst->bufferCr) + dstChromaIndex, - dst->strideCr, - chromaPuWidth, - chromaPuHeight, - tempBuf0, - fracPosx, - fracPosy); - + uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlock->bufferCb + 2 + 2 * fullPelBlock->strideCb, + fullPelBlock->strideCb, + (EB_U16*)(dst->bufferCb) + dstChromaIndex, + dst->strideCb, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + + uniPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlock->bufferCr + 2 + 2 * fullPelBlock->strideCr, + fullPelBlock->strideCr, + (EB_U16*)(dst->bufferCr) + dstChromaIndex, + dst->strideCr, + chromaPuWidth, + chromaPuHeight, + tempBuf0, + fracPosx, + fracPosy); + } void BiPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPicList0, - EbPictureBufferDesc_t *refPicList1, - EB_U32 refList0PosX, - EB_U32 refList0PosY, - EB_U32 refList1PosX, - EB_U32 refList1PosY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *refList0TempDst, - EB_S16 *refList1TempDst, - EB_S16 *fistPassIFTempDst, - EB_BOOL is16Bit, - EB_U32 componentMask) + EbPictureBufferDesc_t *refPicList0, + EbPictureBufferDesc_t *refPicList1, + EB_U32 refList0PosX, + EB_U32 refList0PosY, + EB_U32 refList1PosX, + EB_U32 refList1PosY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *biDst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *refList0TempDst, + EB_S16 *refList1TempDst, + EB_S16 *fistPassIFTempDst, + EB_BOOL is16Bit, + EB_U32 componentMask) { - EB_U32 integPosx; - EB_U32 integPosy; - EB_U8 fracPosx; - EB_U8 fracPosy; - EB_U32 chromaPuWidth = puWidth >> 1; - EB_U32 chromaPuHeight = puHeight >> 1; - EB_U32 lumaTempBufSize = puWidth * puHeight; - EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; - - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0x, fracPosL1x; - EB_U8 fracPosL0y, fracPosL1y; - - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { - //compute the luma fractional position - integPosL0x = (refList0PosX >> 2); - integPosL0y = (refList0PosY >> 2); - fracPosL0x = refList0PosX & 0x03; - fracPosL0y = refList0PosY & 0x03; - - - //uni-prediction List1 luma - - //compute the luma fractional position - integPosL1x = (refList1PosX >> 2); - integPosL1y = (refList1PosY >> 2); - fracPosL1x = refList1PosX & 0x03; - fracPosL1y = refList1PosY & 0x03; - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, - refPicList0->strideY, - is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, - refPicList1->strideY, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, - puHeight, - Offset5, - EB_TRUE); - } - else - { - //uni-prediction List0 luma - //compute the luma fractional position - integPosx = (refList0PosX >> 2); - integPosy = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - // Note: SSSE3 Interpolation can only be enabled if - // SSSE3 clipping functions are enabled - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, - refPicList0->strideY, - refList0TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - //uni-prediction List1 luma - //compute the luma fractional position - integPosx = (refList1PosX >> 2); - integPosy = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, - refPicList1->strideY, - refList1TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - // bi-pred luma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puWidth, - puHeight, - refList0TempDst, - refList1TempDst, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - Offset5); - } - } - - if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosL0x = (refList0PosX >> 3); - integPosL0y = (refList0PosY >> 3); - fracPosL0x = refList0PosX & 0x07; - fracPosL0y = refList0PosY & 0x07; - - //uni-prediction List1 chroma - //compute the chroma fractional position - integPosL1x = (refList1PosX >> 3); - integPosL1y = (refList1PosY >> 3); - fracPosL1x = refList1PosX & 0x07; - fracPosL1y = refList1PosY & 0x07; - - if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, - refPicList0->strideCb, - is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, - refPicList1->strideCb, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, - refPicList0->strideCr, - is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, - refPicList1->strideCr, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - } - else - { - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosx = (refList0PosX >> 3); - integPosy = (refList0PosY >> 3); - fracPosx = refList0PosX & 0x07; - fracPosy = refList0PosY & 0x07; - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, - refPicList0->strideCb, - refList0TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, - refPicList0->strideCr, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //uni-prediction List1 chroma - //compute the chroma fractional position - integPosx = (refList1PosX >> 3); - integPosy = (refList1PosY >> 3); - fracPosx = refList1PosX & 0x07; - fracPosy = refList1PosY & 0x07; - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, - refPicList1->strideCb, - refList1TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, - refPicList1->strideCr, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - // bi-pred chroma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize, - refList1TempDst + lumaTempBufSize, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - ChromaOffset5); - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - ChromaOffset5); - } - } - - - return; + EB_U32 integPosx; + EB_U32 integPosy; + EB_U8 fracPosx; + EB_U8 fracPosy; + EB_U32 chromaPuWidth = puWidth >> 1; + EB_U32 chromaPuHeight = puHeight >> 1; + EB_U32 lumaTempBufSize = puWidth * puHeight; + EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; + + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0x, fracPosL1x; + EB_U8 fracPosL0y, fracPosL1y; + + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + //compute the luma fractional position + integPosL0x = (refList0PosX >> 2); + integPosL0y = (refList0PosY >> 2); + fracPosL0x = refList0PosX & 0x03; + fracPosL0y = refList0PosY & 0x03; + + + //uni-prediction List1 luma + + //compute the luma fractional position + integPosL1x = (refList1PosX >> 2); + integPosL1y = (refList1PosY >> 2); + fracPosL1x = refList1PosX & 0x03; + fracPosL1y = refList1PosY & 0x03; + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, + refPicList0->strideY, + is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, + refPicList1->strideY, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, + puHeight, + Offset5, + EB_TRUE); + } + else + { + //uni-prediction List0 luma + //compute the luma fractional position + integPosx = (refList0PosX >> 2); + integPosy = (refList0PosY >> 2); + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + // Note: SSSE3 Interpolation can only be enabled if + // SSSE3 clipping functions are enabled + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + is16Bit ? refPicList0->bufferY + 4 + 4 * refPicList0->strideY : refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, + refPicList0->strideY, + refList0TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + //uni-prediction List1 luma + //compute the luma fractional position + integPosx = (refList1PosX >> 2); + integPosy = (refList1PosY >> 2); + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + is16Bit ? refPicList1->bufferY + 4 + 4 * refPicList1->strideY : refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, + refPicList1->strideY, + refList1TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + // bi-pred luma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puWidth, + puHeight, + refList0TempDst, + refList1TempDst, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + Offset5); + } + } + + if (componentMask & PICTURE_BUFFER_DESC_CHROMA_MASK) { + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosL0x = (refList0PosX >> 3); + integPosL0y = (refList0PosY >> 3); + fracPosL0x = refList0PosX & 0x07; + fracPosL0y = refList0PosY & 0x07; + + //uni-prediction List1 chroma + //compute the chroma fractional position + integPosL1x = (refList1PosX >> 3); + integPosL1y = (refList1PosY >> 3); + fracPosL1x = refList1PosX & 0x07; + fracPosL1y = refList1PosY & 0x07; + + if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, + refPicList0->strideCb, + is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, + refPicList1->strideCb, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, + refPicList0->strideCr, + is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, + refPicList1->strideCr, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + } + else + { + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosx = (refList0PosX >> 3); + integPosy = (refList0PosY >> 3); + fracPosx = refList0PosX & 0x07; + fracPosy = refList0PosY & 0x07; + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList0->bufferCb + 2 + 2 * refPicList0->strideCb : refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, + refPicList0->strideCb, + refList0TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList0->bufferCr + 2 + 2 * refPicList0->strideCr : refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, + refPicList0->strideCr, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //uni-prediction List1 chroma + //compute the chroma fractional position + integPosx = (refList1PosX >> 3); + integPosy = (refList1PosY >> 3); + fracPosx = refList1PosX & 0x07; + fracPosy = refList1PosY & 0x07; + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList1->bufferCb + 2 + 2 * refPicList1->strideCb : refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, + refPicList1->strideCb, + refList1TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + is16Bit ? refPicList1->bufferCr + 2 + 2 * refPicList1->strideCr : refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, + refPicList1->strideCr, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + // bi-pred chroma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize, + refList1TempDst + lumaTempBufSize, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + ChromaOffset5); + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + ChromaOffset5); + } + } + + + return; } @@ -589,213 +589,213 @@ void EncodeBiPredInterpolation( EB_U32 lumaTempBufSize = puWidth * puHeight; EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; - EB_U32 integPosL0x, integPosL1x; - EB_U32 integPosL0y, integPosL1y; - EB_U8 fracPosL0x, fracPosL1x; - EB_U8 fracPosL0y, fracPosL1y; - //compute the luma fractional position - integPosL0x = (refList0PosX >> 2); - integPosL0y = (refList0PosY >> 2); - fracPosL0x = refList0PosX & 0x03; - fracPosL0y = refList0PosY & 0x03; - - - //uni-prediction List1 luma - //compute the luma fractional position - integPosL1x = (refList1PosX >> 2); - integPosL1y = (refList1PosY >> 2); - fracPosL1x = refList1PosX & 0x03; - fracPosL1y = refList1PosY & 0x03; - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, - refPicList0->strideY, - refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, - refPicList1->strideY, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, - puHeight, - Offset5, - EB_TRUE); - } - else - { - //uni-prediction List0 luma - //compute the luma fractional position - integPosx = (refList0PosX >> 2); - integPosy = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - // Note: SSSE3 Interpolation can only be enabled if - // SSSE3 clipping functions are enabled - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, - refPicList0->strideY, - refList0TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - //uni-prediction List1 luma - //compute the luma fractional position - integPosx = (refList1PosX >> 2); - integPosy = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - //doing the luma interpolation - biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, - refPicList1->strideY, - refList1TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - // bi-pred luma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puWidth, - puHeight, - refList0TempDst, - refList1TempDst, - biDst->bufferY + dstLumaIndex, - biDst->strideY, - Offset5); - } - - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosL0x = (refList0PosX >> (2 + subWidthCMinus1)); - integPosL0y = (refList0PosY >> (2 + subHeightCMinus1)); - fracPosL0x = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosL0y = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - - //uni-prediction List1 chroma - //compute the chroma fractional position - integPosL1x = (refList1PosX >> (2 + subWidthCMinus1)); - integPosL1y = (refList1PosY >> (2 + subHeightCMinus1)); - fracPosL1x = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosL1y = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, - refPicList0->strideCb, - refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, - refPicList1->strideCb, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - - // bi-pred luma clipping - BiPredClippingOnTheFly_SSSE3( - refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, - refPicList0->strideCr, - refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, - refPicList1->strideCr, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - chromaPuWidth, - chromaPuHeight, - ChromaOffset5, - EB_FALSE); - } - else - { - //uni-prediction List0 chroma - //compute the chroma fractional position - integPosx = (refList0PosX >> (2 + subWidthCMinus1)); - integPosy = (refList0PosY >> (2 + subHeightCMinus1)); - fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, - refPicList0->strideCb, - refList0TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, - refPicList0->strideCr, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //uni-prediction List1 chroma - //compute the chroma fractional position - //integPosx = (refList1PosX >> 3); - //integPosy = (refList1PosY >> 3); - //fracPosx = refList1PosX & 0x07; - //fracPosy = refList1PosY & 0x07; - - integPosx = (refList1PosX >> (2 + subWidthCMinus1)); - integPosy = (refList1PosY >> (2 + subHeightCMinus1)); - fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - //doing the chroma Cb interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, - refPicList1->strideCb, - refList1TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - //doing the chroma Cr interpolation - biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( - refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, - refPicList1->strideCr, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - // bi-pred chroma clipping - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize, - refList1TempDst + lumaTempBufSize, - biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - ChromaOffset5); - biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - ChromaOffset5); - } + EB_U32 integPosL0x, integPosL1x; + EB_U32 integPosL0y, integPosL1y; + EB_U8 fracPosL0x, fracPosL1x; + EB_U8 fracPosL0y, fracPosL1y; + //compute the luma fractional position + integPosL0x = (refList0PosX >> 2); + integPosL0y = (refList0PosY >> 2); + fracPosL0x = refList0PosX & 0x03; + fracPosL0y = refList0PosY & 0x03; + + + //uni-prediction List1 luma + //compute the luma fractional position + integPosL1x = (refList1PosX >> 2); + integPosL1y = (refList1PosY >> 2); + fracPosL1x = refList1PosX & 0x03; + fracPosL1y = refList1PosY & 0x03; + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + refPicList0->bufferY + integPosL0x + integPosL0y*refPicList0->strideY, + refPicList0->strideY, + refPicList1->bufferY + integPosL1x + integPosL1y*refPicList1->strideY, + refPicList1->strideY, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, + puHeight, + Offset5, + EB_TRUE); + } + else + { + //uni-prediction List0 luma + //compute the luma fractional position + integPosx = (refList0PosX >> 2); + integPosy = (refList0PosY >> 2); + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + // Note: SSSE3 Interpolation can only be enabled if + // SSSE3 clipping functions are enabled + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + refPicList0->bufferY + integPosx + integPosy*refPicList0->strideY, + refPicList0->strideY, + refList0TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + //uni-prediction List1 luma + //compute the luma fractional position + integPosx = (refList1PosX >> 2); + integPosy = (refList1PosY >> 2); + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + //doing the luma interpolation + biPredLumaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + refPicList1->bufferY + integPosx + integPosy*refPicList1->strideY, + refPicList1->strideY, + refList1TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + // bi-pred luma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puWidth, + puHeight, + refList0TempDst, + refList1TempDst, + biDst->bufferY + dstLumaIndex, + biDst->strideY, + Offset5); + } + + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosL0x = (refList0PosX >> (2 + subWidthCMinus1)); + integPosL0y = (refList0PosY >> (2 + subHeightCMinus1)); + fracPosL0x = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosL0y = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + + //uni-prediction List1 chroma + //compute the chroma fractional position + integPosL1x = (refList1PosX >> (2 + subWidthCMinus1)); + integPosL1y = (refList1PosY >> (2 + subHeightCMinus1)); + fracPosL1x = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosL1y = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + if (((fracPosL0x + (fracPosL0y << 3)) == 0) && ((fracPosL1x + (fracPosL1y << 3)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + refPicList0->bufferCb + integPosL0x + integPosL0y*refPicList0->strideCb, + refPicList0->strideCb, + refPicList1->bufferCb + integPosL1x + integPosL1y*refPicList1->strideCb, + refPicList1->strideCb, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + + // bi-pred luma clipping + BiPredClippingOnTheFly_SSSE3( + refPicList0->bufferCr + integPosL0x + integPosL0y*refPicList0->strideCr, + refPicList0->strideCr, + refPicList1->bufferCr + integPosL1x + integPosL1y*refPicList1->strideCr, + refPicList1->strideCr, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + chromaPuWidth, + chromaPuHeight, + ChromaOffset5, + EB_FALSE); + } + else + { + //uni-prediction List0 chroma + //compute the chroma fractional position + integPosx = (refList0PosX >> (2 + subWidthCMinus1)); + integPosy = (refList0PosY >> (2 + subHeightCMinus1)); + fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList0->bufferCb + integPosx + integPosy*refPicList0->strideCb, + refPicList0->strideCb, + refList0TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList0->bufferCr + integPosx + integPosy*refPicList0->strideCr, + refPicList0->strideCr, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //uni-prediction List1 chroma + //compute the chroma fractional position + //integPosx = (refList1PosX >> 3); + //integPosy = (refList1PosY >> 3); + //fracPosx = refList1PosX & 0x07; + //fracPosy = refList1PosY & 0x07; + + integPosx = (refList1PosX >> (2 + subWidthCMinus1)); + integPosy = (refList1PosY >> (2 + subHeightCMinus1)); + fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + //doing the chroma Cb interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList1->bufferCb + integPosx + integPosy*refPicList1->strideCb, + refPicList1->strideCb, + refList1TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + //doing the chroma Cr interpolation + biPredChromaIFFunctionPtrArrayNew[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 3)]( + refPicList1->bufferCr + integPosx + integPosy*refPicList1->strideCr, + refPicList1->strideCr, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + // bi-pred chroma clipping + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize, + refList1TempDst + lumaTempBufSize, + biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + ChromaOffset5); + biPredClippingFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + ChromaOffset5); + } return; @@ -817,199 +817,199 @@ void BiPredInterpolation16bit( EB_S16 *refList1TempDst, EB_S16 *fistPassIFTempDst) { - //EB_U32 integPosx; - //EB_U32 integPosy; - EB_U8 fracPosx; - EB_U8 fracPosy; + //EB_U32 integPosx; + //EB_U32 integPosy; + EB_U8 fracPosx; + EB_U8 fracPosy; const EB_COLOR_FORMAT colorFormat = biDst->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - EB_U32 chromaPuWidth = puWidth >> subWidthCMinus1; - EB_U32 chromaPuHeight = puHeight >> subHeightCMinus1; - EB_U32 lumaTempBufSize = puWidth * puHeight; - EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; - - EB_U8 fracPosL0x, fracPosL1x; - EB_U8 fracPosL0y, fracPosL1y; - //compute the luma fractional position - - fracPosL0x = refList0PosX & 0x03; - fracPosL0y = refList0PosY & 0x03; - - - //uni-prediction List1 luma - //compute the luma fractional position - - fracPosL1x = refList1PosX & 0x03; - fracPosL1y = refList1PosY & 0x03; - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - // bi-pred luma clipping - BiPredClippingOnTheFly16bit_SSE2( - (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, - fullPelBlockL0->strideY, - (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, - fullPelBlockL1->strideY, - (EB_U16*)biDst->bufferY + dstLumaIndex, - biDst->strideY, - puWidth, - puHeight); - - } - else - { - //List0 luma - //integPosx = (refList0PosX >> 2); - //integPosy = (refList0PosY >> 2); - fracPosx = refList0PosX & 0x03; - fracPosy = refList0PosY & 0x03; - - biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, - fullPelBlockL0->strideY, - refList0TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - //List1 luma - //integPosx = (refList1PosX >> 2); - //integPosy = (refList1PosY >> 2); - fracPosx = refList1PosX & 0x03; - fracPosy = refList1PosY & 0x03; - - biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( - (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, - fullPelBlockL1->strideY, - refList1TempDst, - puWidth, - puHeight, - fistPassIFTempDst); - - biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - puWidth, - puHeight, - refList0TempDst, - refList1TempDst, - (EB_U16*)biDst->bufferY + dstLumaIndex, - biDst->strideY); - } - - fracPosL0x = (refList0PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); - fracPosL0y = (refList0PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); - - fracPosL1x = (refList1PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); - fracPosL1y = (refList1PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); - - if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) - { - - { - BiPredClippingOnTheFly16bit_SSE2( - (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, - fullPelBlockL0->strideCb, - (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, - fullPelBlockL1->strideCb, - (EB_U16*)biDst->bufferCb + dstChromaIndex, - biDst->strideCb, - chromaPuWidth, - chromaPuHeight); - - - BiPredClippingOnTheFly16bit_SSE2( - (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, - fullPelBlockL0->strideCr, - (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, - fullPelBlockL1->strideCr, - (EB_U16*)biDst->bufferCr + dstChromaIndex, - biDst->strideCr, - chromaPuWidth, - chromaPuHeight); - } - } - else - { - //List0 chroma - //integPosx = (refList0PosX >> 3); - //integPosy = (refList0PosY >> 3); - fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, - fullPelBlockL0->strideCb, - refList0TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, - fullPelBlockL0->strideCr, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //*********************** - // L1: Y+Cb+Cr - //*********************** - - //List1 chroma - //integPosx = (refList1PosX >> 3); - //integPosy = (refList1PosY >> 3); - fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); - fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, - fullPelBlockL1->strideCb, - refList1TempDst + lumaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( - (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, - fullPelBlockL1->strideCr, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - chromaPuWidth, - chromaPuHeight, - fistPassIFTempDst, - fracPosx, - fracPosy); - - - //*********************** - // L0+L1 - //*********************** - biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize, - refList1TempDst + lumaTempBufSize, - (EB_U16*)biDst->bufferCb + dstChromaIndex, - biDst->strideCb); - - biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( - chromaPuWidth, - chromaPuHeight, - refList0TempDst + lumaTempBufSize + chromaTempBufSize, - refList1TempDst + lumaTempBufSize + chromaTempBufSize, - (EB_U16*)biDst->bufferCr + dstChromaIndex, - biDst->strideCr); - - } - - return; + EB_U32 chromaPuWidth = puWidth >> subWidthCMinus1; + EB_U32 chromaPuHeight = puHeight >> subHeightCMinus1; + EB_U32 lumaTempBufSize = puWidth * puHeight; + EB_U32 chromaTempBufSize = chromaPuWidth * chromaPuHeight; + + EB_U8 fracPosL0x, fracPosL1x; + EB_U8 fracPosL0y, fracPosL1y; + //compute the luma fractional position + + fracPosL0x = refList0PosX & 0x03; + fracPosL0y = refList0PosY & 0x03; + + + //uni-prediction List1 luma + //compute the luma fractional position + + fracPosL1x = refList1PosX & 0x03; + fracPosL1y = refList1PosY & 0x03; + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + // bi-pred luma clipping + BiPredClippingOnTheFly16bit_SSE2( + (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, + fullPelBlockL0->strideY, + (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, + fullPelBlockL1->strideY, + (EB_U16*)biDst->bufferY + dstLumaIndex, + biDst->strideY, + puWidth, + puHeight); + + } + else + { + //List0 luma + //integPosx = (refList0PosX >> 2); + //integPosy = (refList0PosY >> 2); + fracPosx = refList0PosX & 0x03; + fracPosy = refList0PosY & 0x03; + + biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + (EB_U16 *)fullPelBlockL0->bufferY + 4 + 4 * fullPelBlockL0->strideY, + fullPelBlockL0->strideY, + refList0TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + //List1 luma + //integPosx = (refList1PosX >> 2); + //integPosy = (refList1PosY >> 2); + fracPosx = refList1PosX & 0x03; + fracPosy = refList1PosY & 0x03; + + biPredLumaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & PREAVX2_MASK)][fracPosx + (fracPosy << 2)]( + (EB_U16 *)fullPelBlockL1->bufferY + 4 + 4 * fullPelBlockL1->strideY, + fullPelBlockL1->strideY, + refList1TempDst, + puWidth, + puHeight, + fistPassIFTempDst); + + biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + puWidth, + puHeight, + refList0TempDst, + refList1TempDst, + (EB_U16*)biDst->bufferY + dstLumaIndex, + biDst->strideY); + } + + fracPosL0x = (refList0PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); + fracPosL0y = (refList0PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); + + fracPosL1x = (refList1PosX & (0x07 >> (1 - subWidthCMinus1))) << (1 - subWidthCMinus1); + fracPosL1y = (refList1PosY & (0x07 >> (1 - subHeightCMinus1))) << (1 - subHeightCMinus1); + + if (((fracPosL0x + (fracPosL0y << 2)) == 0) && ((fracPosL1x + (fracPosL1y << 2)) == 0)) + { + + { + BiPredClippingOnTheFly16bit_SSE2( + (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, + fullPelBlockL0->strideCb, + (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, + fullPelBlockL1->strideCb, + (EB_U16*)biDst->bufferCb + dstChromaIndex, + biDst->strideCb, + chromaPuWidth, + chromaPuHeight); + + + BiPredClippingOnTheFly16bit_SSE2( + (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, + fullPelBlockL0->strideCr, + (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, + fullPelBlockL1->strideCr, + (EB_U16*)biDst->bufferCr + dstChromaIndex, + biDst->strideCr, + chromaPuWidth, + chromaPuHeight); + } + } + else + { + //List0 chroma + //integPosx = (refList0PosX >> 3); + //integPosy = (refList0PosY >> 3); + fracPosx = (refList0PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList0PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL0->bufferCb + 2 + 2 * fullPelBlockL0->strideCb, + fullPelBlockL0->strideCb, + refList0TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL0->bufferCr + 2 + 2 * fullPelBlockL0->strideCr, + fullPelBlockL0->strideCr, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //*********************** + // L1: Y+Cb+Cr + //*********************** + + //List1 chroma + //integPosx = (refList1PosX >> 3); + //integPosy = (refList1PosY >> 3); + fracPosx = (refList1PosX & (0x07 >> (1-subWidthCMinus1))) << (1-subWidthCMinus1); + fracPosy = (refList1PosY & (0x07 >> (1-subHeightCMinus1))) << (1-subHeightCMinus1); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL1->bufferCb + 2 + 2 * fullPelBlockL1->strideCb, + fullPelBlockL1->strideCb, + refList1TempDst + lumaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + biPredChromaIFFunctionPtrArrayNew16bit[!!(ASM_TYPES & AVX2_MASK)][fracPosx + (fracPosy << 3)]( + (EB_U16 *)fullPelBlockL1->bufferCr + 2 + 2 * fullPelBlockL1->strideCr, + fullPelBlockL1->strideCr, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + chromaPuWidth, + chromaPuHeight, + fistPassIFTempDst, + fracPosx, + fracPosy); + + + //*********************** + // L0+L1 + //*********************** + biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize, + refList1TempDst + lumaTempBufSize, + (EB_U16*)biDst->bufferCb + dstChromaIndex, + biDst->strideCb); + + biPredClipping16bitFuncPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]( + chromaPuWidth, + chromaPuHeight, + refList0TempDst + lumaTempBufSize + chromaTempBufSize, + refList1TempDst + lumaTempBufSize + chromaTempBufSize, + (EB_U16*)biDst->bufferCr + dstChromaIndex, + biDst->strideCr); + + } + + return; } /** GeneratePadding() is used to pad the target picture. The horizontal padding happens first and then the vertical padding. @@ -1049,10 +1049,10 @@ void GeneratePadding( { // top part data copy tempSrcPic2 -= srcStride; - EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified // bottom part data copy tempSrcPic3 += srcStride; - EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified --verticalIdx; } @@ -1062,49 +1062,49 @@ void GeneratePadding( is used to pad the target picture. The horizontal padding happens first and then the vertical padding. */ void GeneratePadding16Bit( - EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. - EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. - EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. - EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. - EB_U32 paddingWidth, //input paramter, the padding width. - EB_U32 paddingHeight) //input paramter, the padding height. + EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. + EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. + EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. + EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. + EB_U32 paddingWidth, //input paramter, the padding width. + EB_U32 paddingHeight) //input paramter, the padding height. { - EB_U32 verticalIdx = originalSrcHeight; - EB_BYTE tempSrcPic0; - EB_BYTE tempSrcPic1; - EB_BYTE tempSrcPic2; - EB_BYTE tempSrcPic3; - - tempSrcPic0 = srcPic + paddingWidth + paddingHeight*srcStride; - while (verticalIdx) - { - // horizontal padding - //EB_MEMSET(tempSrcPic0 - paddingWidth, tempSrcPic0, paddingWidth); - memset16bit((EB_U16*)(tempSrcPic0 - paddingWidth), ((EB_U16*)(tempSrcPic0))[0], paddingWidth >> 1); - memset16bit((EB_U16*)(tempSrcPic0 + originalSrcWidth), ((EB_U16*)(tempSrcPic0 + originalSrcWidth - 2/*1*/))[0], paddingWidth >> 1); - - tempSrcPic0 += srcStride; - --verticalIdx; - } - - // vertical padding - verticalIdx = paddingHeight; - tempSrcPic0 = srcPic + paddingHeight*srcStride; - tempSrcPic1 = srcPic + (paddingHeight + originalSrcHeight - 1)*srcStride; - tempSrcPic2 = tempSrcPic0; - tempSrcPic3 = tempSrcPic1; - while (verticalIdx) - { - // top part data copy - tempSrcPic2 -= srcStride; - EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified - // bottom part data copy - tempSrcPic3 += srcStride; - EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified - --verticalIdx; - } - - return; + EB_U32 verticalIdx = originalSrcHeight; + EB_BYTE tempSrcPic0; + EB_BYTE tempSrcPic1; + EB_BYTE tempSrcPic2; + EB_BYTE tempSrcPic3; + + tempSrcPic0 = srcPic + paddingWidth + paddingHeight*srcStride; + while (verticalIdx) + { + // horizontal padding + //EB_MEMSET(tempSrcPic0 - paddingWidth, tempSrcPic0, paddingWidth); + memset16bit((EB_U16*)(tempSrcPic0 - paddingWidth), ((EB_U16*)(tempSrcPic0))[0], paddingWidth >> 1); + memset16bit((EB_U16*)(tempSrcPic0 + originalSrcWidth), ((EB_U16*)(tempSrcPic0 + originalSrcWidth - 2/*1*/))[0], paddingWidth >> 1); + + tempSrcPic0 += srcStride; + --verticalIdx; + } + + // vertical padding + verticalIdx = paddingHeight; + tempSrcPic0 = srcPic + paddingHeight*srcStride; + tempSrcPic1 = srcPic + (paddingHeight + originalSrcHeight - 1)*srcStride; + tempSrcPic2 = tempSrcPic0; + tempSrcPic3 = tempSrcPic1; + while (verticalIdx) + { + // top part data copy + tempSrcPic2 -= srcStride; + EB_MEMCPY(tempSrcPic2, tempSrcPic0, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + // bottom part data copy + tempSrcPic3 += srcStride; + EB_MEMCPY(tempSrcPic3, tempSrcPic1, sizeof(EB_U8)*srcStride); // EB_U8 to be modified + --verticalIdx; + } + + return; } @@ -1112,48 +1112,48 @@ void GeneratePadding16Bit( is used to pad the input picture in order to get . The horizontal padding happens first and then the vertical padding. */ void PadInputPicture( - EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. - EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. - EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. - EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. - EB_U32 padRight, //input paramter, the padding right. - EB_U32 padBottom) //input paramter, the padding bottom. + EB_BYTE srcPic, //output paramter, pointer to the source picture to be padded. + EB_U32 srcStride, //input paramter, the stride of the source picture to be padded. + EB_U32 originalSrcWidth, //input paramter, the width of the source picture which excludes the padding. + EB_U32 originalSrcHeight, //input paramter, the height of the source picture which excludes the padding. + EB_U32 padRight, //input paramter, the padding right. + EB_U32 padBottom) //input paramter, the padding bottom. { - EB_U32 verticalIdx; - EB_BYTE tempSrcPic0; - EB_BYTE tempSrcPic1; + EB_U32 verticalIdx; + EB_BYTE tempSrcPic0; + EB_BYTE tempSrcPic1; - if (padRight) { + if (padRight) { - // Add padding @ the right - verticalIdx = originalSrcHeight; - tempSrcPic0 = srcPic; + // Add padding @ the right + verticalIdx = originalSrcHeight; + tempSrcPic0 = srcPic; - while (verticalIdx) - { + while (verticalIdx) + { - EB_MEMSET(tempSrcPic0 + originalSrcWidth, *(tempSrcPic0 + originalSrcWidth - 1), padRight); - tempSrcPic0 += srcStride; - --verticalIdx; - } - } + EB_MEMSET(tempSrcPic0 + originalSrcWidth, *(tempSrcPic0 + originalSrcWidth - 1), padRight); + tempSrcPic0 += srcStride; + --verticalIdx; + } + } - if (padBottom) { + if (padBottom) { - // Add padding @ the bottom - verticalIdx = padBottom; - tempSrcPic0 = srcPic + (originalSrcHeight - 1) * srcStride; - tempSrcPic1 = tempSrcPic0; + // Add padding @ the bottom + verticalIdx = padBottom; + tempSrcPic0 = srcPic + (originalSrcHeight - 1) * srcStride; + tempSrcPic1 = tempSrcPic0; - while (verticalIdx) - { - tempSrcPic1 += srcStride; - EB_MEMCPY(tempSrcPic1, tempSrcPic0, sizeof(EB_U8)* (originalSrcWidth + padRight)); - --verticalIdx; - } - } + while (verticalIdx) + { + tempSrcPic1 += srcStride; + EB_MEMCPY(tempSrcPic1, tempSrcPic0, sizeof(EB_U8)* (originalSrcWidth + padRight)); + --verticalIdx; + } + } - return; + return; } diff --git a/Source/Lib/Codec/EbMcp.h b/Source/Lib/Codec/EbMcp.h index 088d17f3f..fa6df3b8c 100644 --- a/Source/Lib/Codec/EbMcp.h +++ b/Source/Lib/Codec/EbMcp.h @@ -26,11 +26,11 @@ typedef struct MotionCompensationPredictionContext_s EB_S16 *motionCompensationIntermediateResultBuf0; //this 64x64(Y)+32x32(U)+32x32(V) buffer is used to store the MCP intermediate result for ref0. EB_S16 *motionCompensationIntermediateResultBuf1; //this 64x64(Y)+32x32(U)+32x32(V) buffer is used to store the MCP intermediate result for ref1. - EB_BYTE avcStyleMcpIntermediateResultBuf0; // For short filter in MD + EB_BYTE avcStyleMcpIntermediateResultBuf0; // For short filter in MD EB_BYTE avcStyleMcpIntermediateResultBuf1; // For short filter in MD #if !USE_PRE_COMPUTE - EB_S16 *TwoDInterpolationFirstPassFilterResultBuf; //this (64+MaxLumaFliterTag-1)x(64+MaxLumaFliterTag-1) buffer is used to store the result of 1st pass filtering of 2D interpolation filter. + EB_S16 *TwoDInterpolationFirstPassFilterResultBuf; //this (64+MaxLumaFliterTag-1)x(64+MaxLumaFliterTag-1) buffer is used to store the result of 1st pass filtering of 2D interpolation filter. EB_BYTE avcStyleMcpTwoDInterpolationFirstPassFilterResultBuf; // For short filter in MD #endif @@ -41,32 +41,32 @@ typedef struct MotionCompensationPredictionContext_s }MotionCompensationPredictionContext_t; -/** InterpolationFilter() - is generally defined interpolation filter function. - There is a whole group of these functions, each of which corresponds to a particular - integer/fractional sample, and the function is indexed in a function pointer array +/** InterpolationFilter() + is generally defined interpolation filter function. + There is a whole group of these functions, each of which corresponds to a particular + integer/fractional sample, and the function is indexed in a function pointer array in terms of the fracPosx and fracPosy. - + @param *refPic (8-bits input) - refPic is the pointer to the reference picture data that was chosen by + refPic is the pointer to the reference picture data that was chosen by the integer pixel precision MV. @param srcStride (input) @param fracPosx (input) fracPosx is the horizontal fractional position of the predicted sample @param fracPosy (input) - fracPosy is the veritcal fractional position of the predicted sample + fracPosy is the veritcal fractional position of the predicted sample @param puWidth (input) @param puHeight (input) @param *dst (16-bits output) - dst is the pointer to the destination where the prediction result will + dst is the pointer to the destination where the prediction result will be stored. @param dstStride (input) @param *firstPassIFDst (16-bits input) - firstPassIFDst is the pointer to the buffer where the result of the first + firstPassIFDst is the pointer to the buffer where the result of the first pass filtering of the 2D interpolation filter will be stored. @param isLast (input) - isLast indicates if there is any further filtering (interpolation filtering) - afterwards. + isLast indicates if there is any further filtering (interpolation filtering) + afterwards. */ typedef void (*InterpolationFilter)( EB_BYTE refPic, //8-bits input parameter, please refer to the detailed explanation above. @@ -128,12 +128,12 @@ typedef void (*InterpolationFilterOutRaw)( EB_S16 *firstPassIFDst); //input parameter, please refer to the detailed explanation above. typedef void (*InterpolationFilterOutRaw16bit)( - EB_U16 *refPic, - EB_U32 srcStride, - EB_S16 *dst, - EB_U32 puWidth, - EB_U32 puHeight, - EB_S16 *firstPassIFDst); + EB_U16 *refPic, + EB_U32 srcStride, + EB_S16 *dst, + EB_U32 puWidth, + EB_U32 puHeight, + EB_S16 *firstPassIFDst); typedef void (*ChromaFilterNew)( EB_BYTE refPic, @@ -170,7 +170,7 @@ typedef void (*sampleBiPredClipping16bit)( EB_U32 puHeight, EB_S16 *list0Src, EB_S16 *list1Src, - EB_U16 *dst, + EB_U16 *dst, EB_U32 dstStride); typedef void (*lumaSampleUniPredClipping)( @@ -259,26 +259,26 @@ typedef void (*chromaSampleBiPredAverage)( EB_U32 crDstDoubleStride); extern EB_ERRORTYPE MotionCompensationPredictionContextCtor( - MotionCompensationPredictionContext_t **contextDblPtr, - EB_U16 maxCUWidth, + MotionCompensationPredictionContext_t **contextDblPtr, + EB_U16 maxCUWidth, EB_U16 maxCUHeight, EB_BOOL is16bit); extern void UniPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPic, - EB_U32 posX, - EB_U32 posY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *dst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *tempBuf0, - EB_S16 *tempBuf1, - EB_BOOL is16bit, - EB_U32 componentMask); - -extern void EncodeUniPredInterpolation( + EbPictureBufferDesc_t *refPic, + EB_U32 posX, + EB_U32 posY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *dst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *tempBuf0, + EB_S16 *tempBuf1, + EB_BOOL is16bit, + EB_U32 componentMask); + +extern void EncodeUniPredInterpolation( EbPictureBufferDesc_t *refPic, EB_U32 posX, EB_U32 posY, @@ -300,25 +300,25 @@ void UniPredInterpolation16bit( EbPictureBufferDesc_t *dst, //output parameter, please refer to the detailed explanation above. EB_U32 dstLumaIndex, //input parameter, please refer to the detailed explanation above. EB_U32 dstChromaIndex, //input parameter, please refer to the detailed explanation above. - EB_S16 *tempBuf0); //input parameter, please refer to the detailed explanation above. + EB_S16 *tempBuf0); //input parameter, please refer to the detailed explanation above. extern void BiPredHevcInterpolationMd( - EbPictureBufferDesc_t *refPicList0, - EbPictureBufferDesc_t *refPicList1, - EB_U32 refList0PosX, - EB_U32 refList0PosY, - EB_U32 refList1PosX, - EB_U32 refList1PosY, - EB_U32 puWidth, - EB_U32 puHeight, - EbPictureBufferDesc_t *biDst, - EB_U32 dstLumaIndex, - EB_U32 dstChromaIndex, - EB_S16 *refList0TempDst, - EB_S16 *refList1TempDst, - EB_S16 *fistPassIFTempDst, - EB_BOOL is16Bit, - EB_U32 componentMask); + EbPictureBufferDesc_t *refPicList0, + EbPictureBufferDesc_t *refPicList1, + EB_U32 refList0PosX, + EB_U32 refList0PosY, + EB_U32 refList1PosX, + EB_U32 refList1PosY, + EB_U32 puWidth, + EB_U32 puHeight, + EbPictureBufferDesc_t *biDst, + EB_U32 dstLumaIndex, + EB_U32 dstChromaIndex, + EB_S16 *refList0TempDst, + EB_S16 *refList1TempDst, + EB_S16 *fistPassIFTempDst, + EB_BOOL is16Bit, + EB_U32 componentMask); extern void EncodeBiPredInterpolation( EbPictureBufferDesc_t *refPicList0, @@ -338,7 +338,7 @@ extern void EncodeBiPredInterpolation( void BiPredInterpolation16bit( EbPictureBufferDesc_t *fullPelBlockL0, - EbPictureBufferDesc_t *fullPelBlockL1, + EbPictureBufferDesc_t *fullPelBlockL1, EB_U32 refList0PosX, EB_U32 refList0PosY, EB_U32 refList1PosX, @@ -360,19 +360,19 @@ extern void GeneratePadding( EB_U32 paddingWidth, EB_U32 paddingHeight); extern void GeneratePadding16Bit( - EB_BYTE srcPic, - EB_U32 srcStride, - EB_U32 originalSrcWidth, - EB_U32 originalSrcHeight, - EB_U32 paddingWidth, - EB_U32 paddingHeight); + EB_BYTE srcPic, + EB_U32 srcStride, + EB_U32 originalSrcWidth, + EB_U32 originalSrcHeight, + EB_U32 paddingWidth, + EB_U32 paddingHeight); extern void PadInputPicture( EB_BYTE srcPic, EB_U32 srcStride, EB_U32 originalSrcWidth, EB_U32 originalSrcHeight, - EB_U32 padRight, - EB_U32 padBottom); + EB_U32 padRight, + EB_U32 padBottom); void AvcStyleCopy( EB_BYTE refPic, diff --git a/Source/Lib/Codec/EbMcpTables.c b/Source/Lib/Codec/EbMcpTables.c index c6b639870..5508b40ac 100644 --- a/Source/Lib/Codec/EbMcpTables.c +++ b/Source/Lib/Codec/EbMcpTables.c @@ -19,9 +19,9 @@ const sampleBiPredClipping biPredClippingFuncPtrArray[EB_ASM_TYPE_TOTAL] = { }; const sampleBiPredClipping16bit biPredClipping16bitFuncPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT BiPredClipping16bit, - BiPredClipping16bit_SSE2_INTRIN + BiPredClipping16bit_SSE2_INTRIN }; // Luma @@ -48,7 +48,7 @@ const InterpolationFilterNew uniPredLumaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL] // AVX2 { LumaInterpolationCopy_SSSE3, //A - LumaInterpolationFilterPosa_SSSE3, //a + LumaInterpolationFilterPosa_SSSE3, //a LumaInterpolationFilterPosb_SSSE3, //b LumaInterpolationFilterPosc_SSSE3, //c LumaInterpolationFilterPosd_SSSE3, //d @@ -68,9 +68,9 @@ const InterpolationFilterNew uniPredLumaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL] // Luma const InterpolationFilterNew16bit uniPredLuma16bitIFFunctionPtrArray[EB_ASM_TYPE_TOTAL][16] = { //[ASM type][Interpolation position] - // C_DEFAULT - { - LumaInterpolationCopy16bit, //A + // C_DEFAULT + { + LumaInterpolationCopy16bit, //A LumaInterpolationFilterPosaNew16bit, //a LumaInterpolationFilterPosbNew16bit, //b LumaInterpolationFilterPoscNew16bit, //c @@ -86,26 +86,26 @@ const InterpolationFilterNew16bit uniPredLuma16bitIFFunctionPtrArray[EB_ASM_TYPE LumaInterpolationFilterPospNew16bit, //p LumaInterpolationFilterPosqNew16bit, //q LumaInterpolationFilterPosrNew16bit, //r - }, - // AVX2 - { - LumaInterpolationCopy16bit_SSE2, //A - LumaInterpolationFilterPosa16bit_SSE2_INTRIN, //a - LumaInterpolationFilterPosb16bit_SSE2_INTRIN, //b - LumaInterpolationFilterPosc16bit_SSE2_INTRIN, //c - LumaInterpolationFilterPosd16bit_SSE2_INTRIN, //d - LumaInterpolationFilterPose16bit_SSE2_INTRIN, //e - LumaInterpolationFilterPosf16bit_SSE2_INTRIN, //f - LumaInterpolationFilterPosg16bit_SSE2_INTRIN, //g - LumaInterpolationFilterPosh16bit_SSE2_INTRIN, //h - LumaInterpolationFilterPosi16bit_SSE2_INTRIN, //i - LumaInterpolationFilterPosj16bit_SSE2_INTRIN, //j - LumaInterpolationFilterPosk16bit_SSE2_INTRIN, //k - LumaInterpolationFilterPosn16bit_SSE2_INTRIN, //n - LumaInterpolationFilterPosp16bit_SSE2_INTRIN, //p - LumaInterpolationFilterPosq16bit_SSE2_INTRIN, //q - LumaInterpolationFilterPosr16bit_SSE2_INTRIN, //r - }, + }, + // AVX2 + { + LumaInterpolationCopy16bit_SSE2, //A + LumaInterpolationFilterPosa16bit_SSE2_INTRIN, //a + LumaInterpolationFilterPosb16bit_SSE2_INTRIN, //b + LumaInterpolationFilterPosc16bit_SSE2_INTRIN, //c + LumaInterpolationFilterPosd16bit_SSE2_INTRIN, //d + LumaInterpolationFilterPose16bit_SSE2_INTRIN, //e + LumaInterpolationFilterPosf16bit_SSE2_INTRIN, //f + LumaInterpolationFilterPosg16bit_SSE2_INTRIN, //g + LumaInterpolationFilterPosh16bit_SSE2_INTRIN, //h + LumaInterpolationFilterPosi16bit_SSE2_INTRIN, //i + LumaInterpolationFilterPosj16bit_SSE2_INTRIN, //j + LumaInterpolationFilterPosk16bit_SSE2_INTRIN, //k + LumaInterpolationFilterPosn16bit_SSE2_INTRIN, //n + LumaInterpolationFilterPosp16bit_SSE2_INTRIN, //p + LumaInterpolationFilterPosq16bit_SSE2_INTRIN, //q + LumaInterpolationFilterPosr16bit_SSE2_INTRIN, //r + }, }; @@ -151,8 +151,8 @@ const InterpolationFilterOutRaw biPredLumaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTA }; const InterpolationFilterOutRaw16bit biPredLumaIFFunctionPtrArrayNew16bit[EB_ASM_TYPE_TOTAL][16] = { - // C_DEFAULT - { + // C_DEFAULT + { LumaInterpolationCopyOutRaw16bit, //A LumaInterpolationFilterPosaOutRaw16bit, //a LumaInterpolationFilterPosbOutRaw16bit, //b @@ -169,26 +169,26 @@ const InterpolationFilterOutRaw16bit biPredLumaIFFunctionPtrArrayNew16bit[EB_ASM LumaInterpolationFilterPospOutRaw16bit, //p LumaInterpolationFilterPosqOutRaw16bit, //q LumaInterpolationFilterPosrOutRaw16bit, //r - }, - // AVX2 - { - LumaInterpolationCopyOutRaw16bit_SSE2_INTRIN, //A - LumaInterpolationFilterPosaOutRaw16bit_SSE2_INTRIN, //a - LumaInterpolationFilterPosbOutRaw16bit_SSE2_INTRIN, //b - LumaInterpolationFilterPoscOutRaw16bit_SSE2_INTRIN, //c - LumaInterpolationFilterPosdOutRaw16bit_SSE2_INTRIN, //d - LumaInterpolationFilterPoseOutRaw16bit_SSE2_INTRIN, //e - LumaInterpolationFilterPosfOutRaw16bit_SSE2_INTRIN, //f - LumaInterpolationFilterPosgOutRaw16bit_SSE2_INTRIN, //g - LumaInterpolationFilterPoshOutRaw16bit_SSE2_INTRIN, //h - LumaInterpolationFilterPosiOutRaw16bit_SSE2_INTRIN, //i - LumaInterpolationFilterPosjOutRaw16bit_SSE2_INTRIN, //j - LumaInterpolationFilterPoskOutRaw16bit_SSE2_INTRIN, //k - LumaInterpolationFilterPosnOutRaw16bit_SSE2_INTRIN, //n - LumaInterpolationFilterPospOutRaw16bit_SSE2_INTRIN, //p - LumaInterpolationFilterPosqOutRaw16bit_SSE2_INTRIN, //q - LumaInterpolationFilterPosrOutRaw16bit_SSE2_INTRIN, //r - }, + }, + // AVX2 + { + LumaInterpolationCopyOutRaw16bit_SSE2_INTRIN, //A + LumaInterpolationFilterPosaOutRaw16bit_SSE2_INTRIN, //a + LumaInterpolationFilterPosbOutRaw16bit_SSE2_INTRIN, //b + LumaInterpolationFilterPoscOutRaw16bit_SSE2_INTRIN, //c + LumaInterpolationFilterPosdOutRaw16bit_SSE2_INTRIN, //d + LumaInterpolationFilterPoseOutRaw16bit_SSE2_INTRIN, //e + LumaInterpolationFilterPosfOutRaw16bit_SSE2_INTRIN, //f + LumaInterpolationFilterPosgOutRaw16bit_SSE2_INTRIN, //g + LumaInterpolationFilterPoshOutRaw16bit_SSE2_INTRIN, //h + LumaInterpolationFilterPosiOutRaw16bit_SSE2_INTRIN, //i + LumaInterpolationFilterPosjOutRaw16bit_SSE2_INTRIN, //j + LumaInterpolationFilterPoskOutRaw16bit_SSE2_INTRIN, //k + LumaInterpolationFilterPosnOutRaw16bit_SSE2_INTRIN, //n + LumaInterpolationFilterPospOutRaw16bit_SSE2_INTRIN, //p + LumaInterpolationFilterPosqOutRaw16bit_SSE2_INTRIN, //q + LumaInterpolationFilterPosrOutRaw16bit_SSE2_INTRIN, //r + }, }; // Chroma @@ -264,7 +264,7 @@ const ChromaFilterNew uniPredChromaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL][64] { ChromaInterpolationCopy_SSSE3, //B - ChromaInterpolationFilterOneDHorizontal_SSSE3, //ab + ChromaInterpolationFilterOneDHorizontal_SSSE3, //ab ChromaInterpolationFilterOneDHorizontal_SSSE3, //ac ChromaInterpolationFilterOneDHorizontal_SSSE3, //ad ChromaInterpolationFilterOneDHorizontal_SSSE3, //ae @@ -548,20 +548,20 @@ const ChromaFilterOutRaw biPredChromaIFFunctionPtrArrayNew[EB_ASM_TYPE_TOTAL][64 ChromaInterpolationFilterOneDOutRawHorizontal_SSSE3, //ah ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //ba ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bb - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bc - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bd - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //be - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bf - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bg - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bh - ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //ca - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cb - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cc - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cd - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ce - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cf - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cg - ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ch + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bc + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bd + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //be + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bf + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bg + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //bh + ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //ca + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cb + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cc + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cd + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ce + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cf + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //cg + ChromaInterpolationFilterTwoDOutRaw_SSSE3, //ch ChromaInterpolationFilterOneDOutRawVertical_SSSE3, //da ChromaInterpolationFilterTwoDOutRaw_SSSE3, //db ChromaInterpolationFilterTwoDOutRaw_SSSE3, //dc diff --git a/Source/Lib/Codec/EbMeSadCalculation.h b/Source/Lib/Codec/EbMeSadCalculation.h index 33d9f9fd0..7af9db66d 100644 --- a/Source/Lib/Codec/EbMeSadCalculation.h +++ b/Source/Lib/Codec/EbMeSadCalculation.h @@ -38,10 +38,10 @@ typedef void(*EB_SADCALCULATION32X32AND64X64_TYPE)( EB_U32 mv); typedef void(*EB_INIALIZEBUFFER_32BITS)( - EB_U32* Pointer, - EB_U32 Count128, - EB_U32 Count32, - EB_U32 Value); + EB_U32* Pointer, + EB_U32 Count128, + EB_U32 Count32, + EB_U32 Value); typedef void(*EB_RECTAMPSADCALCULATION8X8AND16X16_TYPE)( EB_U8 *src, @@ -107,14 +107,14 @@ static EB_SADCALCULATION8X8AND16X16_TYPE SadCalculation_8x8_16x16_funcPtrArray[E // C_DEFAULT SadCalculation_8x8_16x16, // AVX2 - SadCalculation_8x8_16x16_SSE2_INTRIN, + SadCalculation_8x8_16x16_SSE2_INTRIN, }; static EB_SADCALCULATION32X32AND64X64_TYPE SadCalculation_32x32_64x64_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT SadCalculation_32x32_64x64, - // AVX2 - SadCalculation_32x32_64x64_SSE2_INTRIN, + // AVX2 + SadCalculation_32x32_64x64_SSE2_INTRIN, }; @@ -128,5 +128,5 @@ static EB_INIALIZEBUFFER_32BITS InitializeBuffer_32bits_funcPtrArray[EB_ASM_TYPE #ifdef __cplusplus } -#endif +#endif #endif // EbMeSadCalculation_h \ No newline at end of file diff --git a/Source/Lib/Codec/EbModeDecision.c b/Source/Lib/Codec/EbModeDecision.c index 811e2e2c3..e136103c1 100644 --- a/Source/Lib/Codec/EbModeDecision.c +++ b/Source/Lib/Codec/EbModeDecision.c @@ -28,13 +28,13 @@ EB_INTRA_MODE_2, EB_INTRA_MODE_6, EB_INTRA_MODE_14, EB_INTRA_MODE_18, EB_INTRA_M EB_BOOL AntiContouringIntraModeValidityPerDepth[35] = { - EB_TRUE, EB_TRUE, + EB_TRUE, EB_TRUE, + EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, - EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE, EB_FALSE, EB_FALSE, EB_FALSE, EB_TRUE @@ -82,7 +82,7 @@ void intraSearchTheseModesOutputBest( EB_U32 candidateIndex; EB_U32 mode; EB_U32 bestSAD = 32 * 32 * 255; - EB_U32 sadCurr; + EB_U32 sadCurr; for (candidateIndex = 0; candidateIndex < NumOfModesToTest; candidateIndex++) { @@ -124,96 +124,96 @@ void intraSearchTheseModesOutputBest( * Mode Decision Candidate Ctor ***************************************/ EB_ERRORTYPE ModeDecisionCandidateBufferCtor( - ModeDecisionCandidateBuffer_t **bufferDblPtr, - EB_U16 lcuMaxSize, - EB_BITDEPTH maxBitdepth, - EB_U64 *fastCostPtr, - EB_U64 *fullCostPtr, - EB_U64 *fullCostSkipPtr, - EB_U64 *fullCostMergePtr) + ModeDecisionCandidateBuffer_t **bufferDblPtr, + EB_U16 lcuMaxSize, + EB_BITDEPTH maxBitdepth, + EB_U64 *fastCostPtr, + EB_U64 *fullCostPtr, + EB_U64 *fullCostSkipPtr, + EB_U64 *fullCostMergePtr) { - EbPictureBufferDescInitData_t pictureBufferDescInitData; - EbPictureBufferDescInitData_t doubleWidthPictureBufferDescInitData; - EB_ERRORTYPE return_error = EB_ErrorNone; - // Allocate Buffer - ModeDecisionCandidateBuffer_t *bufferPtr; - EB_MALLOC(ModeDecisionCandidateBuffer_t*, bufferPtr, sizeof(ModeDecisionCandidateBuffer_t), EB_N_PTR); - *bufferDblPtr = bufferPtr; - - // Init Picture Data - pictureBufferDescInitData.maxWidth = lcuMaxSize; - pictureBufferDescInitData.maxHeight = lcuMaxSize; - pictureBufferDescInitData.bitDepth = maxBitdepth; - pictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; + EbPictureBufferDescInitData_t pictureBufferDescInitData; + EbPictureBufferDescInitData_t doubleWidthPictureBufferDescInitData; + EB_ERRORTYPE return_error = EB_ErrorNone; + // Allocate Buffer + ModeDecisionCandidateBuffer_t *bufferPtr; + EB_MALLOC(ModeDecisionCandidateBuffer_t*, bufferPtr, sizeof(ModeDecisionCandidateBuffer_t), EB_N_PTR); + *bufferDblPtr = bufferPtr; + + // Init Picture Data + pictureBufferDescInitData.maxWidth = lcuMaxSize; + pictureBufferDescInitData.maxHeight = lcuMaxSize; + pictureBufferDescInitData.bitDepth = maxBitdepth; + pictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; pictureBufferDescInitData.colorFormat = EB_YUV420; - pictureBufferDescInitData.leftPadding = 0; - pictureBufferDescInitData.rightPadding = 0; - pictureBufferDescInitData.topPadding = 0; - pictureBufferDescInitData.botPadding = 0; - pictureBufferDescInitData.splitMode = EB_FALSE; - - doubleWidthPictureBufferDescInitData.maxWidth = lcuMaxSize; - doubleWidthPictureBufferDescInitData.maxHeight = lcuMaxSize; - doubleWidthPictureBufferDescInitData.bitDepth = EB_16BIT; - doubleWidthPictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; + pictureBufferDescInitData.leftPadding = 0; + pictureBufferDescInitData.rightPadding = 0; + pictureBufferDescInitData.topPadding = 0; + pictureBufferDescInitData.botPadding = 0; + pictureBufferDescInitData.splitMode = EB_FALSE; + + doubleWidthPictureBufferDescInitData.maxWidth = lcuMaxSize; + doubleWidthPictureBufferDescInitData.maxHeight = lcuMaxSize; + doubleWidthPictureBufferDescInitData.bitDepth = EB_16BIT; + doubleWidthPictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; doubleWidthPictureBufferDescInitData.colorFormat = EB_YUV420; - doubleWidthPictureBufferDescInitData.leftPadding = 0; - doubleWidthPictureBufferDescInitData.rightPadding = 0; - doubleWidthPictureBufferDescInitData.topPadding = 0; - doubleWidthPictureBufferDescInitData.botPadding = 0; - doubleWidthPictureBufferDescInitData.splitMode = EB_FALSE; - - // Candidate Ptr - bufferPtr->candidatePtr = (ModeDecisionCandidate_t*)EB_NULL; - - // Video Buffers - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->predictionPtr), - (EB_PTR)&pictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->residualQuantCoeffPtr), - (EB_PTR)&doubleWidthPictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->reconCoeffPtr), - (EB_PTR)&doubleWidthPictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(bufferPtr->reconPtr), - (EB_PTR)&pictureBufferDescInitData); - - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - //Distortion - bufferPtr->residualLumaSad = 0; - - bufferPtr->fullLambdaRate = 0; - - - // Costs - bufferPtr->fastCostPtr = fastCostPtr; - bufferPtr->fullCostPtr = fullCostPtr; - bufferPtr->fullCostSkipPtr = fullCostSkipPtr; - bufferPtr->fullCostMergePtr = fullCostMergePtr; - return EB_ErrorNone; + doubleWidthPictureBufferDescInitData.leftPadding = 0; + doubleWidthPictureBufferDescInitData.rightPadding = 0; + doubleWidthPictureBufferDescInitData.topPadding = 0; + doubleWidthPictureBufferDescInitData.botPadding = 0; + doubleWidthPictureBufferDescInitData.splitMode = EB_FALSE; + + // Candidate Ptr + bufferPtr->candidatePtr = (ModeDecisionCandidate_t*)EB_NULL; + + // Video Buffers + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->predictionPtr), + (EB_PTR)&pictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->residualQuantCoeffPtr), + (EB_PTR)&doubleWidthPictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->reconCoeffPtr), + (EB_PTR)&doubleWidthPictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(bufferPtr->reconPtr), + (EB_PTR)&pictureBufferDescInitData); + + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + //Distortion + bufferPtr->residualLumaSad = 0; + + bufferPtr->fullLambdaRate = 0; + + + // Costs + bufferPtr->fastCostPtr = fastCostPtr; + bufferPtr->fullCostPtr = fullCostPtr; + bufferPtr->fullCostSkipPtr = fullCostSkipPtr; + bufferPtr->fullCostMergePtr = fullCostMergePtr; + return EB_ErrorNone; } // Function Declarations void RoundMv( - ModeDecisionCandidate_t *candidateArray, + ModeDecisionCandidate_t *candidateArray, EB_U32 canTotalCnt) { @@ -313,26 +313,26 @@ EB_ERRORTYPE SetMvpClipMVs( * do full reconstruction on. ***************************************/ EB_ERRORTYPE PreModeDecision( - CodingUnit_t *cuPtr, - EB_U32 bufferTotalCount, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 *fullCandidateTotalCountPtr, - EB_U8 *bestCandidateIndexArray, - EB_U8 *disableMergeIndex, + CodingUnit_t *cuPtr, + EB_U32 bufferTotalCount, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 *fullCandidateTotalCountPtr, + EB_U8 *bestCandidateIndexArray, + EB_U8 *disableMergeIndex, EB_BOOL sameFastFullCandidate ) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 fullCandidateIndex; - EB_U32 fullReconCandidateCount; - EB_U32 highestCostIndex; - EB_U64 highestCost; - EB_U32 candIndx = 0, i, j, index; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 fullCandidateIndex; + EB_U32 fullReconCandidateCount; + EB_U32 highestCostIndex; + EB_U64 highestCost; + EB_U32 candIndx = 0, i, j, index; - *fullCandidateTotalCountPtr = bufferTotalCount; + *fullCandidateTotalCountPtr = bufferTotalCount; - //Second, We substract one, because with N buffers we can determine the best N-1 candidates. - //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough + //Second, We substract one, because with N buffers we can determine the best N-1 candidates. + //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough if (sameFastFullCandidate){ fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr)); } @@ -340,11 +340,11 @@ EB_ERRORTYPE PreModeDecision( fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr) - 1); } - //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. - highestCost = *(bufferPtrArray[0]->fastCostPtr); - highestCostIndex = 0; + //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. + highestCost = *(bufferPtrArray[0]->fastCostPtr); + highestCostIndex = 0; - if (bufferTotalCount > 1){ + if (bufferTotalCount > 1){ if (sameFastFullCandidate){ for (i = 0; i < bufferTotalCount; i++) { bestCandidateIndexArray[candIndx++] = (EB_U8)i; @@ -366,35 +366,35 @@ EB_ERRORTYPE PreModeDecision( } } - } - else - bestCandidateIndexArray[0] = 0; - for(i = 0; i < fullReconCandidateCount - 1; ++i) { - for (j = i + 1; j < fullReconCandidateCount; ++j) { - if ((bufferPtrArray[bestCandidateIndexArray[i]]->candidatePtr->type == INTRA_MODE) && - (bufferPtrArray[bestCandidateIndexArray[j]]->candidatePtr->type == INTER_MODE)){ - index = bestCandidateIndexArray[i]; - bestCandidateIndexArray[i] = (EB_U8)bestCandidateIndexArray[j]; - bestCandidateIndexArray[j] = (EB_U8)index; - } - } - } - - // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount - (*fullCandidateTotalCountPtr) = fullReconCandidateCount; - - for (i = 0; i < fullReconCandidateCount; ++i) { - fullCandidateIndex = bestCandidateIndexArray[i]; - - // Next, Set the transformSize - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, GetCodedUnitStats(cuPtr->leafIndex)->size)); - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize >> 1)); + } + else + bestCandidateIndexArray[0] = 0; + for(i = 0; i < fullReconCandidateCount - 1; ++i) { + for (j = i + 1; j < fullReconCandidateCount; ++j) { + if ((bufferPtrArray[bestCandidateIndexArray[i]]->candidatePtr->type == INTRA_MODE) && + (bufferPtrArray[bestCandidateIndexArray[j]]->candidatePtr->type == INTER_MODE)){ + index = bestCandidateIndexArray[i]; + bestCandidateIndexArray[i] = (EB_U8)bestCandidateIndexArray[j]; + bestCandidateIndexArray[j] = (EB_U8)index; + } + } + } + + // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount + (*fullCandidateTotalCountPtr) = fullReconCandidateCount; + + for (i = 0; i < fullReconCandidateCount; ++i) { + fullCandidateIndex = bestCandidateIndexArray[i]; + + // Next, Set the transformSize + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, GetCodedUnitStats(cuPtr->leafIndex)->size)); + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = (EB_U8)(CLIP3(TRANSFORM_MIN_SIZE, TRANSFORM_MAX_SIZE, bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize >> 1)); // Set disableMergeIndex - *disableMergeIndex = bufferPtrArray[fullCandidateIndex]->candidatePtr->type == INTER_MODE ? 1 : *disableMergeIndex; - } + *disableMergeIndex = bufferPtrArray[fullCandidateIndex]->candidatePtr->type == INTER_MODE ? 1 : *disableMergeIndex; + } - return return_error; + return return_error; } static void LimitMvOverBound( @@ -474,18 +474,18 @@ void Me2Nx2NCandidatesInjection( EB_U32 canTotalCnt = (*candidateTotalCnt); const EB_U32 lcuAddr = lcuPtr->index; const EB_U32 cuOriginX = contextPtr->cuOriginX; - const EB_U32 cuOriginY = contextPtr->cuOriginY; + const EB_U32 cuOriginY = contextPtr->cuOriginY; - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - const EB_U32 meTotalCnt = mePuResult->totalMeCandidateIndex; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + const EB_U32 meTotalCnt = mePuResult->totalMeCandidateIndex; - for (meCandidateIndex = 0; meCandidateIndex < meTotalCnt; ++meCandidateIndex) - { + for (meCandidateIndex = 0; meCandidateIndex < meTotalCnt; ++meCandidateIndex) + { - const EB_U32 interDirection = mePuResult->distortionDirection[meCandidateIndex].direction; + const EB_U32 interDirection = mePuResult->distortionDirection[meCandidateIndex].direction; if (interDirection == BI_PRED && pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuPtr->index] == LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE) continue; candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; @@ -529,7 +529,7 @@ void Me2Nx2NCandidatesInjection( } } - candidateArray[canTotalCnt].meDistortion = mePuResult->distortionDirection[meCandidateIndex].distortion; + candidateArray[canTotalCnt].meDistortion = mePuResult->distortionDirection[meCandidateIndex].distortion; candidateArray[canTotalCnt].distortionReady = 1; @@ -590,7 +590,7 @@ void Amvp2Nx2NCandidatesInjection( EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] ) { - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; @@ -764,43 +764,43 @@ EB_S8 EbHevcBIPRED_3x3_X_POS[BIPRED_3x3_REFINMENT_POSITIONS] = {-1, -1, 0, 1, 1 EB_S8 EbHevcBIPRED_3x3_Y_POS[BIPRED_3x3_REFINMENT_POSITIONS] = { 0, 1, 1, 1, 0, -1, -1, -1}; void EbHevcUnipred3x3CandidatesInjection( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, - const SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, - const EB_U32 me2Nx2NTableOffset, - EB_U32 *candidateTotalCnt, - EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], - EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, + const SequenceControlSet_t *sequenceControlSetPtr, + LargestCodingUnit_t *lcuPtr, + const EB_U32 me2Nx2NTableOffset, + EB_U32 *candidateTotalCnt, + EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], + EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] ) { - EB_U32 bipredIndex; - EB_U32 canTotalCnt = (*candidateTotalCnt); + EB_U32 bipredIndex; + EB_U32 canTotalCnt = (*candidateTotalCnt); EB_BOOL mvOutOfPicFlag = EB_FALSE; - const EB_U32 lcuAddr = lcuPtr->index; - const EB_U32 cuOriginX = contextPtr->cuOriginX; - const EB_U32 cuOriginY = contextPtr->cuOriginY; + const EB_U32 lcuAddr = lcuPtr->index; + const EB_U32 cuOriginX = contextPtr->cuOriginX; + const EB_U32 cuOriginY = contextPtr->cuOriginY; - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - // (Best_L0, 8 Best_L1 neighbors) - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { + // (Best_L0, 8 Best_L1 neighbors) + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { - const EB_U32 interDirection = UNI_PRED_LIST_1; + const EB_U32 interDirection = UNI_PRED_LIST_1; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -817,62 +817,62 @@ void EbHevcUnipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // (8 Best_L0 neighbors, Best_L1) : - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { - - const EB_U32 interDirection = UNI_PRED_LIST_0; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; - - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // (8 Best_L0 neighbors, Best_L1) : + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { + + const EB_U32 interDirection = UNI_PRED_LIST_0; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; + + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -889,95 +889,95 @@ void EbHevcUnipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // update the total number of candidates injected - (*candidateTotalCnt) = canTotalCnt; - - - return; + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // update the total number of candidates injected + (*candidateTotalCnt) = canTotalCnt; + + + return; } void EbHevcBipred3x3CandidatesInjection( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, - const SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, - const EB_U32 me2Nx2NTableOffset, - EB_U32 *candidateTotalCnt, - EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], - EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, + const SequenceControlSet_t *sequenceControlSetPtr, + LargestCodingUnit_t *lcuPtr, + const EB_U32 me2Nx2NTableOffset, + EB_U32 *candidateTotalCnt, + EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2], + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2], + EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST] ) { - EB_U32 bipredIndex; - EB_U32 canTotalCnt = (*candidateTotalCnt); + EB_U32 bipredIndex; + EB_U32 canTotalCnt = (*candidateTotalCnt); EB_BOOL mvOutOfPicFlag = EB_FALSE; - const EB_U32 lcuAddr = lcuPtr->index; - const EB_U32 cuOriginX = contextPtr->cuOriginX; - const EB_U32 cuOriginY = contextPtr->cuOriginY; + const EB_U32 lcuAddr = lcuPtr->index; + const EB_U32 cuOriginX = contextPtr->cuOriginX; + const EB_U32 cuOriginY = contextPtr->cuOriginY; - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuAddr][me2Nx2NTableOffset]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - // (Best_L0, 8 Best_L1 neighbors) - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { + // (Best_L0, 8 Best_L1 neighbors) + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { - const EB_U32 interDirection = BI_PRED; + const EB_U32 interDirection = BI_PRED; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -994,63 +994,63 @@ void EbHevcBipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // (8 Best_L0 neighbors, Best_L1) : - for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) - { - - const EB_U32 interDirection = BI_PRED; - candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; - candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; - candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; - - - if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { - RoundMv(candidateArray, - canTotalCnt); - } + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // (8 Best_L0 neighbors, Best_L1) : + for (bipredIndex = 0; bipredIndex < BIPRED_3x3_REFINMENT_POSITIONS; ++bipredIndex) + { + + const EB_U32 interDirection = BI_PRED; + candidateArray[canTotalCnt].motionVector_x_L0 = mePuResult->xMvL0 + EbHevcBIPRED_3x3_X_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_y_L0 = mePuResult->yMvL0 + EbHevcBIPRED_3x3_Y_POS[bipredIndex]; + candidateArray[canTotalCnt].motionVector_x_L1 = mePuResult->xMvL1; + candidateArray[canTotalCnt].motionVector_y_L1 = mePuResult->yMvL1; + + + if (pictureControlSetPtr->ParentPcsPtr->useSubpelFlag == 0) { + RoundMv(candidateArray, + canTotalCnt); + } if (sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0) { mvOutOfPicFlag = CheckForMvOverBound( @@ -1067,52 +1067,52 @@ void EbHevcBipred3x3CandidatesInjection( continue; } - candidateArray[canTotalCnt].distortionReady = 0; - - candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; - - candidateArray[canTotalCnt].type = INTER_MODE; - candidateArray[canTotalCnt].mergeFlag = EB_FALSE; - if (contextPtr->generateAmvpTableMd == EB_FALSE) - { - // TODO: Clips mvs along with Limit mvs - SetMvpClipMVs( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - pictureControlSetPtr - ); - - } - else - { - - ChooseMVPIdx_V2( - &candidateArray[canTotalCnt], - cuOriginX, - cuOriginY, - 0, - sequenceControlSetPtr->lcuSize, - firstPuAMVPCandArray_x[REF_LIST_0], - firstPuAMVPCandArray_y[REF_LIST_0], - firstPuNumAvailableAMVPCand[REF_LIST_0], - firstPuAMVPCandArray_x[REF_LIST_1], - firstPuAMVPCandArray_y[REF_LIST_1], - firstPuNumAvailableAMVPCand[REF_LIST_1], - pictureControlSetPtr); - - } - - - canTotalCnt++; - } - - // update the total number of candidates injected - (*candidateTotalCnt) = canTotalCnt; - - return; + candidateArray[canTotalCnt].distortionReady = 0; + + candidateArray[canTotalCnt].predictionDirection[0] = (EB_PREDDIRECTION)interDirection; + + candidateArray[canTotalCnt].type = INTER_MODE; + candidateArray[canTotalCnt].mergeFlag = EB_FALSE; + if (contextPtr->generateAmvpTableMd == EB_FALSE) + { + // TODO: Clips mvs along with Limit mvs + SetMvpClipMVs( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + pictureControlSetPtr + ); + + } + else + { + + ChooseMVPIdx_V2( + &candidateArray[canTotalCnt], + cuOriginX, + cuOriginY, + 0, + sequenceControlSetPtr->lcuSize, + firstPuAMVPCandArray_x[REF_LIST_0], + firstPuAMVPCandArray_y[REF_LIST_0], + firstPuNumAvailableAMVPCand[REF_LIST_0], + firstPuAMVPCandArray_x[REF_LIST_1], + firstPuAMVPCandArray_y[REF_LIST_1], + firstPuNumAvailableAMVPCand[REF_LIST_1], + pictureControlSetPtr); + + } + + + canTotalCnt++; + } + + // update the total number of candidates injected + (*candidateTotalCnt) = canTotalCnt; + + return; } @@ -1137,8 +1137,8 @@ void ProductIntraCandidateInjection( const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; if (contextPtr->intraInjectionMethod == 2) { EB_U8 totModes = MAX_INTRA_MODES; @@ -1193,13 +1193,13 @@ void ProductIntraCandidateInjection( if (cuSize > 8) { const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; } else { - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; oisCandidate = oisCu8ResultsPtr->sortedOisCandidate[contextPtr->cuStats->cuNumInDepth]; totalIntraLumaMode = oisCu8ResultsPtr->totalIntraLumaMode[contextPtr->cuStats->cuNumInDepth]; } @@ -1258,7 +1258,7 @@ void ProductIntraCandidateInjection( else if (cuSize == 16) { const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; const EB_U32 totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; @@ -1296,7 +1296,7 @@ void ProductIntraCandidateInjection( } else { - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu8ResultsPtr->sortedOisCandidate[contextPtr->cuStats->cuNumInDepth]; const EB_U32 totalIntraLumaMode = oisCu8ResultsPtr->totalIntraLumaMode[contextPtr->cuStats->cuNumInDepth]; @@ -1337,7 +1337,7 @@ void ProductIntraCandidateInjection( { const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; const OisCandidate_t *oisCandidate = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]->sortedOisCandidate[me2Nx2NTableOffset]; - EB_U32 bestSAD; + EB_U32 bestSAD; EB_U32 bestAngMode = 0; EB_U8 numOfModesToSearch = GetNumOfIntraModesFromOisPoint( @@ -1405,7 +1405,7 @@ void ProductIntraCandidateInjection( const EB_U32 me2Nx2NTableOffset = contextPtr->cuStats->cuNumInDepth + me2Nx2NOffset[contextPtr->cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; const EB_U32 totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; @@ -1433,21 +1433,21 @@ void ProductIntraCandidateInjection( } } - else if (cuSize == 16) { - if (limitIntra == 0 || (isLeftCu == 0 && isTopCu == 0)) - { - candidateArray[canTotalCnt].type = INTRA_MODE; - candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_DC; - candidateArray[canTotalCnt].distortionReady = 0; - canTotalCnt++; - - candidateArray[canTotalCnt].type = INTRA_MODE; - candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_PLANAR; - candidateArray[canTotalCnt].distortionReady = 0; - canTotalCnt++; - } + else if (cuSize == 16) { + if (limitIntra == 0 || (isLeftCu == 0 && isTopCu == 0)) + { + candidateArray[canTotalCnt].type = INTRA_MODE; + candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_DC; + candidateArray[canTotalCnt].distortionReady = 0; + canTotalCnt++; + + candidateArray[canTotalCnt].type = INTRA_MODE; + candidateArray[canTotalCnt].intraLumaMode = EB_INTRA_PLANAR; + candidateArray[canTotalCnt].distortionReady = 0; + canTotalCnt++; + } - } + } else if (pictureControlSetPtr->ParentPcsPtr->cu8x8Mode == CU_8x8_MODE_1) { @@ -1466,7 +1466,7 @@ void ProductIntraCandidateInjection( if (lcuParams->isCompleteLcu) { const CodedUnitStats_t *cuStats = GetCodedUnitStats(EbHevcParentIndex[leafIndex]); const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset]; const EB_U32 totalIntraLumaMode = oisCu32Cu16ResultsPtr->totalIntraLumaMode[me2Nx2NTableOffset]; @@ -1512,7 +1512,7 @@ void ProductIntraCandidateInjection( } } else { - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuAddr]; const OisCandidate_t *oisCandidate = oisCu8ResultsPtr->sortedOisCandidate[contextPtr->cuStats->cuNumInDepth]; const EB_U32 totalIntraLumaMode = oisCu8ResultsPtr->totalIntraLumaMode[contextPtr->cuStats->cuNumInDepth]; @@ -1623,7 +1623,7 @@ static EB_BOOL CheckForMvOverBound( static void ProductMergeSkip2Nx2NCandidatesInjection( ModeDecisionContext_t *contextPtr, const SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, + LargestCodingUnit_t *lcuPtr, InterPredictionContext_t *interPredictionPtr, EB_U32 *candidateTotalCnt, EB_U32 mvMergeCandidateTotalCount @@ -1635,7 +1635,7 @@ static void ProductMergeSkip2Nx2NCandidatesInjection( EB_U32 duplicateIndex; EB_BOOL mvMergeDuplicateFlag = EB_FALSE; EB_BOOL mvOutOfPicFlag = EB_FALSE; - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; while (mvMergeCandidateTotalCount) { @@ -1718,18 +1718,18 @@ static void ProductMergeSkip2Nx2NCandidatesInjection( void ProductMpmCandidatesInjection( ModeDecisionContext_t *contextPtr, EB_U32 *candidateTotalCnt, - EB_U32 *bufferTotalCountPtr, - EB_BOOL mpmSearch, - EB_U8 mpmSearchCandidate, - EB_U32 *mostProbableModeArray + EB_U32 *bufferTotalCountPtr, + EB_BOOL mpmSearch, + EB_U8 mpmSearchCandidate, + EB_U32 *mostProbableModeArray ) { const EB_U32 cuDepth = contextPtr->cuStats->depth; EB_U32 canTotalCnt = (*candidateTotalCnt); EB_U32 fastLoopCandidate = 0; - EB_U32 candidateIndex; - EB_U32 mostProbableModeCount; + EB_U32 candidateIndex; + EB_U32 mostProbableModeCount; EB_BOOL mpmPresentFlag; #ifdef LIMITINRA_MPM_PATCH @@ -1741,7 +1741,7 @@ void ProductMpmCandidatesInjection( const EB_U8 limitTopMode = cuSize < 32 ? EB_INTRA_MODE_9 : EB_INTRA_HORIZONTAL; #endif - ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidate_t *candidateArray = contextPtr->fastCandidateArray; if (mpmSearch && cuDepth != 0){ @@ -1808,46 +1808,46 @@ void ProductMpmCandidatesInjection( * perform fast cost search on. ***************************************/ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( - LargestCodingUnit_t *lcuPtr, - ModeDecisionContext_t *contextPtr, - const EB_U32 leafIndex, - const EB_U32 lcuAddr, - EB_U32 *bufferTotalCountPtr, - EB_U32 *candidateTotalCountPtr, - EB_PTR interPredContextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL mpmSearch, - EB_U8 mpmSearchCandidate, - EB_U32 *mostProbableModeArray) + LargestCodingUnit_t *lcuPtr, + ModeDecisionContext_t *contextPtr, + const EB_U32 leafIndex, + const EB_U32 lcuAddr, + EB_U32 *bufferTotalCountPtr, + EB_U32 *candidateTotalCountPtr, + EB_PTR interPredContextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL mpmSearch, + EB_U8 mpmSearchCandidate, + EB_U32 *mostProbableModeArray) { - InterPredictionContext_t *interPredictionPtr = (InterPredictionContext_t*)interPredContextPtr; - const SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - // const LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuAddr]; - const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + InterPredictionContext_t *interPredictionPtr = (InterPredictionContext_t*)interPredContextPtr; + const SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + // const LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuAddr]; + const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - EB_U32 fullReconSearchCount = contextPtr->fullReconSearchCount; - // AMVP + EB_U32 fullReconSearchCount = contextPtr->fullReconSearchCount; + // AMVP EB_S16 firstPuAMVPCandArray_x[MAX_NUM_OF_REF_PIC_LIST][2] ; - EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ; - EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST]; - const EB_U32 cuNumberInDepth = contextPtr->cuStats->cuNumInDepth; + EB_S16 firstPuAMVPCandArray_y[MAX_NUM_OF_REF_PIC_LIST][2] ; + EB_U32 firstPuNumAvailableAMVPCand[MAX_NUM_OF_REF_PIC_LIST]; + const EB_U32 cuNumberInDepth = contextPtr->cuStats->cuNumInDepth; const EB_U32 cuDepth = contextPtr->cuStats->depth; - const EB_U32 me2Nx2NTableOffset = cuNumberInDepth + me2Nx2NOffset[cuDepth]; - EB_U32 mvMergeCandidateTotalCount = contextPtr->mvMergeSkipModeCount; - EB_S16 amvpArray_x[MAX_NUM_OF_REF_PIC_LIST][2]; - EB_S16 amvpArray_y[MAX_NUM_OF_REF_PIC_LIST][2]; - EB_U32 canTotalCnt = 0; + const EB_U32 me2Nx2NTableOffset = cuNumberInDepth + me2Nx2NOffset[cuDepth]; + EB_U32 mvMergeCandidateTotalCount = contextPtr->mvMergeSkipModeCount; + EB_S16 amvpArray_x[MAX_NUM_OF_REF_PIC_LIST][2]; + EB_S16 amvpArray_y[MAX_NUM_OF_REF_PIC_LIST][2]; + EB_U32 canTotalCnt = 0; - //---------------------- - // Intra - //---------------------- + //---------------------- + // Intra + //---------------------- if (cuDepth != 0 && (sliceType == EB_I_PICTURE || cuDepth == 3 || contextPtr->restrictIntraGlobalMotion == EB_FALSE)) { - const EB_BOOL isLeftCu = contextPtr->cuStats->originX == 0; - const EB_BOOL isTopCu = contextPtr->cuStats->originY == 0; - EB_BOOL limitIntraLoptLeft = contextPtr->limitIntra == EB_TRUE && isLeftCu && isTopCu; - if (limitIntraLoptLeft == 0) + const EB_BOOL isLeftCu = contextPtr->cuStats->originX == 0; + const EB_BOOL isTopCu = contextPtr->cuStats->originY == 0; + EB_BOOL limitIntraLoptLeft = contextPtr->limitIntra == EB_TRUE && isLeftCu && isTopCu; + if (limitIntraLoptLeft == 0) ProductIntraCandidateInjection( // HT not much to do pictureControlSetPtr, @@ -1855,8 +1855,8 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( sequenceControlSetPtr, lcuPtr, &canTotalCnt, - leafIndex - ); + leafIndex + ); } if (sliceType != EB_I_PICTURE) @@ -1903,20 +1903,20 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( firstPuAMVPCandArray_y, firstPuNumAvailableAMVPCand); - if (contextPtr->amvpInjection) { - - //---------------------- - // Amvp2Nx2N - //---------------------- - Amvp2Nx2NCandidatesInjection( - pictureControlSetPtr, - contextPtr, - sequenceControlSetPtr, - &canTotalCnt, - firstPuAMVPCandArray_x, - firstPuAMVPCandArray_y, - firstPuNumAvailableAMVPCand); - } + if (contextPtr->amvpInjection) { + + //---------------------- + // Amvp2Nx2N + //---------------------- + Amvp2Nx2NCandidatesInjection( + pictureControlSetPtr, + contextPtr, + sequenceControlSetPtr, + &canTotalCnt, + firstPuAMVPCandArray_x, + firstPuAMVPCandArray_y, + firstPuNumAvailableAMVPCand); + } if (pictureControlSetPtr->sliceType == EB_B_PICTURE) { if (contextPtr->bipred3x3Injection) { @@ -1953,38 +1953,38 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( } } - //---------------------- - // MergeSkip2Nx2N - //---------------------- - if (mvMergeCandidateTotalCount) { - ProductMergeSkip2Nx2NCandidatesInjection( // HT not much to do - contextPtr, - sequenceControlSetPtr, + //---------------------- + // MergeSkip2Nx2N + //---------------------- + if (mvMergeCandidateTotalCount) { + ProductMergeSkip2Nx2NCandidatesInjection( // HT not much to do + contextPtr, + sequenceControlSetPtr, lcuPtr, - interPredictionPtr, - &canTotalCnt, - mvMergeCandidateTotalCount); - } + interPredictionPtr, + &canTotalCnt, + mvMergeCandidateTotalCount); + } - } + } - // Set BufferTotalCount: determines the number of candidates to fully reconstruct - *bufferTotalCountPtr = fullReconSearchCount; + // Set BufferTotalCount: determines the number of candidates to fully reconstruct + *bufferTotalCountPtr = fullReconSearchCount; - // Mark MPM candidates, and update the number of full recon - MPM candidates are going to get pushed to the full, - // however they still need to be tested in the fast loop where the predicted, and the fast rate are going to get computed + // Mark MPM candidates, and update the number of full recon - MPM candidates are going to get pushed to the full, + // however they still need to be tested in the fast loop where the predicted, and the fast rate are going to get computed #ifdef LIMITINRA_MPM_PATCH const EB_BOOL isLeftCu = contextPtr->cuStats->originX == 0; const EB_BOOL isTopCu = contextPtr->cuStats->originY == 0; EB_BOOL limitIntraLoptLeft = contextPtr->limitIntra == EB_TRUE && isLeftCu && isTopCu; if (limitIntraLoptLeft == 0) - ProductMpmCandidatesInjection( - contextPtr, - &canTotalCnt, - bufferTotalCountPtr, - mpmSearch, - mpmSearchCandidate, - mostProbableModeArray); + ProductMpmCandidatesInjection( + contextPtr, + &canTotalCnt, + bufferTotalCountPtr, + mpmSearch, + mpmSearchCandidate, + mostProbableModeArray); #else ProductMpmCandidatesInjection( @@ -1996,12 +1996,12 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( mostProbableModeArray); #endif - *candidateTotalCountPtr = canTotalCnt; + *candidateTotalCountPtr = canTotalCnt; - // Make sure bufferTotalCount is not larger than the number of fast modes - *bufferTotalCountPtr = MIN(*candidateTotalCountPtr, *bufferTotalCountPtr); + // Make sure bufferTotalCount is not larger than the number of fast modes + *bufferTotalCountPtr = MIN(*candidateTotalCountPtr, *bufferTotalCountPtr); - return EB_ErrorNone; + return EB_ErrorNone; } /*************************************** @@ -2009,191 +2009,191 @@ EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( ***************************************/ EB_U8 ProductFullModeDecision( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - EB_U8 cuSize, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 candidateTotalCount, - EB_U8 *bestCandidateIndexArray, - EB_U32 *bestIntraMode) + CodingUnit_t *cuPtr, + EB_U8 cuSize, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 candidateTotalCount, + EB_U8 *bestCandidateIndexArray, + EB_U32 *bestIntraMode) { - EB_U8 candidateIndex; - EB_U64 lowestCost = 0xFFFFFFFFFFFFFFFFull; - EB_U64 lowestIntraCost = 0xFFFFFFFFFFFFFFFFull; - EB_U8 lowestCostIndex = 0; - PredictionUnit_t *puPtr; + EB_U8 candidateIndex; + EB_U64 lowestCost = 0xFFFFFFFFFFFFFFFFull; + EB_U64 lowestIntraCost = 0xFFFFFFFFFFFFFFFFull; + EB_U8 lowestCostIndex = 0; + PredictionUnit_t *puPtr; EB_U32 i; - ModeDecisionCandidate_t *candidatePtr; + ModeDecisionCandidate_t *candidatePtr; - lowestCostIndex = bestCandidateIndexArray[0]; + lowestCostIndex = bestCandidateIndexArray[0]; - // Find the candidate with the lowest cost - for (i = 0; i < candidateTotalCount; ++i) { + // Find the candidate with the lowest cost + for (i = 0; i < candidateTotalCount; ++i) { - candidateIndex = bestCandidateIndexArray[i]; + candidateIndex = bestCandidateIndexArray[i]; - // Compute fullCostBis + // Compute fullCostBis if (( *(bufferPtrArray[candidateIndex]->fullCostPtr) < lowestIntraCost) && bufferPtrArray[candidateIndex]->candidatePtr->type == INTRA_MODE){ - *bestIntraMode = bufferPtrArray[candidateIndex]->candidatePtr->intraLumaMode; - lowestIntraCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); + *bestIntraMode = bufferPtrArray[candidateIndex]->candidatePtr->intraLumaMode; + lowestIntraCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); - } + } - if ( *(bufferPtrArray[candidateIndex]->fullCostPtr) < lowestCost){ - lowestCostIndex = candidateIndex; - lowestCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); - } + if ( *(bufferPtrArray[candidateIndex]->fullCostPtr) < lowestCost){ + lowestCostIndex = candidateIndex; + lowestCost = *(bufferPtrArray[candidateIndex]->fullCostPtr); + } - } + } - candidatePtr = bufferPtrArray[lowestCostIndex]->candidatePtr; + candidatePtr = bufferPtrArray[lowestCostIndex]->candidatePtr; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *(bufferPtrArray[lowestCostIndex]->fullCostPtr); - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion) + bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *(bufferPtrArray[lowestCostIndex]->fullCostPtr); + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion) + bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; if(candidatePtr->type==INTRA_MODE) - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma = bufferPtrArray[lowestCostIndex]->fullCostLuma; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *bufferPtrArray[lowestCostIndex]->fullCostMergePtr; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *bufferPtrArray[lowestCostIndex]->fullCostSkipPtr; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma = bufferPtrArray[lowestCostIndex]->fullCostLuma; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *bufferPtrArray[lowestCostIndex]->fullCostMergePtr; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *bufferPtrArray[lowestCostIndex]->fullCostSkipPtr; if(candidatePtr->type == INTER_MODE && candidatePtr->mergeFlag == EB_TRUE){ contextPtr->mdEpPipeLcu[cuPtr->leafIndex].chromaDistortion = bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion; } - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = bufferPtrArray[lowestCostIndex]->candidatePtr->fullDistortion; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortion = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortionInterDepth = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; - cuPtr->predictionModeFlag = candidatePtr->type; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = bufferPtrArray[lowestCostIndex]->candidatePtr->fullDistortion; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortion = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortion; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].chromaDistortionInterDepth = (EB_U32)bufferPtrArray[lowestCostIndex]->candidatePtr->chromaDistortionInterDepth; + cuPtr->predictionModeFlag = candidatePtr->type; cuPtr->skipFlag = candidatePtr->skipFlag; // note, the skip flag is re-checked in the ENCDEC process cuPtr->rootCbf = ((candidatePtr->rootCbf) > 0) ? EB_TRUE : EB_FALSE; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].countNonZeroCoeffs = candidatePtr->countNonZeroCoeffs; - // Set the PU level variables - - { - puPtr = cuPtr->predictionUnitArray; - // Intra Prediction - puPtr->intraLumaMode = 0x1F; - if (cuPtr->predictionModeFlag == INTRA_MODE) - { - puPtr->intraLumaMode = candidatePtr->intraLumaMode; - } - - // Inter Prediction - puPtr->interPredDirectionIndex = candidatePtr->predictionDirection[0]; - puPtr->mergeFlag = candidatePtr->mergeFlag; - if (cuPtr->predictionModeFlag != INTER_MODE) - { - puPtr->interPredDirectionIndex = 0x03; - puPtr->mergeFlag = EB_FALSE; - } - puPtr->mergeIndex = candidatePtr->mergeIndex; - puPtr->mv[REF_LIST_0].x = 0; - puPtr->mv[REF_LIST_0].y = 0; - - puPtr->mv[REF_LIST_1].x = 0; - puPtr->mv[REF_LIST_1].y = 0; - - if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_0) - { - //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVsL0,4); - puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; - puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; - } - - if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) - { - //EB_MEMCPY(&puPtr->mv[REF_LIST_1].x,&candidatePtr->MVsL1,4); - puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; - puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; - } - - if (puPtr->interPredDirectionIndex == BI_PRED) - { - //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVs,8); - puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; - puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; - puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; - puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; - } + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].countNonZeroCoeffs = candidatePtr->countNonZeroCoeffs; + // Set the PU level variables + + { + puPtr = cuPtr->predictionUnitArray; + // Intra Prediction + puPtr->intraLumaMode = 0x1F; + if (cuPtr->predictionModeFlag == INTRA_MODE) + { + puPtr->intraLumaMode = candidatePtr->intraLumaMode; + } + + // Inter Prediction + puPtr->interPredDirectionIndex = candidatePtr->predictionDirection[0]; + puPtr->mergeFlag = candidatePtr->mergeFlag; + if (cuPtr->predictionModeFlag != INTER_MODE) + { + puPtr->interPredDirectionIndex = 0x03; + puPtr->mergeFlag = EB_FALSE; + } + puPtr->mergeIndex = candidatePtr->mergeIndex; + puPtr->mv[REF_LIST_0].x = 0; + puPtr->mv[REF_LIST_0].y = 0; + + puPtr->mv[REF_LIST_1].x = 0; + puPtr->mv[REF_LIST_1].y = 0; + + if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_0) + { + //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVsL0,4); + puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; + puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; + } + + if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) + { + //EB_MEMCPY(&puPtr->mv[REF_LIST_1].x,&candidatePtr->MVsL1,4); + puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; + puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; + } + + if (puPtr->interPredDirectionIndex == BI_PRED) + { + //EB_MEMCPY(&puPtr->mv[REF_LIST_0].x,&candidatePtr->MVs,8); + puPtr->mv[REF_LIST_0].x = candidatePtr->motionVector_x_L0; + puPtr->mv[REF_LIST_0].y = candidatePtr->motionVector_y_L0; + puPtr->mv[REF_LIST_1].x = candidatePtr->motionVector_x_L1; + puPtr->mv[REF_LIST_1].y = candidatePtr->motionVector_y_L1; + } // The MV prediction indicies are recalcated by the EncDec. puPtr->mvd[REF_LIST_0].predIdx = 0; puPtr->mvd[REF_LIST_1].predIdx = 0; - } + } TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStatPtr; - EB_U32 tuItr; - EB_U32 tuSize; - EB_U32 tuIndex; + const TransformUnitStats_t *tuStatPtr; + EB_U32 tuItr; + EB_U32 tuSize; + EB_U32 tuIndex; - EB_U32 parentTuIndex; + EB_U32 parentTuIndex; - EB_U32 tuTotalCount; + EB_U32 tuTotalCount; EB_U32 cuSizeLog2 = contextPtr->cuSizeLog2; if (cuSize == MAX_LCU_SIZE){ - tuTotalCount = 4; - tuIndex = 1; - tuItr = 0; - tuPtr = &cuPtr->transformUnitArray[0]; - tuPtr->splitFlag = EB_TRUE; - tuPtr->cbCbf = EB_FALSE; - tuPtr->crCbf = EB_FALSE; - - // Set TU variables + tuTotalCount = 4; + tuIndex = 1; + tuItr = 0; + tuPtr = &cuPtr->transformUnitArray[0]; + tuPtr->splitFlag = EB_TRUE; + tuPtr->cbCbf = EB_FALSE; + tuPtr->crCbf = EB_FALSE; + + // Set TU variables + tuPtr->cbCbf2 = EB_FALSE; + tuPtr->crCbf2 = EB_FALSE; + tuPtr->chromaCbfContext = 0; //at TU level + } + else { + tuTotalCount = 1; + tuIndex = 0; + tuItr = 0; + } + + //cuPtr->forceSmallTu = candidatePtr->forceSmallTu; + + // Set TU + do { + tuStatPtr = GetTransformUnitStats(tuIndex); + tuSize = cuSize >> tuStatPtr->depth; + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + parentTuIndex = 0; + if (tuStatPtr->depth > 0) + parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; + + tuPtr->splitFlag = EB_FALSE; + tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); + tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); + tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); tuPtr->cbCbf2 = EB_FALSE; tuPtr->crCbf2 = EB_FALSE; - tuPtr->chromaCbfContext = 0; //at TU level - } - else { - tuTotalCount = 1; - tuIndex = 0; - tuItr = 0; - } - - //cuPtr->forceSmallTu = candidatePtr->forceSmallTu; - - // Set TU - do { - tuStatPtr = GetTransformUnitStats(tuIndex); - tuSize = cuSize >> tuStatPtr->depth; - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - parentTuIndex = 0; - if (tuStatPtr->depth > 0) - parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; - - tuPtr->splitFlag = EB_FALSE; - tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); - tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); - tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); - tuPtr->cbCbf2 = EB_FALSE; - tuPtr->crCbf2 = EB_FALSE; //CHKN tuPtr->chromaCbfContext = (tuIndex == 0 || (cuPtr->partitionMode == SIZE_NxN)) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level tuPtr->chromaCbfContext = (tuIndex == 0 || (0)) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level tuPtr->lumaCbfContext = (cuSizeLog2 - Log2f(tuSize)) == 0 ? 1 : 0; - if (tuPtr->cbCbf){ - cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; - } - if (tuPtr->crCbf){ - cuPtr->transformUnitArray[0].crCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; - } + if (tuPtr->cbCbf){ + cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; + } + if (tuPtr->crCbf){ + cuPtr->transformUnitArray[0].crCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; + } - ++tuItr; - tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + ++tuItr; + tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; - } while (tuItr < tuTotalCount); + } while (tuItr < tuTotalCount); - return lowestCostIndex; + return lowestCostIndex; } diff --git a/Source/Lib/Codec/EbModeDecision.h b/Source/Lib/Codec/EbModeDecision.h index d4bd0d364..8e9df3c2c 100644 --- a/Source/Lib/Codec/EbModeDecision.h +++ b/Source/Lib/Codec/EbModeDecision.h @@ -22,87 +22,87 @@ extern "C" { #endif #define ENABLE_AMVP_MV_FOR_RC_PU 0 -#define MAX_MPM_CANDIDATES 3 +#define MAX_MPM_CANDIDATES 3 - static const EB_U32 tuIndexList[3][16] = - { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 }, - { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 } - }; + static const EB_U32 tuIndexList[3][16] = + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 }, + { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 } + }; #define MERGE_PENALTY 10 - // Create incomplete struct definition for the following function pointer typedefs - struct ModeDecisionCandidateBuffer_s; - struct ModeDecisionContext_s; + // Create incomplete struct definition for the following function pointer typedefs + struct ModeDecisionCandidateBuffer_s; + struct ModeDecisionContext_s; - /************************************** - * Function Ptrs Definitions - **************************************/ + /************************************** + * Function Ptrs Definitions + **************************************/ typedef EB_ERRORTYPE(*EB_PREDICTION_FUNC)( - struct ModeDecisionContext_s *contextPtr, - EB_U32 componentMask, - PictureControlSet_t *pictureControlSetPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr); + struct ModeDecisionContext_s *contextPtr, + EB_U32 componentMask, + PictureControlSet_t *pictureControlSetPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr); - typedef EB_ERRORTYPE(*EB_FAST_COST_FUNC)( + typedef EB_ERRORTYPE(*EB_FAST_COST_FUNC)( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); - - typedef EB_ERRORTYPE(*EB_FULL_COST_FUNC)( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); - - typedef EB_ERRORTYPE(*EB_FULL_LUMA_COST_FUNC)( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize); - - /************************************** - * Mode Decision Candidate - **************************************/ - typedef struct ModeDecisionCandidate_s - { - // *Warning - this struct has been organized to be cache efficient when being - // constructured in the function GenerateAmvpMergeInterIntraMdCandidatesCU. - // Changing the ordering could affect performance - - union { - struct { - unsigned meDistortion : 20; - unsigned distortionReady : 1; - unsigned : 3; - unsigned intraLumaMode : 8; - }; - EB_U32 oisResults; - }; + CodingUnit_t *cuPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); + + typedef EB_ERRORTYPE(*EB_FULL_COST_FUNC)( + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr); + + typedef EB_ERRORTYPE(*EB_FULL_LUMA_COST_FUNC)( + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize); + + /************************************** + * Mode Decision Candidate + **************************************/ + typedef struct ModeDecisionCandidate_s + { + // *Warning - this struct has been organized to be cache efficient when being + // constructured in the function GenerateAmvpMergeInterIntraMdCandidatesCU. + // Changing the ordering could affect performance + + union { + struct { + unsigned meDistortion : 20; + unsigned distortionReady : 1; + unsigned : 3; + unsigned intraLumaMode : 8; + }; + EB_U32 oisResults; + }; union { struct{ union { @@ -125,211 +125,211 @@ typedef EB_ERRORTYPE(*EB_PREDICTION_FUNC)( EB_U64 MVs; }; - EB_U8 skipFlag; - EB_BOOL mergeFlag; - EB_U8 mergeIndex; + EB_U8 skipFlag; + EB_BOOL mergeFlag; + EB_U8 mergeIndex; EB_U16 countNonZeroCoeffs; - EB_BOOL predictionIsReady; - EB_BOOL predictionIsReadyLuma; - EB_U8 type; - EB_BOOL mpmFlag; - - // MD Rate Estimation Ptr - MdRateEstimationContext_t *mdRateEstimationPtr; // 64 bits - EB_U64 fastLumaRate; - EB_U64 fastChromaRate; - EB_U64 chromaDistortion; - EB_U64 chromaDistortionInterDepth; - EB_U32 lumaDistortion; - EB_U32 fullDistortion; - EB_U32 fastLoopLumaDistortion; - - // Function Pointers - EB_PTR predictionContextPtr; - EB_FAST_COST_FUNC fastCostFuncPtr; - EB_FULL_COST_FUNC fullCostFuncPtr; - EB_FULL_LUMA_COST_FUNC fullLumaCostFuncPtr; - EB_PREDDIRECTION predictionDirection[MAX_NUM_OF_PU_PER_CU]; // 2 bits - - - EB_S16 motionVectorPred_x[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits - EB_S16 motionVectorPred_y[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits - EB_U8 motionVectorPredIdx[MAX_NUM_OF_REF_PIC_LIST]; // 2 bits - EB_U8 transformSize; // 8 bit - EB_U8 transformChromaSize; // 8 bit - EB_U8 rootCbf; // ?? bit - determine empirically - EB_U8 cbCbf; // ?? bit - EB_U8 crCbf; // ?? bit + EB_BOOL predictionIsReady; + EB_BOOL predictionIsReadyLuma; + EB_U8 type; + EB_BOOL mpmFlag; + + // MD Rate Estimation Ptr + MdRateEstimationContext_t *mdRateEstimationPtr; // 64 bits + EB_U64 fastLumaRate; + EB_U64 fastChromaRate; + EB_U64 chromaDistortion; + EB_U64 chromaDistortionInterDepth; + EB_U32 lumaDistortion; + EB_U32 fullDistortion; + EB_U32 fastLoopLumaDistortion; + + // Function Pointers + EB_PTR predictionContextPtr; + EB_FAST_COST_FUNC fastCostFuncPtr; + EB_FULL_COST_FUNC fullCostFuncPtr; + EB_FULL_LUMA_COST_FUNC fullLumaCostFuncPtr; + EB_PREDDIRECTION predictionDirection[MAX_NUM_OF_PU_PER_CU]; // 2 bits + + + EB_S16 motionVectorPred_x[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits + EB_S16 motionVectorPred_y[MAX_NUM_OF_REF_PIC_LIST]; // 16 bits + EB_U8 motionVectorPredIdx[MAX_NUM_OF_REF_PIC_LIST]; // 2 bits + EB_U8 transformSize; // 8 bit + EB_U8 transformChromaSize; // 8 bit + EB_U8 rootCbf; // ?? bit - determine empirically + EB_U8 cbCbf; // ?? bit + EB_U8 crCbf; // ?? bit EB_U32 yCbf; // Issue, should be less than 32 - - } ModeDecisionCandidate_t; - /************************************** - * Mode Decision Candidate Buffer - **************************************/ - typedef struct IntraChromaCandidateBuffer_s { - EB_U32 mode; - EB_U64 cost; - EB_U64 distortion; + } ModeDecisionCandidate_t; + + /************************************** + * Mode Decision Candidate Buffer + **************************************/ + typedef struct IntraChromaCandidateBuffer_s { + EB_U32 mode; + EB_U64 cost; + EB_U64 distortion; - EbPictureBufferDesc_t *predictionPtr; - EbPictureBufferDesc_t *residualPtr; + EbPictureBufferDesc_t *predictionPtr; + EbPictureBufferDesc_t *residualPtr; - } IntraChromaCandidateBuffer_t; + } IntraChromaCandidateBuffer_t; - /************************************** - * Mode Decision Candidate Buffer - **************************************/ - typedef struct ModeDecisionCandidateBuffer_s { - // Candidate Ptr - ModeDecisionCandidate_t *candidatePtr; + /************************************** + * Mode Decision Candidate Buffer + **************************************/ + typedef struct ModeDecisionCandidateBuffer_s { + // Candidate Ptr + ModeDecisionCandidate_t *candidatePtr; - // Video Buffers - EbPictureBufferDesc_t *predictionPtr; - EbPictureBufferDesc_t *residualQuantCoeffPtr;// One buffer for residual and quantized coefficient - EbPictureBufferDesc_t *reconCoeffPtr; + // Video Buffers + EbPictureBufferDesc_t *predictionPtr; + EbPictureBufferDesc_t *residualQuantCoeffPtr;// One buffer for residual and quantized coefficient + EbPictureBufferDesc_t *reconCoeffPtr; - // *Note - We should be able to combine the reconCoeffPtr & reconPtr pictures (they aren't needed at the same time) - EbPictureBufferDesc_t *reconPtr; + // *Note - We should be able to combine the reconCoeffPtr & reconPtr pictures (they aren't needed at the same time) + EbPictureBufferDesc_t *reconPtr; - // Distortion (SAD) - EB_U64 residualLumaSad; + // Distortion (SAD) + EB_U64 residualLumaSad; - EB_U64 fullLambdaRate; + EB_U64 fullLambdaRate; EB_U64 fullCostLuma; - // Costs - EB_U64 *fastCostPtr; - EB_U64 *fullCostPtr; - EB_U64 fullCostPlusCuBoundDist; // fullCostPlusCuBoundDist= fullCost + CU boundaries distortion if derived otherwise fullCostPlusCuBoundDist = fullCost - - EB_U64 *fullCostSkipPtr; - EB_U64 *fullCostMergePtr; - // - EB_U64 cbCoeffBits; - EB_U64 cbDistortion[2]; - EB_U64 crCoeffBits; - EB_U64 crDistortion[2]; - EB_U64 fullCostNoAc; - CoeffCtxtMdl_t candBuffCoeffCtxModel; + // Costs + EB_U64 *fastCostPtr; + EB_U64 *fullCostPtr; + EB_U64 fullCostPlusCuBoundDist; // fullCostPlusCuBoundDist= fullCost + CU boundaries distortion if derived otherwise fullCostPlusCuBoundDist = fullCost + + EB_U64 *fullCostSkipPtr; + EB_U64 *fullCostMergePtr; + // + EB_U64 cbCoeffBits; + EB_U64 cbDistortion[2]; + EB_U64 crCoeffBits; + EB_U64 crDistortion[2]; + EB_U64 fullCostNoAc; + CoeffCtxtMdl_t candBuffCoeffCtxModel; EB_BOOL weightChromaDistortion; EB_U64 yFullDistortion[DIST_CALC_TOTAL]; - EB_U64 yCoeffBits; - EB_S16 yDc[4];// Store the ABS of DC values per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 + EB_U64 yCoeffBits; + EB_S16 yDc[4];// Store the ABS of DC values per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 EB_U16 yCountNonZeroCoeffs[4];// Store nonzero CoeffNum, per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 - } ModeDecisionCandidateBuffer_t; + } ModeDecisionCandidateBuffer_t; - /************************************** - * Extern Function Declarations - **************************************/ + /************************************** + * Extern Function Declarations + **************************************/ extern EB_ERRORTYPE ModeDecisionCandidateBufferCtor( - ModeDecisionCandidateBuffer_t **bufferDblPtr, - EB_U16 lcuMaxSize, - EB_BITDEPTH maxBitdepth, - EB_U64 *fastCostPtr, - EB_U64 *fullCostPtr, - EB_U64 *fullCostSkipPtr, - EB_U64 *fullCostMergePtr); + ModeDecisionCandidateBuffer_t **bufferDblPtr, + EB_U16 lcuMaxSize, + EB_BITDEPTH maxBitdepth, + EB_U64 *fastCostPtr, + EB_U64 *fullCostPtr, + EB_U64 *fullCostSkipPtr, + EB_U64 *fullCostMergePtr); EB_ERRORTYPE ProductGenerateAmvpMergeInterIntraMdCandidatesCU( - LargestCodingUnit_t *lcuPtr, - struct ModeDecisionContext_s *contextPtr, - const EB_U32 leafIndex, - - const EB_U32 lcuAddr, - EB_U32 *bufferTotalCount, - EB_U32 *fastCandidateTotalCount, - EB_PTR interPredContextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_BOOL mpmSearch, - EB_U8 mpmSearchCandidate, - EB_U32 *mostProbableModeArray); - - EB_U8 FullModeDecision( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 candidateTotalCount, - EB_U8 *bestCandidateIndexArray, - EB_BOOL syntaxCabacUpdate, - EB_U32 *bestIntraMode); - - - EB_U8 ProductFullModeDecision( + LargestCodingUnit_t *lcuPtr, struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - EB_U8 cuSize, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 candidateTotalCount, - EB_U8 *bestCandidateIndexArray, - EB_U32 *bestIntraMode); - - EB_ERRORTYPE PreModeDecision( - CodingUnit_t *cuPtr, - EB_U32 bufferTotalCount, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 *fullCandidateTotalCountPtr, - EB_U8 *bestCandidateIndexArray, - EB_U8 *disableMergeIndex, + const EB_U32 leafIndex, + + const EB_U32 lcuAddr, + EB_U32 *bufferTotalCount, + EB_U32 *fastCandidateTotalCount, + EB_PTR interPredContextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_BOOL mpmSearch, + EB_U8 mpmSearchCandidate, + EB_U32 *mostProbableModeArray); + + EB_U8 FullModeDecision( + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 candidateTotalCount, + EB_U8 *bestCandidateIndexArray, + EB_BOOL syntaxCabacUpdate, + EB_U32 *bestIntraMode); + + + EB_U8 ProductFullModeDecision( + struct ModeDecisionContext_s *contextPtr, + CodingUnit_t *cuPtr, + EB_U8 cuSize, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 candidateTotalCount, + EB_U8 *bestCandidateIndexArray, + EB_U32 *bestIntraMode); + + EB_ERRORTYPE PreModeDecision( + CodingUnit_t *cuPtr, + EB_U32 bufferTotalCount, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 *fullCandidateTotalCountPtr, + EB_U8 *bestCandidateIndexArray, + EB_U8 *disableMergeIndex, EB_BOOL sameFastFullCandidate); - typedef EB_ERRORTYPE(*EB_INTRA_4x4_FAST_LUMA_COST_FUNC)( - struct ModeDecisionContext_s *contextPtr, - EB_U32 puIndex, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 lumaDistortion, - EB_U64 lambda); - - typedef EB_ERRORTYPE(*EB_INTRA_4x4_FULL_LUMA_COST_FUNC)( - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize); - - typedef EB_ERRORTYPE(*EB_INTRA_NxN_FAST_COST_FUNC)( - CodingUnit_t *cuPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + typedef EB_ERRORTYPE(*EB_INTRA_4x4_FAST_LUMA_COST_FUNC)( + struct ModeDecisionContext_s *contextPtr, + EB_U32 puIndex, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U64 lumaDistortion, + EB_U64 lambda); + + typedef EB_ERRORTYPE(*EB_INTRA_4x4_FULL_LUMA_COST_FUNC)( + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize); + + typedef EB_ERRORTYPE(*EB_INTRA_NxN_FAST_COST_FUNC)( + CodingUnit_t *cuPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); typedef EB_ERRORTYPE(*EB_INTRA_NxN_FULL_COST_FUNC)( - PictureControlSet_t *pictureControlSetPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); - - - typedef EB_ERRORTYPE(*EB_FULL_NXN_COST_FUNC)( - PictureControlSet_t *pictureControlSetPtr, - struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); - - struct CodingLoopContext_s; + PictureControlSet_t *pictureControlSetPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); + + + typedef EB_ERRORTYPE(*EB_FULL_NXN_COST_FUNC)( + PictureControlSet_t *pictureControlSetPtr, + struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); + + struct CodingLoopContext_s; #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbModeDecisionConfiguration.c b/Source/Lib/Codec/EbModeDecisionConfiguration.c index c30756dcf..424a0b32c 100644 --- a/Source/Lib/Codec/EbModeDecisionConfiguration.c +++ b/Source/Lib/Codec/EbModeDecisionConfiguration.c @@ -108,7 +108,7 @@ EB_ERRORTYPE EbHevcMdcRefinement( localCuArray[cuIndex + 1 + 3 * DepthOffset[depth + 1]].slectedCu = EB_TRUE; } if (lowestLevel == REFINEMENT_Pp1){ - if (depth < 3 && cuIndex < 81){ + if (depth < 3 && cuIndex < 81){ localCuArray[cuIndex + 1].stopSplit = EB_TRUE; localCuArray[cuIndex + 1 + DepthOffset[depth + 1]].stopSplit = EB_TRUE; localCuArray[cuIndex + 1 + 2 * DepthOffset[depth + 1]].stopSplit = EB_TRUE; @@ -492,14 +492,14 @@ void EbHevcRefinementPredictionLoop( } else - if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_OPEN_LOOP_DEPTH_MODE || + if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_OPEN_LOOP_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuIndex] == LCU_OPEN_LOOP_DEPTH_MODE)) refinementLevel = NdpRefinementControlNREF[temporalLayerIndex][depth]; else refinementLevel = NdpRefinementControl_FAST[temporalLayerIndex][depth]; - if (pictureControlSetPtr->ParentPcsPtr->cu8x8Mode == CU_8x8_MODE_1) { + if (pictureControlSetPtr->ParentPcsPtr->cu8x8Mode == CU_8x8_MODE_1) { refinementLevel = ((refinementLevel & REFINEMENT_Pp1) && depth == 2) ? refinementLevel - REFINEMENT_Pp1 : ((refinementLevel & REFINEMENT_Pp2) && depth == 1) ? refinementLevel - REFINEMENT_Pp2 : ((refinementLevel & REFINEMENT_Pp3) && depth == 0) ? refinementLevel - REFINEMENT_Pp3 : refinementLevel; @@ -912,7 +912,7 @@ void EbHevcPredictionPartitionLoop( ) { - MdRateEstimationContext_t *mdRateEstimationPtr = contextPtr->mdRateEstimationPtr; + MdRateEstimationContext_t *mdRateEstimationPtr = contextPtr->mdRateEstimationPtr; MdcpLocalCodingUnit_t *localCuArray = contextPtr->localCuArray; MdcpLocalCodingUnit_t *cuPtr; @@ -962,45 +962,45 @@ void EbHevcPredictionPartitionLoop( &cuIntraRate); - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuIndex]; - OisCandidate_t * oisCuPtr = cuIndexInRaterScan < RASTER_SCAN_CU_INDEX_8x8_0 ? - oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan] : oisCu8ResultsPtr->sortedOisCandidate[cuIndexInRaterScan - RASTER_SCAN_CU_INDEX_8x8_0]; - - - if (size > 32){ - cuIntraSad = - oisCu32Cu16ResultsPtr->sortedOisCandidate[1][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[2][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[3][0].distortion + - oisCu32Cu16ResultsPtr->sortedOisCandidate[4][0].distortion; - } - else if (size == 32) { - cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; - } - else{ - if (size > 8){ - cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; - } - else{ - if (oisCuPtr[0].validDistortion){ - cuIntraSad = oisCuPtr[0].distortion; - } - else{ - - const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); - const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; - - - if (oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ - cuIntraSad = oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; - } - else { - cuIntraSad = 0; - } - } - } - } + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu32Cu16Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->ParentPcsPtr->oisCu8Results[lcuIndex]; + OisCandidate_t * oisCuPtr = cuIndexInRaterScan < RASTER_SCAN_CU_INDEX_8x8_0 ? + oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan] : oisCu8ResultsPtr->sortedOisCandidate[cuIndexInRaterScan - RASTER_SCAN_CU_INDEX_8x8_0]; + + + if (size > 32){ + cuIntraSad = + oisCu32Cu16ResultsPtr->sortedOisCandidate[1][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[2][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[3][0].distortion + + oisCu32Cu16ResultsPtr->sortedOisCandidate[4][0].distortion; + } + else if (size == 32) { + cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; + } + else{ + if (size > 8){ + cuIntraSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndexInRaterScan][0].distortion; + } + else{ + if (oisCuPtr[0].validDistortion){ + cuIntraSad = oisCuPtr[0].distortion; + } + else{ + + const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[cuIndex]); + const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; + + + if (oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion){ + cuIntraSad = oisCu8ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].distortion; + } + else { + cuIntraSad = 0; + } + } + } + } cuIntraCost = (cuIntraSad << COST_PRECISION) + ((contextPtr->lambda * cuIntraRate + MD_OFFSET) >> MD_SHIFT); @@ -1012,14 +1012,14 @@ void EbHevcPredictionPartitionLoop( - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexInRaterScan]; - cuInterRate = MdcInterCuRate( - mePuResult->distortionDirection[0].direction, - mePuResult->xMvL0, - mePuResult->yMvL0, - mePuResult->xMvL1, - mePuResult->yMvL1); - cuInterSad = mePuResult->distortionDirection[0].distortion; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][cuIndexInRaterScan]; + cuInterRate = MdcInterCuRate( + mePuResult->distortionDirection[0].direction, + mePuResult->xMvL0, + mePuResult->yMvL0, + mePuResult->xMvL1, + mePuResult->yMvL1); + cuInterSad = mePuResult->distortionDirection[0].distortion; cuInterCost = (cuInterSad << COST_PRECISION) + ((contextPtr->lambda * cuInterRate + MD_OFFSET) >> MD_SHIFT); diff --git a/Source/Lib/Codec/EbModeDecisionConfiguration.h b/Source/Lib/Codec/EbModeDecisionConfiguration.h index 91ee8d0c6..11126b45c 100644 --- a/Source/Lib/Codec/EbModeDecisionConfiguration.h +++ b/Source/Lib/Codec/EbModeDecisionConfiguration.h @@ -15,15 +15,15 @@ extern "C" { #endif /******************************************* - * EarlyModeDecisionLcu + * EarlyModeDecisionLcu * predicts candidates (LCU) *******************************************/ extern EB_ERRORTYPE EarlyModeDecisionLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 lcuIndex, - ModeDecisionConfigurationContext_t *contextPtr); + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 lcuIndex, + ModeDecisionConfigurationContext_t *contextPtr); /******************************************* @@ -31,20 +31,20 @@ extern EB_ERRORTYPE EarlyModeDecisionLcu( * Derive Lcu For Each Leaf (LCU) *******************************************/ extern EB_ERRORTYPE DeriveDeltaQPForEachLeafLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, - EB_U32 lcuIndex, - EB_S32 intraMinDistance, - EB_S32 intraMaxDistance, - EB_S32 interMinDistance, - EB_S32 interMaxDistance, - ModeDecisionConfigurationContext_t *contextPtr); + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, + EB_U32 lcuIndex, + EB_S32 intraMinDistance, + EB_S32 intraMaxDistance, + EB_S32 interMinDistance, + EB_S32 interMaxDistance, + ModeDecisionConfigurationContext_t *contextPtr); extern EB_U8 DeriveContouringClass( PictureParentControlSet_t *parentPcsPtr, EB_U16 lcuIndex, - EB_U8 leafIndex); + EB_U8 leafIndex); /************************************** * Function Ptrs Definitions **************************************/ @@ -69,544 +69,544 @@ typedef EB_ERRORTYPE(*EB_MDC_FUNC)( EB_ALIGN(16) static const EB_U8 NdpRefinementControlNREF[MAX_TEMPORAL_LAYERS/*temporal layer*/][4/*cu Size*/] = { - // 64 32 16 8 - /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, + // 64 32 16 8 + /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, /* layer-1 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, /* layer-2 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, - /* layer-3 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, - /* layer-4 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, - /* layer-5 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, - }; + /* layer-3 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, + /* layer-4 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, + /* layer-5 */ { Pred + Predp1 , Pred + Predp1 , Pred + Predp1 , Pred + Predm1 }, + }; EB_ALIGN(16) static const EB_U8 NdpRefinementControl_FAST[MAX_TEMPORAL_LAYERS/*temporal layer*/][4/*cu Size*/] = { - // 64 32 16 8 - /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, + // 64 32 16 8 + /* layer-0 */ { Pred + Predp1+Predp2 , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, /* layer-1 */ { Pred , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, - /* layer-2 */ { Pred , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, - /* layer-3 */ { Pred , Pred , Pred , Pred + Predm1 }, - /* layer-4 */ { Pred , Pred , Pred , Pred + Predm1 }, - /* layer-5 */ { Pred , Pred , Pred , Pred + Predm1 }, - }; + /* layer-2 */ { Pred , Pred + Predp1 ,Pred +Predp1 ,Pred+Predm1 }, + /* layer-3 */ { Pred , Pred , Pred , Pred + Predm1 }, + /* layer-4 */ { Pred , Pred , Pred , Pred + Predm1 }, + /* layer-5 */ { Pred , Pred , Pred , Pred + Predm1 }, + }; EB_ALIGN(16) static const EB_U8 NdpRefinementControl_ISLICE[4/*cu Size*/] = { - Predp1, Pred + Predp1 + Predp2, Predm1 + Pred + Predp1, Predm1 + Pred + Predp1, Pred + Predp1 + Predp2, Predm1 + Pred + Predp1, Predm1 + Pred }; // Max FullCandidates Settings For Intra Frame EB_ALIGN(16) static const EB_U8 NdpRefinementControl_ISLICE_Sub4K[4/*cu Size*/] = -{ - Predp1+Predp2 ,Pred+Predp1+Predp2 ,Predm1+Pred+Predp1 ,Predm1+Pred +{ + Predp1+Predp2 ,Pred+Predp1+Predp2 ,Predm1+Pred+Predp1 ,Predm1+Pred }; EB_ALIGN(32) static const EB_U32 mvBitTable[500][500] = { - { 73744, 128728, 203592, 203592, 269128, 269128, 269128, 269128, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344 }, // 0 - { 130975, 178780, 253644, 253644, 319180, 319180, 319180, 319180, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396 }, // 1 - { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 2 - { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 3 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 4 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 5 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 6 - { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 7 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 8 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 9 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 10 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 11 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 12 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 13 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 14 - { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 15 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 16 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 17 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 18 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 19 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 20 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 21 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 22 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 23 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 24 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 25 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 26 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 27 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 28 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 29 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 30 - { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 31 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 32 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 33 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 34 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 35 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 36 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 37 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 38 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 39 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 40 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 41 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 42 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 43 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 44 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 45 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 46 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 47 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 48 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 49 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 50 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 51 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 52 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 53 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 54 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 55 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 56 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 57 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 58 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 59 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 60 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 61 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 62 - { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 63 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 64 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 65 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 66 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 67 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 68 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 69 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 70 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 71 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 72 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 73 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 74 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 75 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 76 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 77 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 78 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 79 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 80 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 81 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 82 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 83 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 84 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 85 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 86 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 87 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 88 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 89 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 90 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 91 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 92 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 93 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 94 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 95 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 96 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 97 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 98 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 99 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 100 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 101 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 102 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 103 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 104 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 105 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 106 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 107 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 108 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 109 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 110 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 111 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 112 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 113 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 114 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 115 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 116 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 117 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 118 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 119 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 120 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 121 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 122 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 123 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 124 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 125 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 126 - { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 127 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 128 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 129 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 130 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 131 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 132 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 133 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 134 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 135 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 136 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 137 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 138 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 139 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 140 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 141 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 142 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 143 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 144 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 145 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 146 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 147 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 148 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 149 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 150 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 151 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 152 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 153 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 154 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 155 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 156 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 157 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 158 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 159 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 160 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 161 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 162 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 163 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 164 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 165 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 166 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 167 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 168 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 169 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 170 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 171 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 172 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 173 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 174 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 175 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 176 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 177 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 178 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 179 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 180 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 181 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 182 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 183 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 184 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 185 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 186 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 187 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 188 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 189 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 190 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 191 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 192 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 193 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 194 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 195 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 196 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 197 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 198 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 199 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 200 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 201 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 202 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 203 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 204 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 205 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 206 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 207 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 208 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 209 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 210 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 211 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 212 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 213 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 214 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 215 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 216 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 217 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 218 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 219 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 220 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 221 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 222 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 223 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 224 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 225 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 226 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 227 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 228 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 229 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 230 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 231 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 232 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 233 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 234 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 235 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 236 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 237 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 238 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 239 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 240 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 241 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 242 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 243 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 244 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 245 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 246 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 247 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 248 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 249 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 250 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 251 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 252 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 253 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 254 - { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 255 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 256 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 257 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 258 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 259 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 260 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 261 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 262 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 263 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 264 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 265 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 266 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 267 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 268 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 269 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 270 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 271 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 272 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 273 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 274 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 275 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 276 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 277 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 278 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 279 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 280 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 281 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 282 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 283 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 284 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 285 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 286 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 287 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 288 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 289 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 290 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 291 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 292 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 293 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 294 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 295 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 296 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 297 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 298 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 299 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 300 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 301 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 302 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 303 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 304 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 305 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 306 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 307 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 308 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 309 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 310 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 311 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 312 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 313 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 314 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 315 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 316 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 317 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 318 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 319 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 320 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 321 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 322 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 323 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 324 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 325 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 326 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 327 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 328 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 329 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 330 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 331 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 332 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 333 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 334 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 335 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 336 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 337 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 338 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 339 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 340 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 341 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 342 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 343 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 344 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 345 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 346 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 347 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 348 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 349 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 350 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 351 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 352 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 353 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 354 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 355 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 356 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 357 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 358 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 359 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 360 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 361 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 362 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 363 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 364 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 365 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 366 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 367 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 368 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 369 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 370 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 371 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 372 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 373 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 374 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 375 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 376 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 377 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 378 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 379 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 380 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 381 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 382 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 383 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 384 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 385 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 386 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 387 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 388 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 389 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 390 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 391 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 392 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 393 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 394 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 395 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 396 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 397 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 398 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 399 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 400 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 401 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 402 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 403 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 404 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 405 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 406 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 407 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 408 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 409 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 410 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 411 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 412 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 413 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 414 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 415 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 416 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 417 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 418 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 419 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 420 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 421 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 422 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 423 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 424 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 425 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 426 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 427 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 428 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 429 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 430 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 431 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 432 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 433 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 434 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 435 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 436 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 437 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 438 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 439 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 440 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 441 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 442 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 443 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 444 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 445 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 446 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 447 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 448 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 449 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 450 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 451 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 452 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 453 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 454 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 455 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 456 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 457 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 458 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 459 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 460 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 461 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 462 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 463 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 464 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 465 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 466 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 467 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 468 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 469 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 470 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 471 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 472 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 473 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 474 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 475 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 476 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 477 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 478 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 479 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 480 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 481 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 482 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 483 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 484 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 485 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 486 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 487 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 488 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 489 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 490 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 491 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 492 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 493 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 494 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 495 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 496 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 497 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 498 - { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 499 + { 73744, 128728, 203592, 203592, 269128, 269128, 269128, 269128, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 334664, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 400200, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 465736, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 531272, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 596808, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344, 662344 }, // 0 + { 130975, 178780, 253644, 253644, 319180, 319180, 319180, 319180, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 384716, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 450252, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 515788, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 581324, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 646860, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396, 712396 }, // 1 + { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 2 + { 202683, 253623, 321933, 321933, 387469, 387469, 387469, 387469, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685 }, // 3 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 4 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 5 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 6 + { 268219, 319159, 387469, 387469, 453005, 453005, 453005, 453005, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221 }, // 7 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 8 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 9 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 10 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 11 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 12 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 13 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 14 + { 333755, 384695, 453005, 453005, 518541, 518541, 518541, 518541, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757 }, // 15 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 16 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 17 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 18 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 19 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 20 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 21 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 22 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 23 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 24 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 25 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 26 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 27 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 28 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 29 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 30 + { 399291, 450231, 518541, 518541, 584077, 584077, 584077, 584077, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293 }, // 31 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 32 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 33 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 34 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 35 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 36 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 37 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 38 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 39 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 40 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 41 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 42 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 43 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 44 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 45 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 46 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 47 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 48 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 49 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 50 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 51 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 52 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 53 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 54 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 55 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 56 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 57 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 58 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 59 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 60 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 61 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 62 + { 464827, 515767, 584077, 584077, 649613, 649613, 649613, 649613, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829 }, // 63 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 64 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 65 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 66 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 67 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 68 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 69 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 70 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 71 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 72 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 73 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 74 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 75 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 76 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 77 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 78 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 79 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 80 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 81 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 82 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 83 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 84 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 85 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 86 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 87 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 88 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 89 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 90 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 91 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 92 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 93 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 94 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 95 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 96 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 97 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 98 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 99 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 100 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 101 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 102 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 103 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 104 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 105 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 106 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 107 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 108 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 109 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 110 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 111 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 112 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 113 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 114 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 115 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 116 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 117 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 118 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 119 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 120 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 121 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 122 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 123 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 124 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 125 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 126 + { 530363, 581303, 649613, 649613, 715149, 715149, 715149, 715149, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365 }, // 127 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 128 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 129 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 130 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 131 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 132 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 133 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 134 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 135 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 136 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 137 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 138 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 139 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 140 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 141 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 142 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 143 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 144 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 145 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 146 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 147 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 148 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 149 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 150 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 151 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 152 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 153 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 154 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 155 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 156 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 157 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 158 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 159 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 160 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 161 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 162 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 163 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 164 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 165 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 166 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 167 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 168 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 169 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 170 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 171 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 172 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 173 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 174 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 175 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 176 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 177 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 178 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 179 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 180 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 181 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 182 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 183 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 184 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 185 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 186 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 187 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 188 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 189 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 190 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 191 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 192 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 193 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 194 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 195 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 196 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 197 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 198 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 199 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 200 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 201 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 202 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 203 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 204 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 205 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 206 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 207 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 208 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 209 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 210 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 211 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 212 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 213 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 214 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 215 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 216 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 217 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 218 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 219 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 220 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 221 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 222 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 223 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 224 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 225 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 226 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 227 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 228 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 229 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 230 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 231 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 232 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 233 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 234 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 235 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 236 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 237 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 238 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 239 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 240 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 241 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 242 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 243 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 244 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 245 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 246 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 247 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 248 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 249 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 250 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 251 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 252 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 253 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 254 + { 595899, 646839, 715149, 715149, 780685, 780685, 780685, 780685, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901 }, // 255 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 256 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 257 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 258 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 259 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 260 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 261 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 262 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 263 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 264 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 265 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 266 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 267 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 268 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 269 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 270 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 271 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 272 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 273 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 274 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 275 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 276 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 277 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 278 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 279 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 280 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 281 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 282 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 283 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 284 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 285 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 286 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 287 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 288 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 289 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 290 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 291 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 292 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 293 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 294 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 295 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 296 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 297 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 298 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 299 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 300 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 301 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 302 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 303 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 304 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 305 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 306 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 307 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 308 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 309 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 310 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 311 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 312 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 313 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 314 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 315 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 316 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 317 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 318 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 319 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 320 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 321 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 322 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 323 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 324 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 325 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 326 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 327 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 328 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 329 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 330 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 331 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 332 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 333 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 334 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 335 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 336 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 337 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 338 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 339 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 340 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 341 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 342 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 343 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 344 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 345 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 346 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 347 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 348 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 349 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 350 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 351 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 352 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 353 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 354 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 355 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 356 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 357 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 358 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 359 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 360 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 361 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 362 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 363 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 364 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 365 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 366 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 367 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 368 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 369 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 370 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 371 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 372 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 373 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 374 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 375 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 376 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 377 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 378 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 379 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 380 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 381 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 382 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 383 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 384 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 385 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 386 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 387 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 388 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 389 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 390 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 391 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 392 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 393 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 394 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 395 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 396 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 397 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 398 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 399 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 400 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 401 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 402 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 403 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 404 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 405 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 406 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 407 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 408 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 409 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 410 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 411 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 412 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 413 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 414 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 415 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 416 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 417 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 418 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 419 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 420 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 421 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 422 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 423 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 424 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 425 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 426 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 427 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 428 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 429 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 430 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 431 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 432 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 433 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 434 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 435 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 436 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 437 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 438 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 439 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 440 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 441 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 442 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 443 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 444 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 445 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 446 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 447 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 448 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 449 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 450 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 451 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 452 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 453 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 454 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 455 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 456 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 457 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 458 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 459 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 460 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 461 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 462 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 463 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 464 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 465 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 466 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 467 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 468 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 469 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 470 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 471 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 472 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 473 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 474 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 475 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 476 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 477 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 478 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 479 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 480 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 481 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 482 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 483 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 484 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 485 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 486 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 487 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 488 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 489 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 490 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 491 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 492 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 493 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 494 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 495 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 496 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 497 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 498 + { 661435, 712375, 780685, 780685, 846221, 846221, 846221, 846221, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 911757, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 977293, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1042829, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1108365, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1173901, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437, 1239437 }, // 499 }; diff --git a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c index bc2c00d49..550c2d517 100644 --- a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c +++ b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.c @@ -110,36 +110,36 @@ static const EB_U8 AdpLuminosityChangeThArray[MAX_HIERARCHICAL_LEVEL][MAX_TEMPOR * Compute picture and slice level chroma QP offsets ******************************************************/ static void SetSliceAndPictureChromaQpOffsets( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - // This is a picture level chroma QP offset and is sent in the PPS - pictureControlSetPtr->cbQpOffset = 0; - pictureControlSetPtr->crQpOffset = 0; + // This is a picture level chroma QP offset and is sent in the PPS + pictureControlSetPtr->cbQpOffset = 0; + pictureControlSetPtr->crQpOffset = 0; - //In order to have QP offsets for chroma at a slice level set sliceLevelChromaQpFlag flag in pictureControlSetPtr (can be done in the PCS Ctor) + //In order to have QP offsets for chroma at a slice level set sliceLevelChromaQpFlag flag in pictureControlSetPtr (can be done in the PCS Ctor) - // The below are slice level chroma QP offsets and is sent for each slice when sliceLevelChromaQpFlag is set + // The below are slice level chroma QP offsets and is sent for each slice when sliceLevelChromaQpFlag is set - // IMPORTANT: Lambda tables assume that the cb and cr have the same QP offsets. - // However the offsets for each component can be very different for ENC DEC and we are conformant. - pictureControlSetPtr->sliceCbQpOffset = 0; - pictureControlSetPtr->sliceCrQpOffset = 0; + // IMPORTANT: Lambda tables assume that the cb and cr have the same QP offsets. + // However the offsets for each component can be very different for ENC DEC and we are conformant. + pictureControlSetPtr->sliceCbQpOffset = 0; + pictureControlSetPtr->sliceCrQpOffset = 0; - if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_6){ + if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_6){ - pictureControlSetPtr->sliceCbQpOffset = 10; - pictureControlSetPtr->sliceCrQpOffset = 10; + pictureControlSetPtr->sliceCbQpOffset = 10; + pictureControlSetPtr->sliceCrQpOffset = 10; - } - else if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ + } + else if (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ - pictureControlSetPtr->sliceCbQpOffset = 8; - pictureControlSetPtr->sliceCrQpOffset = 8; + pictureControlSetPtr->sliceCbQpOffset = 8; + pictureControlSetPtr->sliceCrQpOffset = 8; - } - else{ + } + else{ if (contextPtr->chromaQpOffsetLevel == 0) { @@ -165,7 +165,7 @@ static void SetSliceAndPictureChromaQpOffsets( } } - } + } } @@ -179,11 +179,11 @@ static void AdaptiveDlfParameterComputation( EbReferenceObject_t * refObjL0, *refObjL1; EB_U8 highIntra = 0; - EB_BOOL tcBetaOffsetManipulation = EB_FALSE; + EB_BOOL tcBetaOffsetManipulation = EB_FALSE; pictureControlSetPtr->highIntraSlection = highIntra; - pictureControlSetPtr->tcOffset = 0; - pictureControlSetPtr->betaOffset = 0; + pictureControlSetPtr->tcOffset = 0; + pictureControlSetPtr->betaOffset = 0; (void)contextPtr; @@ -192,7 +192,7 @@ static void AdaptiveDlfParameterComputation( refObjL0 = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refObjL1 = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; - if ((refObjL0->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL0->tmpLayerIdx]) && (refObjL1->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL1->tmpLayerIdx])) + if ((refObjL0->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL0->tmpLayerIdx]) && (refObjL1->intraCodedArea > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][refObjL1->tmpLayerIdx])) highIntra = 1; else @@ -216,7 +216,7 @@ static void AdaptiveDlfParameterComputation( refObjL1 = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; if (pictureControlSetPtr->temporalLayerIndex == 0){ - highIntra = (pictureControlSetPtr->ParentPcsPtr->intraCodedBlockProbability > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->temporalLayerIndex]) ? 1 : 0; + highIntra = (pictureControlSetPtr->ParentPcsPtr->intraCodedBlockProbability > INTRA_AREA_TH_CLASS_1[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->temporalLayerIndex]) ? 1 : 0; } else{ highIntra = (refObjL0->penalizeSkipflag || refObjL1->penalizeSkipflag) ? 1 : 0; } @@ -240,13 +240,13 @@ static void AdaptiveDlfParameterComputation( pictureControlSetPtr->highIntraSlection = highIntra; - if (pictureControlSetPtr->temporalLayerIndex == 0 && - pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1 && - pictureControlSetPtr->pictureQp >= 37) { + if (pictureControlSetPtr->temporalLayerIndex == 0 && + pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1 && + pictureControlSetPtr->pictureQp >= 37) { - pictureControlSetPtr->tcOffset = 0; - pictureControlSetPtr->betaOffset = 0; - } + pictureControlSetPtr->tcOffset = 0; + pictureControlSetPtr->betaOffset = 0; + } } @@ -259,7 +259,7 @@ EB_ERRORTYPE ModeDecisionConfigurationContextCtor( EbFifo_t *rateControlInputFifoPtr, EbFifo_t *modeDecisionConfigurationOutputFifoPtr, - EB_U16 lcuTotalCount) + EB_U16 lcuTotalCount) { ModeDecisionConfigurationContext_t *contextPtr; @@ -286,18 +286,18 @@ EB_ERRORTYPE ModeDecisionConfigurationContextCtor( * Predict the LCU partitionning ******************************************************/ static void PerformEarlyLcuPartitionning( - ModeDecisionConfigurationContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr) + ModeDecisionConfigurationContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr) { - LargestCodingUnit_t *lcuPtr; - EB_U32 lcuIndex; - EB_U32 sliceType; + LargestCodingUnit_t *lcuPtr; + EB_U32 lcuIndex; + EB_U32 sliceType; - // MD Conf Rate Estimation Array from encodeContext - MdRateEstimationContext_t *mdConfRateEstimationArray; + // MD Conf Rate Estimation Array from encodeContext + MdRateEstimationContext_t *mdConfRateEstimationArray; - // Lambda Assignement + // Lambda Assignement if (pictureControlSetPtr->temporalLayerIndex == 0) { contextPtr->lambda = lambdaModeDecisionRaSadBase[contextPtr->qp]; @@ -310,27 +310,27 @@ static void PerformEarlyLcuPartitionning( } - // Slice Type - sliceType = - (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : - pictureControlSetPtr->sliceType; + // Slice Type + sliceType = + (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : + pictureControlSetPtr->sliceType; - // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type - mdConfRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; - mdConfRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; + // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type + mdConfRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; + mdConfRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; - // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray - EB_MEMCPY(&(contextPtr->mdRateEstimationPtr->splitFlagBits[0]), &(mdConfRateEstimationArray->splitFlagBits[0]), sizeof(EB_BitFraction)* MAX_SIZE_OF_MD_RATE_ESTIMATION_CASES); + // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray + EB_MEMCPY(&(contextPtr->mdRateEstimationPtr->splitFlagBits[0]), &(mdConfRateEstimationArray->splitFlagBits[0]), sizeof(EB_BitFraction)* MAX_SIZE_OF_MD_RATE_ESTIMATION_CASES); pictureControlSetPtr->ParentPcsPtr->averageQp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; - // LCU Loop : Partitionnig Decision - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + // LCU Loop : Partitionnig Decision + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; { - lcuPtr->qp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; - } + lcuPtr->qp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; + } EarlyModeDecisionLcu( sequenceControlSetPtr, @@ -339,19 +339,19 @@ static void PerformEarlyLcuPartitionning( lcuIndex, contextPtr); - } // End of LCU Loop + } // End of LCU Loop } static void PerformEarlyLcuPartitionningLcu( - ModeDecisionConfigurationContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + ModeDecisionConfigurationContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - LargestCodingUnit_t *lcuPtr; + LargestCodingUnit_t *lcuPtr; - // LCU Loop : Partitionnig Decision + // LCU Loop : Partitionnig Decision lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; { lcuPtr->qp = (EB_U8)pictureControlSetPtr->ParentPcsPtr->pictureQp; @@ -497,8 +497,8 @@ static void Forward85CuToModeDecision( switch (cuStatsPtr->depth){ case 0: - resultsPtr->leafDataArray[resultsPtr->leafCount].leafIndex = cuIndex; - resultsPtr->leafDataArray[resultsPtr->leafCount++].splitFlag = splitFlag = EB_TRUE; + resultsPtr->leafDataArray[resultsPtr->leafCount].leafIndex = cuIndex; + resultsPtr->leafDataArray[resultsPtr->leafCount++].splitFlag = splitFlag = EB_TRUE; break; case 1: @@ -556,7 +556,7 @@ static void Forward84CuToModeDecision( switch (cuStatsPtr->depth){ case 0: - splitFlag = EB_TRUE; + splitFlag = EB_TRUE; break; case 1: @@ -707,10 +707,10 @@ static void PartitioningInitialization( PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - EB_U32 sliceType; + EB_U32 sliceType; // MD Conf Rate Estimation Array from encodeContext - MdRateEstimationContext_t *mdConfRateEstimationArray; + MdRateEstimationContext_t *mdConfRateEstimationArray; // Lambda Assignement if (pictureControlSetPtr->temporalLayerIndex == 0) { @@ -743,30 +743,30 @@ static void PartitioningInitialization( ******************************************************/ static void DetectComplexNonFlatMovingLcu( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 pictureWidthInLcu) { + PictureControlSet_t *pictureControlSetPtr, + EB_U32 pictureWidthInLcu) { - LargestCodingUnit_t *lcuPtr; - EB_U32 lcuIndex; + LargestCodingUnit_t *lcuPtr; + EB_U32 lcuIndex; if (pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage != INVALID_ZZ_COST && pictureControlSetPtr->ParentPcsPtr->nonMovingIndexAverage >= 10 && pictureControlSetPtr->temporalLayerIndex <= 2) { - // Determine deltaQP and assign QP value for each leaf - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + // Determine deltaQP and assign QP value for each leaf + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; + lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; - EB_BOOL condition = EB_FALSE; + EB_BOOL condition = EB_FALSE; - if (!pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArray[lcuIndex] && + if (!pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArray[lcuIndex] && lcuPtr->pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex].edgeBlockNum > 0) { - condition = EB_TRUE; - } + condition = EB_TRUE; + } - if (condition){ - EB_U32 counter = 0; + if (condition){ + EB_U32 counter = 0; if (!lcuParams->isEdgeLcu){ // Top @@ -781,126 +781,126 @@ static void DetectComplexNonFlatMovingLcu( // right if (pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex + 1].edgeBlockNum == 0) counter++; - } - } - } - } + } + } + } + } } static EB_AURA_STATUS AuraDetection64x64( - PictureControlSet_t *pictureControlSetPtr, - EB_U8 pictureQp, - EB_U32 lcuIndex - ) + PictureControlSet_t *pictureControlSetPtr, + EB_U8 pictureQp, + EB_U32 lcuIndex + ) { - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_S32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + MAX_LCU_SIZE - 1) >> MAX_LOG2_LCU_SIZE; - EB_U32 currDist; - EB_U32 topDist, topLDist, topRDist; - EB_U32 localAvgDist, distThresh0, distThresh1; - EB_S32 lcuOffset; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_S32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + MAX_LCU_SIZE - 1) >> MAX_LOG2_LCU_SIZE; + EB_U32 currDist; + EB_U32 topDist, topLDist, topRDist; + EB_U32 localAvgDist, distThresh0, distThresh1; + EB_S32 lcuOffset; - EB_AURA_STATUS auraClass = AURA_STATUS_0; - EB_U8 auraClass1 = 0; - EB_U8 auraClass2 = 0; + EB_AURA_STATUS auraClass = AURA_STATUS_0; + EB_U8 auraClass1 = 0; + EB_U8 auraClass2 = 0; - EB_S32 xMv0 = 0; - EB_S32 yMv0 = 0; - EB_S32 xMv1 = 0; - EB_S32 yMv1 = 0; + EB_S32 xMv0 = 0; + EB_S32 yMv0 = 0; + EB_S32 xMv1 = 0; + EB_S32 yMv1 = 0; - EB_U32 leftDist, rightDist; + EB_U32 leftDist, rightDist; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; distThresh0 = pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag ||sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE ? 15 : 14; - distThresh1 = 23; + distThresh1 = 23; - if (pictureQp > 38){ - distThresh0 = distThresh0 << 2; - distThresh1 = distThresh1 << 2; - } + if (pictureQp > 38){ + distThresh0 = distThresh0 << 2; + distThresh1 = distThresh1 << 2; + } if (!lcuParams->isEdgeLcu){ EB_U32 k; - MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][0]; + MeCuResults_t * mePuResult = &pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex][0]; - //Curr Block + //Curr Block - for (k = 0; k < mePuResult->totalMeCandidateIndex; k++) { + for (k = 0; k < mePuResult->totalMeCandidateIndex; k++) { - if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_0) { - // Get reference list 0 / reference index 0 MV - xMv0 = mePuResult->xMvL0; - yMv0 = mePuResult->yMvL0; - } - if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_1) { - // Get reference list 1 / reference index 0 MV - xMv1 = mePuResult->xMvL1; - yMv1 = mePuResult->yMvL1; - } + if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_0) { + // Get reference list 0 / reference index 0 MV + xMv0 = mePuResult->xMvL0; + yMv0 = mePuResult->yMvL0; + } + if (mePuResult->distortionDirection[k].direction == UNI_PRED_LIST_1) { + // Get reference list 1 / reference index 0 MV + xMv1 = mePuResult->xMvL1; + yMv1 = mePuResult->yMvL1; + } - } - currDist = mePuResult->distortionDirection[0].distortion; + } + currDist = mePuResult->distortionDirection[0].distortion; - if ((currDist > 64 * 64) && - // Only mark a block as aura when it is moving (MV amplitude higher than X; X is temporal layer dependent) - (abs(xMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || - abs(yMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || - abs(xMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || - abs(yMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex])) - { + if ((currDist > 64 * 64) && + // Only mark a block as aura when it is moving (MV amplitude higher than X; X is temporal layer dependent) + (abs(xMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || + abs(yMv0) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || + abs(xMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex] || + abs(yMv1) > GLOBAL_MOTION_THRESHOLD[pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels][pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex])) + { - //Top Distortion - lcuOffset = -pictureWidthInLcu; - topDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //Top Distortion + lcuOffset = -pictureWidthInLcu; + topDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; - //TopLeft Distortion - lcuOffset = -pictureWidthInLcu - 1; - topLDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //TopLeft Distortion + lcuOffset = -pictureWidthInLcu - 1; + topLDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; - //TopRightDistortion - lcuOffset = -pictureWidthInLcu + 1; - topRDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //TopRightDistortion + lcuOffset = -pictureWidthInLcu + 1; + topRDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; topRDist = (lcuParams->horizontalIndex < (EB_U32)(pictureWidthInLcu - 2)) ? topRDist : currDist; - //left Distortion - lcuOffset = -1; - leftDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //left Distortion + lcuOffset = -1; + leftDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; - //RightDistortion - lcuOffset = 1; - rightDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; + //RightDistortion + lcuOffset = 1; + rightDist = pictureControlSetPtr->ParentPcsPtr->meResults[lcuIndex + lcuOffset]->distortionDirection[0].distortion; rightDist = (lcuParams->horizontalIndex < (EB_U32)(pictureWidthInLcu - 2)) ? topRDist : currDist; - localAvgDist = MIN(MIN(MIN(topLDist, MIN(topRDist, topDist)), leftDist), rightDist); + localAvgDist = MIN(MIN(MIN(topLDist, MIN(topRDist, topDist)), leftDist), rightDist); - if (10 * currDist > distThresh0*localAvgDist){ - if (10 * currDist > distThresh1*localAvgDist) - auraClass2++; - else - auraClass1++; - } - } + if (10 * currDist > distThresh0*localAvgDist){ + if (10 * currDist > distThresh1*localAvgDist) + auraClass2++; + else + auraClass1++; + } + } - } + } - auraClass = (auraClass2 > 0 || auraClass1 > 0) ? AURA_STATUS_1 : AURA_STATUS_0; + auraClass = (auraClass2 > 0 || auraClass1 > 0) ? AURA_STATUS_1 : AURA_STATUS_0; - return auraClass; + return auraClass; } @@ -908,20 +908,20 @@ static EB_AURA_STATUS AuraDetection64x64( * Aura detection ******************************************************/ static void AuraDetection( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_U32 pictureWidthInLcu, - EB_U32 pictureHeightInLcu) + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_U32 pictureWidthInLcu, + EB_U32 pictureHeightInLcu) { - EB_U32 lcuIndex; + EB_U32 lcuIndex; EB_U32 lcu_X; EB_U32 lcu_Y; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; + LargestCodingUnit_t *lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; - // Aura status intialization + // Aura status intialization lcuPtr->auraStatus = INVALID_AURA_STATUS; lcu_X = lcuParams->horizontalIndex; lcu_Y = lcuParams->verticalIndex; @@ -934,7 +934,7 @@ static void AuraDetection( lcuPtr->index); } } - } + } return; } @@ -1076,42 +1076,42 @@ Output : budget per picture ******************************************************/ static void SetTargetBudgetOq( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionConfigurationContext_t *contextPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionConfigurationContext_t *contextPtr) { - EB_U32 budget; - - if (contextPtr->adpLevel <= ENC_MODE_3) { - if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? - pictureControlSetPtr->lcuTotalCount * U_152 : - pictureControlSetPtr->lcuTotalCount * U_150; - else - budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? - pictureControlSetPtr->lcuTotalCount * U_152 : - pictureControlSetPtr->lcuTotalCount * U_145; - } - else if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080p_RANGE) { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * AVC_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_134; - } - else { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_109; - } - } + EB_U32 budget; + + if (contextPtr->adpLevel <= ENC_MODE_3) { + if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? + pictureControlSetPtr->lcuTotalCount * U_152 : + pictureControlSetPtr->lcuTotalCount * U_150; + else + budget = (pictureControlSetPtr->ParentPcsPtr->isPan || pictureControlSetPtr->ParentPcsPtr->isTilt) ? + pictureControlSetPtr->lcuTotalCount * U_152 : + pictureControlSetPtr->lcuTotalCount * U_145; + } + else if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080p_RANGE) { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * FULL_SEARCH_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * AVC_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_134; + } + else { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_109; + } + } else if (contextPtr->adpLevel <= ENC_MODE_5) { if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) { if (pictureControlSetPtr->temporalLayerIndex == 0) @@ -1141,43 +1141,43 @@ static void SetTargetBudgetOq( else budget = pictureControlSetPtr->lcuTotalCount * U_121; } - } - else if (contextPtr->adpLevel <= ENC_MODE_7) { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_109; - } + } + else if (contextPtr->adpLevel <= ENC_MODE_7) { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_109; + } else if (contextPtr->adpLevel <= ENC_MODE_8) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) - budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_127 : - (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_125 : - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_121; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) - budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * OPEN_LOOP_COST : - (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; - else - budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : - pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; - } - else { - if (pictureControlSetPtr->temporalLayerIndex == 0) - budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; - else - budget = pictureControlSetPtr->lcuTotalCount * U_109; - } - } + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) + budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_127 : + (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_125 : + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * U_121; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) + budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * OPEN_LOOP_COST : + (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_1) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; + else + budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100 : + pictureControlSetPtr->ParentPcsPtr->lcuTotalCount * 100; + } + else { + if (pictureControlSetPtr->temporalLayerIndex == 0) + budget = pictureControlSetPtr->lcuTotalCount * BDP_COST; + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + budget = pictureControlSetPtr->lcuTotalCount * OPEN_LOOP_COST; + else + budget = pictureControlSetPtr->lcuTotalCount * U_109; + } + } else if (contextPtr->adpLevel <= ENC_MODE_10) { if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0) budget = (contextPtr->adpDepthSensitivePictureClass == DEPTH_SENSITIVE_PIC_CLASS_2) ? @@ -1233,44 +1233,44 @@ static EB_BOOL IsAvcPartitioningMode( PictureControlSet_t *pictureControlSetPtr, LargestCodingUnit_t *lcuPtr) { - const EB_U32 lcuIndex = lcuPtr->index; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - EB_U8 edgeBlockNum = pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex].edgeBlockNum; - LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuIndex]); - EB_U8 stationaryEdgeOverTimeFlag = lcuStatPtr->stationaryEdgeOverTimeFlag; - - EB_U8 auraStatus = lcuPtr->auraStatus; - - // No refinment for sub-1080p - if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) - return EB_FALSE; - - // Sharpe Edge - if (pictureControlSetPtr->ParentPcsPtr->highDarkLowLightAreaDensityFlag && pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex > 0 && pictureControlSetPtr->ParentPcsPtr->sharpEdgeLcuFlag[lcuIndex] && !pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArrayAllLayers[lcuIndex]) { - return EB_TRUE; - } - - // Potential Aura/Grass - if (pictureControlSetPtr->sceneCaracteristicId == EB_FRAME_CARAC_0) { - if (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 60 && auraStatus == AURA_STATUS_1) { - if ((sliceType != EB_I_PICTURE && pictureControlSetPtr->highIntraSlection == 0) && (lcuParams->isCompleteLcu)) { - return EB_TRUE; - } - } - } - - // B-Logo - if (pictureControlSetPtr->ParentPcsPtr->logoPicFlag && edgeBlockNum) - return EB_TRUE; - - // S-Logo - if (stationaryEdgeOverTimeFlag > 0) - return EB_TRUE; - - // Potential Blockiness Area - if (pictureControlSetPtr->ParentPcsPtr->complexLcuArray[lcuIndex] == LCU_COMPLEXITY_STATUS_2) - return EB_TRUE; + const EB_U32 lcuIndex = lcuPtr->index; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + EB_U8 edgeBlockNum = pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuIndex].edgeBlockNum; + LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuIndex]); + EB_U8 stationaryEdgeOverTimeFlag = lcuStatPtr->stationaryEdgeOverTimeFlag; + + EB_U8 auraStatus = lcuPtr->auraStatus; + + // No refinment for sub-1080p + if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_1080i_RANGE) + return EB_FALSE; + + // Sharpe Edge + if (pictureControlSetPtr->ParentPcsPtr->highDarkLowLightAreaDensityFlag && pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex > 0 && pictureControlSetPtr->ParentPcsPtr->sharpEdgeLcuFlag[lcuIndex] && !pictureControlSetPtr->ParentPcsPtr->similarColocatedLcuArrayAllLayers[lcuIndex]) { + return EB_TRUE; + } + + // Potential Aura/Grass + if (pictureControlSetPtr->sceneCaracteristicId == EB_FRAME_CARAC_0) { + if (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 60 && auraStatus == AURA_STATUS_1) { + if ((sliceType != EB_I_PICTURE && pictureControlSetPtr->highIntraSlection == 0) && (lcuParams->isCompleteLcu)) { + return EB_TRUE; + } + } + } + + // B-Logo + if (pictureControlSetPtr->ParentPcsPtr->logoPicFlag && edgeBlockNum) + return EB_TRUE; + + // S-Logo + if (stationaryEdgeOverTimeFlag > 0) + return EB_TRUE; + + // Potential Blockiness Area + if (pictureControlSetPtr->ParentPcsPtr->complexLcuArray[lcuIndex] == LCU_COMPLEXITY_STATUS_2) + return EB_TRUE; return EB_FALSE; } @@ -1282,7 +1282,7 @@ static EB_BOOL IsAvcPartitioningMode( ******************************************************/ static void ConfigureAdp( PictureControlSet_t *pictureControlSetPtr, - ModeDecisionConfigurationContext_t *contextPtr) + ModeDecisionConfigurationContext_t *contextPtr) { contextPtr->costDepthMode[LCU_FULL85_DEPTH_MODE - 1] = FULL_SEARCH_COST; contextPtr->costDepthMode[LCU_FULL84_DEPTH_MODE - 1] = FULL_SEARCH_COST; @@ -1307,8 +1307,8 @@ static void ConfigureAdp( // Initialize the predicted budget contextPtr->predictedCost = (EB_U32) ~0; - // Initialize the predicted budget - contextPtr->predictedCost = (EB_U32)~0; + // Initialize the predicted budget + contextPtr->predictedCost = (EB_U32)~0; // Derive the sensitive picture flag contextPtr->adpDepthSensitivePictureClass = DEPTH_SENSITIVE_PIC_CLASS_0; @@ -1404,19 +1404,19 @@ static void SetLcuBudget( LargestCodingUnit_t *lcuPtr, ModeDecisionConfigurationContext_t *contextPtr) { - const EB_U32 lcuIndex = lcuPtr->index; + const EB_U32 lcuIndex = lcuPtr->index; EB_U32 maxToMinScore, scoreToMin; - const EB_BOOL isAvcPartitioningModeFlag = IsAvcPartitioningMode(sequenceControlSetPtr, pictureControlSetPtr, lcuPtr); + const EB_BOOL isAvcPartitioningModeFlag = IsAvcPartitioningMode(sequenceControlSetPtr, pictureControlSetPtr, lcuPtr); - if (contextPtr->adpRefinementMode == 2 && isAvcPartitioningModeFlag) { + if (contextPtr->adpRefinementMode == 2 && isAvcPartitioningModeFlag) { contextPtr->lcuCostArray[lcuIndex] = contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; contextPtr->predictedCost += contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; } - else if (contextPtr->adpRefinementMode == 1 && isAvcPartitioningModeFlag) { + else if (contextPtr->adpRefinementMode == 1 && isAvcPartitioningModeFlag) { contextPtr->lcuCostArray[lcuIndex] = contextPtr->costDepthMode[LCU_LIGHT_AVC_DEPTH_MODE - 1]; contextPtr->predictedCost += contextPtr->costDepthMode[LCU_LIGHT_AVC_DEPTH_MODE - 1]; @@ -1456,7 +1456,7 @@ static void SetLcuBudget( contextPtr->predictedCost += contextPtr->intervalCost[6]; } // Switch to AVC mode if the LCU cost is higher than the AVC cost and the the LCU is marked + adjust the current picture cost accordingly - if (isAvcPartitioningModeFlag) { + if (isAvcPartitioningModeFlag) { if (contextPtr->lcuCostArray[lcuIndex] > contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]) { contextPtr->predictedCost -= (contextPtr->lcuCostArray[lcuIndex] - contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]); contextPtr->lcuCostArray[lcuIndex] = contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; @@ -1506,7 +1506,7 @@ static void DeriveOptimalBudgetPerLcu( // reset running cost contextPtr->predictedCost = 0; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { LargestCodingUnit_t* lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; @@ -1560,7 +1560,7 @@ static void ComputeRefinementCost( EB_U32 avcRefinementCost = 0; EB_U32 lightAvcRefinementCost = 0; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->ParentPcsPtr->lcuTotalCount; lcuIndex++) { LargestCodingUnit_t* lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuIndex]; if (IsAvcPartitioningMode(sequenceControlSetPtr, pictureControlSetPtr, lcuPtr)) { avcRefinementCost += contextPtr->costDepthMode[LCU_AVC_DEPTH_MODE - 1]; @@ -1733,31 +1733,31 @@ static void DeriveLcuScore( ******************************************************/ static void PerformOutlierRemoval( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { - EB_U32 maxInterval = 0; - EB_U32 subInterval = 0; - EB_U32 lcuScoreHistogram[10] = { 0 }; - EB_U32 lcuIndex; + EB_U32 maxInterval = 0; + EB_U32 subInterval = 0; + EB_U32 lcuScoreHistogram[10] = { 0 }; + EB_U32 lcuIndex; EB_U32 lcuScore; - EB_U32 processedlcuCount = 0; - EB_S32 slot = 0; + EB_U32 processedlcuCount = 0; + EB_S32 slot = 0; maxInterval = contextPtr->lcuMaxScore - contextPtr->lcuMinScore; // Consider 10 bins subInterval = maxInterval / 10; // Count # of LCUs at each bin - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; lcuIndex++) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; lcuIndex++) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64]) { + if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64]) { - processedlcuCount++; + processedlcuCount++; lcuScore = contextPtr->lcuScoreArray[lcuIndex] + contextPtr->lcuMinScore; if (lcuScore < (subInterval + contextPtr->lcuMinScore)){ @@ -1790,32 +1790,32 @@ static void PerformOutlierRemoval( else if (lcuScore < ((10 * subInterval) + contextPtr->lcuMinScore)){ lcuScoreHistogram[9]++; } - } - } + } + } // Zero-out the bin if percentage lower than VALID_SLOT_TH - for (slot = 0; slot < 10; slot++){ + for (slot = 0; slot < 10; slot++){ if (processedlcuCount > 0) { if ((lcuScoreHistogram[slot] * 100 / processedlcuCount) < VALID_SLOT_TH) { lcuScoreHistogram[slot] = 0; } } - } + } // Ignore null bins - for (slot = 0; slot < 10; slot++){ - if (lcuScoreHistogram[slot]){ - contextPtr->lcuMinScore = contextPtr->lcuMinScore+ (slot * subInterval); - break; - } - } - - for (slot = 9; slot >= 0; slot--){ - if (lcuScoreHistogram[slot]){ - contextPtr->lcuMaxScore = contextPtr->lcuMaxScore - ((9 - slot) * subInterval); - break; - } - } + for (slot = 0; slot < 10; slot++){ + if (lcuScoreHistogram[slot]){ + contextPtr->lcuMinScore = contextPtr->lcuMinScore+ (slot * subInterval); + break; + } + } + + for (slot = 9; slot >= 0; slot--){ + if (lcuScoreHistogram[slot]){ + contextPtr->lcuMaxScore = contextPtr->lcuMaxScore - ((9 - slot) * subInterval); + break; + } + } } /****************************************************** * Assign a search method for each LCU @@ -1824,7 +1824,7 @@ static void PerformOutlierRemoval( ******************************************************/ static void DeriveLcuMdMode( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, ModeDecisionConfigurationContext_t *contextPtr) { // Configure ADP @@ -1850,15 +1850,15 @@ static void DeriveLcuMdMode( contextPtr); // Derive LCU score - DeriveLcuScore( - sequenceControlSetPtr, - pictureControlSetPtr, + DeriveLcuScore( + sequenceControlSetPtr, + pictureControlSetPtr, contextPtr); // Remove the outliers - PerformOutlierRemoval( - sequenceControlSetPtr, - pictureControlSetPtr->ParentPcsPtr, + PerformOutlierRemoval( + sequenceControlSetPtr, + pictureControlSetPtr->ParentPcsPtr, contextPtr); // Perform Budgetting @@ -1916,18 +1916,18 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) EbObjectWrapper_t *encDecTasksWrapperPtr; EncDecTasks_t *encDecTasksPtr; EB_U32 pictureWidthInLcu; - EB_U32 pictureHeightInLcu; + EB_U32 pictureHeightInLcu; for(;;) { - // Get RateControl Results - EbGetFullObject( - contextPtr->rateControlInputFifoPtr, - &rateControlResultsWrapperPtr); + // Get RateControl Results + EbGetFullObject( + contextPtr->rateControlInputFifoPtr, + &rateControlResultsWrapperPtr); EB_CHECK_END_OBJ(rateControlResultsWrapperPtr); - rateControlResultsPtr = (RateControlResults_t*)rateControlResultsWrapperPtr->objectPtr; - pictureControlSetPtr = (PictureControlSet_t*)rateControlResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + rateControlResultsPtr = (RateControlResults_t*)rateControlResultsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureControlSet_t*)rateControlResultsPtr->pictureControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld MDC IN \n", pictureControlSetPtr->pictureNumber); #endif @@ -1935,14 +1935,14 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) pictureControlSetPtr, contextPtr); - pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; contextPtr->qp = pictureControlSetPtr->pictureQp; - pictureControlSetPtr->ParentPcsPtr->averageQp = 0; + pictureControlSetPtr->ParentPcsPtr->averageQp = 0; - pictureControlSetPtr->intraCodedArea = 0; + pictureControlSetPtr->intraCodedArea = 0; pictureControlSetPtr->sceneCaracteristicId = EB_FRAME_CARAC_0; @@ -1957,11 +1957,11 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) (pictureControlSetPtr->ParentPcsPtr->picHomogenousOverTimeLcuPercentage < 50)) ? EB_FRAME_CARAC_1 : pictureControlSetPtr->sceneCaracteristicId; pictureControlSetPtr->sceneCaracteristicId = ( - (pictureControlSetPtr->ParentPcsPtr->isPan) && - (!pictureControlSetPtr->ParentPcsPtr->isTilt) && - (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 35) && - (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture <= 70) && - (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= picNoiseClassTH) && + (pictureControlSetPtr->ParentPcsPtr->isPan) && + (!pictureControlSetPtr->ParentPcsPtr->isTilt) && + (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture > 35) && + (pictureControlSetPtr->ParentPcsPtr->grassPercentageInPicture <= 70) && + (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= picNoiseClassTH) && (pictureControlSetPtr->ParentPcsPtr->picHomogenousOverTimeLcuPercentage < 50)) ? EB_FRAME_CARAC_2 : pictureControlSetPtr->sceneCaracteristicId; pictureControlSetPtr->adjustMinQPFlag = (EB_BOOL)((!pictureControlSetPtr->ParentPcsPtr->isPan) && @@ -1973,29 +1973,29 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) (pictureControlSetPtr->ParentPcsPtr->picNoiseClass >= picNoiseClassTH)); - // Aura Detection - // Still is using the picture QP to derive aura thresholds, there fore it could not move to the open loop - AuraDetection( // HT done - sequenceControlSetPtr, - pictureControlSetPtr, - pictureWidthInLcu, - pictureHeightInLcu); + // Aura Detection + // Still is using the picture QP to derive aura thresholds, there fore it could not move to the open loop + AuraDetection( // HT done + sequenceControlSetPtr, + pictureControlSetPtr, + pictureWidthInLcu, + pictureHeightInLcu); - // Detect complex/non-flat/moving LCU in a non-complex area (used to refine MDC depth control) - DetectComplexNonFlatMovingLcu( // HT done + // Detect complex/non-flat/moving LCU in a non-complex area (used to refine MDC depth control) + DetectComplexNonFlatMovingLcu( // HT done sequenceControlSetPtr, - pictureControlSetPtr, - pictureWidthInLcu); + pictureControlSetPtr, + pictureWidthInLcu); - // Compute picture and slice level chroma QP offsets + // Compute picture and slice level chroma QP offsets SetSliceAndPictureChromaQpOffsets( // HT done pictureControlSetPtr, contextPtr); - // Compute Tc, and Beta offsets for a given picture - AdaptiveDlfParameterComputation( // HT done - contextPtr, - pictureControlSetPtr); + // Compute Tc, and Beta offsets for a given picture + AdaptiveDlfParameterComputation( // HT done + contextPtr, + pictureControlSetPtr); if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE) { @@ -2122,7 +2122,7 @@ void* ModeDecisionConfigurationKernel(void *inputPtr) // Release Rate Control Results EbReleaseObject(rateControlResultsWrapperPtr); - } + } - return EB_NULL; + return EB_NULL; } diff --git a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h index 37fa2aa8b..67338f33b 100644 --- a/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h +++ b/Source/Lib/Codec/EbModeDecisionConfigurationProcess.h @@ -19,16 +19,16 @@ extern "C" { * Defines **************************************/ -typedef struct MdcpLocalCodingUnit_s +typedef struct MdcpLocalCodingUnit_s { EB_U64 earlyCost; EB_BOOL earlySplitFlag; EB_U32 splitContext; - EB_BOOL slectedCu; + EB_BOOL slectedCu; EB_BOOL stopSplit; } MdcpLocalCodingUnit_t; -typedef struct ModeDecisionConfigurationContext_s +typedef struct ModeDecisionConfigurationContext_s { EbFifo_t *rateControlInputFifoPtr; EbFifo_t *modeDecisionConfigurationOutputFifoPtr; @@ -42,20 +42,20 @@ typedef struct ModeDecisionConfigurationContext_s // Inter depth decision EB_U8 groupOf8x8BlocksCount; EB_U8 groupOf16x16BlocksCount; - EB_U64 interComplexityMinimum; - EB_U64 interComplexityMaximum; - EB_U64 interComplexityAverage; - EB_U64 intraComplexityMinimum; - EB_U64 intraComplexityMaximum; - EB_U64 intraComplexityAverage; - EB_S16 minDeltaQpWeight; - EB_S16 maxDeltaQpWeight; - EB_S8 minDeltaQp[4]; - EB_S8 maxDeltaQp[4]; - - // Budgeting + EB_U64 interComplexityMinimum; + EB_U64 interComplexityMaximum; + EB_U64 interComplexityAverage; + EB_U64 intraComplexityMinimum; + EB_U64 intraComplexityMaximum; + EB_U64 intraComplexityAverage; + EB_S16 minDeltaQpWeight; + EB_S16 maxDeltaQpWeight; + EB_S8 minDeltaQp[4]; + EB_S8 maxDeltaQp[4]; + + // Budgeting EB_U32 *lcuScoreArray; - EB_U8 costDepthMode[LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE]; + EB_U8 costDepthMode[LCU_PRED_OPEN_LOOP_1_NFL_DEPTH_MODE]; EB_U8 *lcuCostArray; EB_U32 predictedCost; EB_U32 budget; @@ -85,11 +85,11 @@ extern EB_ERRORTYPE ModeDecisionConfigurationContextCtor( EbFifo_t *rateControlInputFifoPtr, EbFifo_t *modeDecisionConfigurationOutputFifoPtr, - EB_U16 lcuTotalCount); + EB_U16 lcuTotalCount); + - extern void* ModeDecisionConfigurationKernel(void *inputPtr); #ifdef __cplusplus } -#endif +#endif #endif // EbModeDecisionConfigurationProcess_h \ No newline at end of file diff --git a/Source/Lib/Codec/EbModeDecisionProcess.c b/Source/Lib/Codec/EbModeDecisionProcess.c index d12d0c09e..e9db28713 100644 --- a/Source/Lib/Codec/EbModeDecisionProcess.c +++ b/Source/Lib/Codec/EbModeDecisionProcess.c @@ -53,7 +53,7 @@ EB_ERRORTYPE ModeDecisionContextCtor( // Transform and Quantization Buffers EB_MALLOC(EbTransQuantBuffers_t*, contextPtr->transQuantBuffersPtr, sizeof(EbTransQuantBuffers_t), EB_N_PTR); - // Cabac cost + // Cabac cost EB_MALLOC(CabacCost_t*, contextPtr->CabacCost, sizeof(CabacCost_t), EB_N_PTR); return_error = EbTransQuantBuffersCtor( @@ -102,15 +102,15 @@ EB_ERRORTYPE ModeDecisionContextCtor( { EbPictureBufferDescInitData_t initData; - initData.bufferEnableMask = PICTURE_BUFFER_DESC_LUMA_MASK; + initData.bufferEnableMask = PICTURE_BUFFER_DESC_LUMA_MASK; initData.maxWidth = MAX_LCU_SIZE; initData.maxHeight = MAX_LCU_SIZE; initData.bitDepth = EB_8BIT; initData.colorFormat = EB_YUV420; - initData.leftPadding = 0; - initData.rightPadding = 0; - initData.topPadding = 0; - initData.botPadding = 0; + initData.leftPadding = 0; + initData.rightPadding = 0; + initData.topPadding = 0; + initData.botPadding = 0; initData.splitMode = EB_FALSE; return_error = EbPictureBufferDescCtor( @@ -146,10 +146,10 @@ EB_ERRORTYPE ModeDecisionContextCtor( initData.maxHeight = MAX_LCU_SIZE; initData.bitDepth = EB_8BIT; initData.colorFormat = EB_YUV420; - initData.leftPadding = 0; - initData.rightPadding = 0; - initData.topPadding = 0; - initData.botPadding = 0; + initData.leftPadding = 0; + initData.rightPadding = 0; + initData.topPadding = 0; + initData.botPadding = 0; initData.splitMode = EB_FALSE; return_error = EbPictureBufferDescCtor( @@ -180,20 +180,20 @@ EB_ERRORTYPE ModeDecisionContextCtor( extern void lambdaAssignLowDelay( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 *fastLambda, - EB_U32 *fullLambda, - EB_U32 *fastChromaLambda, - EB_U32 *fullChromaLambda, - EB_U32 *fullChromaLambdaSao, - EB_U8 qp, - EB_U8 chromaQp) + EB_U32 *fastLambda, + EB_U32 *fullLambda, + EB_U32 *fastChromaLambda, + EB_U32 *fullChromaLambda, + EB_U32 *fullChromaLambdaSao, + EB_U8 qp, + EB_U8 chromaQp) { if (pictureControlSetPtr->temporalLayerIndex == 0) { - *fastLambda = lambdaModeDecisionLdSad[qp]; - *fastChromaLambda = lambdaModeDecisionLdSad[qp]; + *fastLambda = lambdaModeDecisionLdSad[qp]; + *fastChromaLambda = lambdaModeDecisionLdSad[qp]; *fullLambda = lambdaModeDecisionLdSse[qp]; *fullChromaLambda = lambdaModeDecisionLdSse[qp]; *fullChromaLambdaSao = lambdaModeDecisionLdSse[chromaQp]; @@ -201,8 +201,8 @@ extern void lambdaAssignLowDelay( } else { // Hierarchical postions 1, 2, 3, 4, 5 - *fastLambda = lambdaModeDecisionLdSadQpScaling[qp]; - *fastChromaLambda = lambdaModeDecisionLdSadQpScaling[qp]; + *fastLambda = lambdaModeDecisionLdSadQpScaling[qp]; + *fastChromaLambda = lambdaModeDecisionLdSadQpScaling[qp]; *fullLambda = lambdaModeDecisionLdSseQpScaling[qp]; *fullChromaLambda = lambdaModeDecisionLdSseQpScaling[qp]; *fullChromaLambdaSao = lambdaModeDecisionLdSseQpScaling[chromaQp]; @@ -212,13 +212,13 @@ extern void lambdaAssignLowDelay( void lambdaAssignRandomAccess( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 *fastLambda, - EB_U32 *fullLambda, - EB_U32 *fastChromaLambda, - EB_U32 *fullChromaLambda, - EB_U32 *fullChromaLambdaSao, - EB_U8 qp, - EB_U8 chromaQp) + EB_U32 *fastLambda, + EB_U32 *fullLambda, + EB_U32 *fastChromaLambda, + EB_U32 *fullChromaLambda, + EB_U32 *fullChromaLambdaSao, + EB_U8 qp, + EB_U8 chromaQp) { if (pictureControlSetPtr->temporalLayerIndex == 0) { @@ -251,20 +251,20 @@ void lambdaAssignRandomAccess( void EbHevcLambdaAssignISlice( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 *fastLambda, - EB_U32 *fullLambda, - EB_U32 *fastChromaLambda, - EB_U32 *fullChromaLambda, - EB_U32 *fullChromaLambdaSao, - EB_U8 qp, - EB_U8 chromaQp) + EB_U32 *fastLambda, + EB_U32 *fullLambda, + EB_U32 *fastChromaLambda, + EB_U32 *fullChromaLambda, + EB_U32 *fullChromaLambdaSao, + EB_U8 qp, + EB_U8 chromaQp) { if (pictureControlSetPtr->temporalLayerIndex == 0) { - *fastLambda = lambdaModeDecisionISliceSad[qp]; - *fastChromaLambda = lambdaModeDecisionISliceSad[qp]; + *fastLambda = lambdaModeDecisionISliceSad[qp]; + *fastChromaLambda = lambdaModeDecisionISliceSad[qp]; *fullLambda = lambdaModeDecisionISliceSse[qp]; *fullChromaLambda = lambdaModeDecisionISliceSse[qp]; *fullChromaLambdaSao = lambdaModeDecisionISliceSse[chromaQp]; @@ -276,10 +276,10 @@ void EbHevcLambdaAssignISlice( } const EB_LAMBDA_ASSIGN_FUNC lambdaAssignmentFunctionTable[4] = { - lambdaAssignLowDelay, // low delay P - lambdaAssignLowDelay, // low delay B - lambdaAssignRandomAccess, // Random Access - EbHevcLambdaAssignISlice // I_SLICE + lambdaAssignLowDelay, // low delay P + lambdaAssignLowDelay, // low delay B + lambdaAssignRandomAccess, // Random Access + EbHevcLambdaAssignISlice // I_SLICE }; void ProductResetModeDecision( @@ -287,100 +287,100 @@ void ProductResetModeDecision( PictureControlSet_t *pictureControlSetPtr, SequenceControlSet_t *sequenceControlSetPtr) { - EB_PICTURE sliceType; - MdRateEstimationContext_t *mdRateEstimationArray; + EB_PICTURE sliceType; + MdRateEstimationContext_t *mdRateEstimationArray; - // SAO - pictureControlSetPtr->saoFlag[0] = EB_TRUE; - pictureControlSetPtr->saoFlag[1] = EB_TRUE; + // SAO + pictureControlSetPtr->saoFlag[0] = EB_TRUE; + pictureControlSetPtr->saoFlag[1] = EB_TRUE; - // QP - contextPtr->qp = pictureControlSetPtr->pictureQp; - // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation + // QP + contextPtr->qp = pictureControlSetPtr->pictureQp; + // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - EB_U8 qpScaled = CLIP3(MIN_QP_VALUE, MAX_CHROMA_MAP_QP_VALUE, (EB_S32)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); - contextPtr->chromaQp = MapChromaQp(qpScaled); + EB_U8 qpScaled = CLIP3(MIN_QP_VALUE, MAX_CHROMA_MAP_QP_VALUE, (EB_S32)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + contextPtr->chromaQp = MapChromaQp(qpScaled); - if (pictureControlSetPtr->sliceType == EB_I_PICTURE && pictureControlSetPtr->temporalId == 0){ + if (pictureControlSetPtr->sliceType == EB_I_PICTURE && pictureControlSetPtr->temporalId == 0){ - (*lambdaAssignmentFunctionTable[3])( + (*lambdaAssignmentFunctionTable[3])( pictureControlSetPtr->ParentPcsPtr, - &contextPtr->fastLambda, - &contextPtr->fullLambda, - &contextPtr->fastChromaLambda, - &contextPtr->fullChromaLambda, - &contextPtr->fullChromaLambdaSao, - contextPtr->qp, - contextPtr->chromaQp); - } - else{ - (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( + &contextPtr->fastLambda, + &contextPtr->fullLambda, + &contextPtr->fastChromaLambda, + &contextPtr->fullChromaLambda, + &contextPtr->fullChromaLambdaSao, + contextPtr->qp, + contextPtr->chromaQp); + } + else{ + (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( pictureControlSetPtr->ParentPcsPtr, - &contextPtr->fastLambda, - &contextPtr->fullLambda, - &contextPtr->fastChromaLambda, - &contextPtr->fullChromaLambda, - &contextPtr->fullChromaLambdaSao, - contextPtr->qp, - contextPtr->chromaQp); - } - // Configure the number of candidate buffers to search at each depth + &contextPtr->fastLambda, + &contextPtr->fullLambda, + &contextPtr->fastChromaLambda, + &contextPtr->fullChromaLambda, + &contextPtr->fullChromaLambdaSao, + contextPtr->qp, + contextPtr->chromaQp); + } + // Configure the number of candidate buffers to search at each depth // 64x64 CU contextPtr->bufferDepthIndexStart[0] = 0; - contextPtr->bufferDepthIndexWidth[0] = 5; // 4 NFL + 1 for temporary data + contextPtr->bufferDepthIndexWidth[0] = 5; // 4 NFL + 1 for temporary data // 32x32 CU contextPtr->bufferDepthIndexStart[1] = contextPtr->bufferDepthIndexStart[0] + contextPtr->bufferDepthIndexWidth[0]; - contextPtr->bufferDepthIndexWidth[1] = 8; // 4 NFL + 3 MPM + 1 for temporary data + contextPtr->bufferDepthIndexWidth[1] = 8; // 4 NFL + 3 MPM + 1 for temporary data // 16x16 CU contextPtr->bufferDepthIndexStart[2] = contextPtr->bufferDepthIndexStart[1] + contextPtr->bufferDepthIndexWidth[1]; - contextPtr->bufferDepthIndexWidth[2] = 8; // 4 NFL + 3 MPM + 1 for temporary data + contextPtr->bufferDepthIndexWidth[2] = 8; // 4 NFL + 3 MPM + 1 for temporary data // 8x8 CU contextPtr->bufferDepthIndexStart[3] = contextPtr->bufferDepthIndexStart[2] + contextPtr->bufferDepthIndexWidth[2]; - contextPtr->bufferDepthIndexWidth[3] = 8; // 4 NFL + 3 MPM + 1 for temporary data + contextPtr->bufferDepthIndexWidth[3] = 8; // 4 NFL + 3 MPM + 1 for temporary data // 4x4 CU contextPtr->bufferDepthIndexStart[4] = contextPtr->bufferDepthIndexStart[3] + contextPtr->bufferDepthIndexWidth[3]; - contextPtr->bufferDepthIndexWidth[4] = 5; // 4 NFL + 1 for temporary data + contextPtr->bufferDepthIndexWidth[4] = 5; // 4 NFL + 1 for temporary data - // Slice Type - sliceType = - (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : - pictureControlSetPtr->sliceType; + // Slice Type + sliceType = + (pictureControlSetPtr->ParentPcsPtr->idrFlag == EB_TRUE) ? EB_I_PICTURE : + pictureControlSetPtr->sliceType; - // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type + // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type - /* Note(CHKN) : Rate estimation will use FrameQP even when Qp modulation is ON */ + /* Note(CHKN) : Rate estimation will use FrameQP even when Qp modulation is ON */ - mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; - mdRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; + mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; + mdRateEstimationArray += sliceType * TOTAL_NUMBER_OF_QP_VALUES + contextPtr->qp; - // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray - contextPtr->mdRateEstimationPtr = mdRateEstimationArray; + // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray + contextPtr->mdRateEstimationPtr = mdRateEstimationArray; - EB_U32 candidateIndex; - for (candidateIndex = 0; candidateIndex < MODE_DECISION_CANDIDATE_MAX_COUNT; ++candidateIndex) { - contextPtr->fastCandidatePtrArray[candidateIndex]->mdRateEstimationPtr = mdRateEstimationArray; - } + EB_U32 candidateIndex; + for (candidateIndex = 0; candidateIndex < MODE_DECISION_CANDIDATE_MAX_COUNT; ++candidateIndex) { + contextPtr->fastCandidatePtrArray[candidateIndex]->mdRateEstimationPtr = mdRateEstimationArray; + } - // TMVP Map Writer Pointer - if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) - contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr; - else - contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)EB_NULL; + // TMVP Map Writer Pointer + if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) + contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr; + else + contextPtr->referenceObjectWritePtr = (EbReferenceObject_t*)EB_NULL; - // Reset CABAC Contexts - contextPtr->coeffEstEntropyCoderPtr = pictureControlSetPtr->coeffEstEntropyCoderPtr; + // Reset CABAC Contexts + contextPtr->coeffEstEntropyCoderPtr = pictureControlSetPtr->coeffEstEntropyCoderPtr; - return; + return; } void ConfigureChroma( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr) { EB_U32 lcuAddr = lcuPtr->index; @@ -449,8 +449,8 @@ void ConfigureChroma( void DeriveIntraInterBiasFlag( SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr) { @@ -495,8 +495,8 @@ void DeriveIntraInterBiasFlag( } void ProductConfigurePicLcuMdDetectors( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr) { @@ -547,7 +547,7 @@ void ProductConfigurePicLcuMdDetectors( void ConfigureMpm( - ModeDecisionContext_t *contextPtr) + ModeDecisionContext_t *contextPtr) { if (contextPtr->restrictIntraGlobalMotion) { contextPtr->mpmSearch = EB_FALSE; @@ -691,13 +691,13 @@ void ModeDecisionConfigureLcu( } //RC is on else { - contextPtr->qp = (EB_U8) lcuQp; + contextPtr->qp = (EB_U8) lcuQp; } - // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation + // Asuming cb and cr offset to be the same for chroma QP in both slice and pps for lambda computation - EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); - contextPtr->chromaQp = MapChromaQp(qpScaled); + EB_U8 qpScaled = CLIP3((EB_S8)MIN_QP_VALUE, (EB_S8)MAX_CHROMA_MAP_QP_VALUE, (EB_S8)(contextPtr->qp + pictureControlSetPtr->cbQpOffset + pictureControlSetPtr->sliceCbQpOffset)); + contextPtr->chromaQp = MapChromaQp(qpScaled); /* Note(CHKN) : when Qp modulation varies QP on a sub-LCU(CU) basis, Lamda has to change based on Cu->QP , and then this code has to move inside the CU loop in MD */ @@ -716,17 +716,17 @@ void ModeDecisionConfigureLcu( } else{ - // Change lambda QP for 4K 5L and 6L - EB_U8 lambdaQp = contextPtr->qp; + // Change lambda QP for 4K 5L and 6L + EB_U8 lambdaQp = contextPtr->qp; - (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( + (*lambdaAssignmentFunctionTable[sequenceControlSetPtr->staticConfig.predStructure])( pictureControlSetPtr->ParentPcsPtr, &contextPtr->fastLambda, &contextPtr->fullLambda, &contextPtr->fastChromaLambda, &contextPtr->fullChromaLambda, &contextPtr->fullChromaLambdaSao, - lambdaQp, + lambdaQp, contextPtr->chromaQp); } diff --git a/Source/Lib/Codec/EbModeDecisionProcess.h b/Source/Lib/Codec/EbModeDecisionProcess.h index 1193e6ace..5cd3e5cc8 100644 --- a/Source/Lib/Codec/EbModeDecisionProcess.h +++ b/Source/Lib/Codec/EbModeDecisionProcess.h @@ -60,12 +60,12 @@ typedef struct MDEncPassCuData_s EB_S16 yDc[4];// Store the ABS of DC values per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 EB_U16 yCountNonZeroCoeffs[4];// Store nonzero CoeffNum, per TU. If one TU, stored in 0, otherwise 4 tus stored in 0 to 3 -} MDEncPassCuData_t; +} MDEncPassCuData_t; typedef struct LcuBasedDetectors_s { unsigned intraInterCond1 : 1; // intra / inter bias unsigned intraInterCond2 : 1; // intra / inter bias - unsigned intraInterCond3 : 1; // intra / inter bias + unsigned intraInterCond3 : 1; // intra / inter bias unsigned intraInterCond4 : 1; unsigned biPredCond1 : 1; // FastLoop @@ -75,123 +75,123 @@ typedef struct LcuBasedDetectors_s typedef struct MdCodingUnit_s { - unsigned testedCuFlag : 1; //tells whether this CU is tested in MD. - unsigned mdcArrayIndex : 7; - unsigned countNonZeroCoeffs : 11; - unsigned topNeighborDepth : 2; - unsigned leftNeighborDepth : 2; - unsigned topNeighborMode : 2; - unsigned leftNeighborMode : 2; - unsigned fullDistortion : 32; - unsigned chromaDistortion : 32; - unsigned chromaDistortionInterDepth : 32; - EB_U64 cost; - EB_U64 costLuma; + unsigned testedCuFlag : 1; //tells whether this CU is tested in MD. + unsigned mdcArrayIndex : 7; + unsigned countNonZeroCoeffs : 11; + unsigned topNeighborDepth : 2; + unsigned leftNeighborDepth : 2; + unsigned topNeighborMode : 2; + unsigned leftNeighborMode : 2; + unsigned fullDistortion : 32; + unsigned chromaDistortion : 32; + unsigned chromaDistortionInterDepth : 32; + EB_U64 cost; + EB_U64 costLuma; }MdCodingUnit_t; typedef struct ModeDecisionContext_s { - EbFifo_t *modeDecisionConfigurationInputFifoPtr; - EbFifo_t *modeDecisionOutputFifoPtr; + EbFifo_t *modeDecisionConfigurationInputFifoPtr; + EbFifo_t *modeDecisionOutputFifoPtr; - EB_S16 *transformInnerArrayPtr; + EB_S16 *transformInnerArrayPtr; - ModeDecisionCandidate_t **fastCandidatePtrArray; - ModeDecisionCandidate_t *fastCandidateArray; + ModeDecisionCandidate_t **fastCandidatePtrArray; + ModeDecisionCandidate_t *fastCandidateArray; // TMVP - EbReferenceObject_t *referenceObjectWritePtr; + EbReferenceObject_t *referenceObjectWritePtr; // Coding Unit Workspace--------------------------- - EbPictureBufferDesc_t *predictionBuffer; + EbPictureBufferDesc_t *predictionBuffer; // Intra Reference Samples - IntraReferenceSamples_t *intraRefPtr; + IntraReferenceSamples_t *intraRefPtr; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - InterPredictionContext_t *interPredictionContext; + InterPredictionContext_t *interPredictionContext; - MdRateEstimationContext_t *mdRateEstimationPtr; + MdRateEstimationContext_t *mdRateEstimationPtr; - SaoStats_t *saoStats; + SaoStats_t *saoStats; // Transform and Quantization Buffers - EbTransQuantBuffers_t *transQuantBuffersPtr; + EbTransQuantBuffers_t *transQuantBuffersPtr; // MCP Context - MotionCompensationPredictionContext_t *mcpContext; + MotionCompensationPredictionContext_t *mcpContext; struct EncDecContext_s *encDecContextPtr; - EB_U64 *fastCostArray; - EB_U64 *fullCostArray; - EB_U64 *fullCostSkipPtr; - EB_U64 *fullCostMergePtr; + EB_U64 *fastCostArray; + EB_U64 *fullCostArray; + EB_U64 *fullCostSkipPtr; + EB_U64 *fullCostMergePtr; - - // Fast loop buffers - EB_U8 bufferDepthIndexStart[MAX_LEVEL_COUNT]; - EB_U8 bufferDepthIndexWidth[MAX_LEVEL_COUNT]; - // Lambda - EB_U8 qp; - EB_U8 chromaQp; - EB_U32 fastLambda; - EB_U32 fullLambda; - EB_U32 fastChromaLambda; - EB_U32 fullChromaLambda; - EB_U32 fullChromaLambdaSao; - - // Context Variables--------------------------------- + // Fast loop buffers + EB_U8 bufferDepthIndexStart[MAX_LEVEL_COUNT]; + EB_U8 bufferDepthIndexWidth[MAX_LEVEL_COUNT]; + + // Lambda + EB_U8 qp; + EB_U8 chromaQp; + EB_U32 fastLambda; + EB_U32 fullLambda; + EB_U32 fastChromaLambda; + EB_U32 fullChromaLambda; + EB_U32 fullChromaLambdaSao; + + // Context Variables--------------------------------- LargestCodingUnit_t *lcuPtr; TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStats; + const TransformUnitStats_t *tuStats; CodingUnit_t *cuPtr; - const CodedUnitStats_t *cuStats; + const CodedUnitStats_t *cuStats; PredictionUnit_t *puPtr; - const PredictionUnitStats_t *puStats; + const PredictionUnitStats_t *puStats; MvUnit_t mvUnit; - MvMergeCandidate_t mergeCandidateArray[MAX_NUM_OF_MV_MERGE_CANDIDATE]; + MvMergeCandidate_t mergeCandidateArray[MAX_NUM_OF_MV_MERGE_CANDIDATE]; // Inter depth decision EB_U8 mpmSearchCandidate; - EB_U8 groupOf8x8BlocksCount; - EB_U8 groupOf16x16BlocksCount; + EB_U8 groupOf8x8BlocksCount; + EB_U8 groupOf16x16BlocksCount; EB_U8 puItr; EB_U8 cuSizeLog2; EB_U8 amvpCandidateCountRefList0; - EB_U8 amvpCandidateCountRefList1; + EB_U8 amvpCandidateCountRefList1; + + EB_U8 bestCandidateIndexArray[MAX_FULL_LOOP_CANIDATES_PER_DEPTH]; - EB_U8 bestCandidateIndexArray[MAX_FULL_LOOP_CANIDATES_PER_DEPTH]; + EB_U16 cuOriginX; + EB_U16 cuOriginY; + EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; + EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_U16 cuOriginX; - EB_U16 cuOriginY; - EB_S16 xMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList0[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 xMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - EB_S16 yMvAmvpCandidateArrayList1[MAX_NUM_OF_AMVP_CANDIDATES]; - - EB_U32 mostProbableModeArray[MAX_MPM_CANDIDATES]; - EB_U32 useChromaInformationInFastLoop; + EB_U32 mostProbableModeArray[MAX_MPM_CANDIDATES]; + EB_U32 useChromaInformationInFastLoop; EB_BOOL useChromaInformationInFullLoop; EB_U8 cuDepth; - EB_U8 cuSize; - EB_U8 lcuSize; - EB_U8 lcuChromaSize; - EB_U16 cuChromaOriginX; - EB_U16 cuChromaOriginY; + EB_U8 cuSize; + EB_U8 lcuSize; + EB_U8 lcuChromaSize; + EB_U16 cuChromaOriginX; + EB_U16 cuChromaOriginY; EB_U16 puOriginX; - EB_U16 puOriginY; + EB_U16 puOriginY; EB_U16 puWidth; - EB_U16 puHeight; + EB_U16 puHeight; - EB_PF_MODE pfMdMode; + EB_PF_MODE pfMdMode; EB_BOOL mpmSearch; EB_BOOL useIntraInterBias; @@ -203,11 +203,11 @@ typedef struct ModeDecisionContext_s EB_U8 intraLumaTopModeArray[4]; // Entropy Coder - EntropyCoder_t *coeffEstEntropyCoderPtr; - CabacCost_t *CabacCost; + EntropyCoder_t *coeffEstEntropyCoderPtr; + CabacCost_t *CabacCost; SyntaxContextModelEncContext_t syntaxCabacCtxModelArray; - MDEncPassCuData_t mdEpPipeLcu[CU_MAX_COUNT]; + MDEncPassCuData_t mdEpPipeLcu[CU_MAX_COUNT]; LcuBasedDetectors_t *mdPicLcuDetect; EbPictureBufferDesc_t *pillarReconBuffer; @@ -221,33 +221,33 @@ typedef struct ModeDecisionContext_s NeighborArrayUnit_t *skipFlagNeighborArray; NeighborArrayUnit_t *modeTypeNeighborArray; NeighborArrayUnit_t *leafDepthNeighborArray; - NeighborArrayUnit_t *lumaReconNeighborArray; + NeighborArrayUnit_t *lumaReconNeighborArray; NeighborArrayUnit_t *cbReconNeighborArray; NeighborArrayUnit_t *crReconNeighborArray; - + BdpCuData_t pillarCuArray; EB_BOOL cu8x8RefinementOnFlag; EB_BOOL depthRefinment ; EB_BOOL conformantMvMergeTable; - - EB_BOOL edgeBlockNumFlag; - MdCodingUnit_t mdLocalCuUnit[CU_MAX_COUNT]; - EB_BOOL cuUseRefSrcFlag; - EB_BOOL restrictIntraGlobalMotion; + + EB_BOOL edgeBlockNumFlag; + MdCodingUnit_t mdLocalCuUnit[CU_MAX_COUNT]; + EB_BOOL cuUseRefSrcFlag; + EB_BOOL restrictIntraGlobalMotion; EB_U8 interpolationMethod; EB_BOOL coeffCabacUpdate; CoeffCtxtMdl_t latestValidCoeffCtxModel; //tracks the best CU partition so far CoeffCtxtMdl_t i4x4CoeffCtxModel; - EB_BOOL use4x4ChromaInformationInFullLoop; + EB_BOOL use4x4ChromaInformationInFullLoop; - // Multi-modes signal(s) + // Multi-modes signal(s) EB_U8 intraInjectionMethod; EB_BOOL spatialSseFullLoop; EB_BOOL intra8x8RestrictionInterSlice; EB_BOOL generateAmvpTableMd; - EB_BOOL fullLoopEscape; + EB_BOOL fullLoopEscape; EB_BOOL singleFastLoopFlag; EB_BOOL amvpInjection; EB_BOOL unipred3x3Injection; @@ -300,8 +300,8 @@ extern EB_ERRORTYPE ModeDecisionContextCtor( extern void ApplyIntraInterModeBias( EB_BOOL intraInterCond1, EB_BOOL intraInterCond2, - EB_BOOL intraInterCond3, - EB_U64 *fullCostPtr); + EB_BOOL intraInterCond3, + EB_U64 *fullCostPtr); extern const EB_LAMBDA_ASSIGN_FUNC lambdaAssignmentFunctionTable[4]; diff --git a/Source/Lib/Codec/EbModeDecisionSegments.h b/Source/Lib/Codec/EbModeDecisionSegments.h index ce8d718fd..0f857ff62 100644 --- a/Source/Lib/Codec/EbModeDecisionSegments.h +++ b/Source/Lib/Codec/EbModeDecisionSegments.h @@ -18,11 +18,11 @@ typedef struct { EB_U64 completionMask; EB_HANDLE writeLockMutex; - + EB_U32 totalCount; EB_U32 columnCount; EB_U32 rowCount; - + EB_BOOL inProgress; EB_U32 currentRowIdx; diff --git a/Source/Lib/Codec/EbMotionEstimation.c b/Source/Lib/Codec/EbMotionEstimation.c index 955387def..431edb564 100644 --- a/Source/Lib/Codec/EbMotionEstimation.c +++ b/Source/Lib/Codec/EbMotionEstimation.c @@ -21,7 +21,7 @@ #include "EbLambdaRateTables.h" #include "EbPictureOperators.h" -#define OIS_TH_COUNT 4 +#define OIS_TH_COUNT 4 EB_S32 EbHevcOisPointTh[3][MAX_TEMPORAL_LAYERS][OIS_TH_COUNT] = { { @@ -60,8 +60,8 @@ EB_S32 EbHevcOisPointTh[3][MAX_TEMPORAL_LAYERS][OIS_TH_COUNT] = { /******************************************** * Macros ********************************************/ -#define SIXTEENTH_DECIMATED_SEARCH_WIDTH 16 -#define SIXTEENTH_DECIMATED_SEARCH_HEIGHT 8 +#define SIXTEENTH_DECIMATED_SEARCH_WIDTH 16 +#define SIXTEENTH_DECIMATED_SEARCH_HEIGHT 8 /******************************************** * Constants @@ -83,16 +83,16 @@ EB_S32 EbHevcOisPointTh[3][MAX_TEMPORAL_LAYERS][OIS_TH_COUNT] = { #define F2 2 static const EB_U8 numberOfOisModePoints[5/*IOS poitnt*/] = { - 1, 3, 5, 7, 9 + 1, 3, 5, 7, 9 }; static EB_U8 totalIntraLumaMode[5][4] = { - /*depth0*/ /*depth1*/ /*depth2*/ /*depth3*/ - { 0, 1, 1, 1 }, // Very fast - { 0, 3, 3, 3 }, // fast - { 0, 5, 5, 5 }, // Meduim - { 0, 7, 7, 7 }, // Complex - { 0, 9, 9, 9 } // Very Complex (MAX_OIS_1) + /*depth0*/ /*depth1*/ /*depth2*/ /*depth3*/ + { 0, 1, 1, 1 }, // Very fast + { 0, 3, 3, 3 }, // fast + { 0, 5, 5, 5 }, // Meduim + { 0, 7, 7, 7 }, // Complex + { 0, 9, 9, 9 } // Very Complex (MAX_OIS_1) }; @@ -105,40 +105,40 @@ EB_U32 tab8x8[64] = { 0, 1, 4, 5, 16, 17, 20, 21, 2, 3, 6, 7, 18, 19, 22, 23, 8, static const EB_U32 partitionWidth[MAX_ME_PU_COUNT] = { - 64, // 0 - 32, 32, 32, 32, // 1-4 - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, // 5-20 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 21-36 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 37-52 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 53-68 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; // 69-84 + 64, // 0 + 32, 32, 32, 32, // 1-4 + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, // 5-20 + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 21-36 + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 37-52 + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 53-68 + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; // 69-84 static const EB_U32 partitionHeight[MAX_ME_PU_COUNT] = { - 64, - 32, 32, 32, 32, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; + 64, + 32, 32, 32, 32, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; static const EB_U32 puSearchIndexMap[MAX_ME_PU_COUNT][2] = { - { 0, 0 }, - { 0, 0 }, { 32, 0 }, { 0, 32 }, { 32, 32 }, + { 0, 0 }, + { 0, 0 }, { 32, 0 }, { 0, 32 }, { 32, 32 }, - { 0, 0 }, { 16, 0 }, { 32, 0 }, { 48, 0 }, - { 0, 16 }, { 16, 16 }, { 32, 16 }, { 48, 16 }, - { 0, 32 }, { 16, 32 }, { 32, 32 }, { 48, 32 }, - { 0, 48 }, { 16, 48 }, { 32, 48 }, { 48, 48 }, + { 0, 0 }, { 16, 0 }, { 32, 0 }, { 48, 0 }, + { 0, 16 }, { 16, 16 }, { 32, 16 }, { 48, 16 }, + { 0, 32 }, { 16, 32 }, { 32, 32 }, { 48, 32 }, + { 0, 48 }, { 16, 48 }, { 32, 48 }, { 48, 48 }, - { 0, 0 }, { 8, 0 }, { 16, 0 }, { 24, 0 }, { 32, 0 }, { 40, 0 }, { 48, 0 }, { 56, 0 }, - { 0, 8 }, { 8, 8 }, { 16, 8 }, { 24, 8 }, { 32, 8 }, { 40, 8 }, { 48, 8 }, { 56, 8 }, - { 0, 16 }, { 8, 16 }, { 16, 16 }, { 24, 16 }, { 32, 16 }, { 40, 16 }, { 48, 16 }, { 56, 16 }, - { 0, 24 }, { 8, 24 }, { 16, 24 }, { 24, 24 }, { 32, 24 }, { 40, 24 }, { 48, 24 }, { 56, 24 }, - { 0, 32 }, { 8, 32 }, { 16, 32 }, { 24, 32 }, { 32, 32 }, { 40, 32 }, { 48, 32 }, { 56, 32 }, - { 0, 40 }, { 8, 40 }, { 16, 40 }, { 24, 40 }, { 32, 40 }, { 40, 40 }, { 48, 40 }, { 56, 40 }, - { 0, 48 }, { 8, 48 }, { 16, 48 }, { 24, 48 }, { 32, 48 }, { 40, 48 }, { 48, 48 }, { 56, 48 }, - { 0, 56 }, { 8, 56 }, { 16, 56 }, { 24, 56 }, { 32, 56 }, { 40, 56 }, { 48, 56 }, { 56, 56 }}; + { 0, 0 }, { 8, 0 }, { 16, 0 }, { 24, 0 }, { 32, 0 }, { 40, 0 }, { 48, 0 }, { 56, 0 }, + { 0, 8 }, { 8, 8 }, { 16, 8 }, { 24, 8 }, { 32, 8 }, { 40, 8 }, { 48, 8 }, { 56, 8 }, + { 0, 16 }, { 8, 16 }, { 16, 16 }, { 24, 16 }, { 32, 16 }, { 40, 16 }, { 48, 16 }, { 56, 16 }, + { 0, 24 }, { 8, 24 }, { 16, 24 }, { 24, 24 }, { 32, 24 }, { 40, 24 }, { 48, 24 }, { 56, 24 }, + { 0, 32 }, { 8, 32 }, { 16, 32 }, { 24, 32 }, { 32, 32 }, { 40, 32 }, { 48, 32 }, { 56, 32 }, + { 0, 40 }, { 8, 40 }, { 16, 40 }, { 24, 40 }, { 32, 40 }, { 40, 40 }, { 48, 40 }, { 56, 40 }, + { 0, 48 }, { 8, 48 }, { 16, 48 }, { 24, 48 }, { 32, 48 }, { 40, 48 }, { 48, 48 }, { 56, 48 }, + { 0, 56 }, { 8, 56 }, { 16, 56 }, { 24, 56 }, { 32, 56 }, { 40, 56 }, { 48, 56 }, { 56, 56 }}; static const EB_U8 subPositionType[16] = { 0, 2, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2 }; @@ -156,135 +156,135 @@ EB_U32 stage1ModesArray[9] = { EB_INTRA_HORIZONTAL, EB_INTRA_VERTICAL, EB_INTRA_ * GetEightHorizontalSearchPointResultsAll85CUs *******************************************/ static void GetEightHorizontalSearchPointResultsAll85PUs_C( - MeContext_t *contextPtr, - EB_U32 listIndex, - EB_U32 searchRegionIndex, - EB_U32 xSearchIndex, - EB_U32 ySearchIndex + MeContext_t *contextPtr, + EB_U32 listIndex, + EB_U32 searchRegionIndex, + EB_U32 xSearchIndex, + EB_U32 ySearchIndex ) { - EB_U8 *srcPtr = contextPtr->lcuSrcPtr; - - EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); - - EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; - - EB_U32 searchPositionTLIndex = searchRegionIndex; - EB_U32 searchPositionIndex; - EB_U32 blockIndex; - - EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); - EB_U32 refNext16x16Offset = (reflumaStride << 4); - - EB_U32 currMVy = (((EB_U16)ySearchIndex) << 18); - EB_U16 currMVx = (((EB_U16)xSearchIndex << 2)); - EB_U32 currMV = currMVy | currMVx; - - EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; - EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; - EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; - EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; - - EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; - EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; - EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; - EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; - - EB_U16 *pSad16x16 = contextPtr->pEightPosSad16x16; - - /* - ---------------------- ---------------------- - | 16x16_0 | 16x16_1 | 16x16_4 | 16x16_5 | - ---------------------- ---------------------- - | 16x16_2 | 16x16_3 | 16x16_6 | 16x16_7 | - ----------------------- ----------------------- - | 16x16_8 | 16x16_9 | 16x16_12 | 16x16_13 | - ---------------------- ---------------------- - | 16x16_10 | 16x16_11 | 16x16_14 | 16x16_15 | - ----------------------- ----------------------- - */ - - const EB_U32 srcStride = contextPtr->lcuSrcStride; - srcNext16x16Offset = srcStride << 4; - - //---- 16x16_0 - blockIndex = 0; - searchPositionIndex = searchPositionTLIndex; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[0], &pBestMV8x8[0], &pBestSad16x16[0], &pBestMV16x16[0], currMV, &pSad16x16[0 * 8]); - //---- 16x16_1 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionTLIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[4], &pBestMV8x8[4], &pBestSad16x16[1], &pBestMV16x16[1], currMV, &pSad16x16[1 * 8]); - //---- 16x16_4 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[16], &pBestMV8x8[16], &pBestSad16x16[4], &pBestMV16x16[4], currMV, &pSad16x16[4 * 8]); - //---- 16x16_5 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[20], &pBestMV8x8[20], &pBestSad16x16[5], &pBestMV16x16[5], currMV, &pSad16x16[5 * 8]); - - - - //---- 16x16_2 - blockIndex = srcNext16x16Offset; - searchPositionIndex = searchPositionTLIndex + refNext16x16Offset; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[8], &pBestMV8x8[8], &pBestSad16x16[2], &pBestMV16x16[2], currMV, &pSad16x16[2 * 8]); - //---- 16x16_3 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[12], &pBestMV8x8[12], &pBestSad16x16[3], &pBestMV16x16[3], currMV, &pSad16x16[3 * 8]); - //---- 16x16_6 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[24], &pBestMV8x8[24], &pBestSad16x16[6], &pBestMV16x16[6], currMV, &pSad16x16[6 * 8]); - //---- 16x16_7 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[28], &pBestMV8x8[28], &pBestSad16x16[7], &pBestMV16x16[7], currMV, &pSad16x16[7 * 8]); - - - //---- 16x16_8 - blockIndex = (srcNext16x16Offset << 1); - searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset << 1); - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[32], &pBestMV8x8[32], &pBestSad16x16[8], &pBestMV16x16[8], currMV, &pSad16x16[8 * 8]); - //---- 16x16_9 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[36], &pBestMV8x8[36], &pBestSad16x16[9], &pBestMV16x16[9], currMV, &pSad16x16[9 * 8]); - //---- 16x16_12 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[48], &pBestMV8x8[48], &pBestSad16x16[12], &pBestMV16x16[12], currMV, &pSad16x16[12 * 8]); - //---- 16x1_13 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[52], &pBestMV8x8[52], &pBestSad16x16[13], &pBestMV16x16[13], currMV, &pSad16x16[13 * 8]); - - - - //---- 16x16_10 - blockIndex = (srcNext16x16Offset * 3); - searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset * 3); - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[40], &pBestMV8x8[40], &pBestSad16x16[10], &pBestMV16x16[10], currMV, &pSad16x16[10 * 8]); - //---- 16x16_11 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[44], &pBestMV8x8[44], &pBestSad16x16[11], &pBestMV16x16[11], currMV, &pSad16x16[11 * 8]); - //---- 16x16_14 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[56], &pBestMV8x8[56], &pBestSad16x16[14], &pBestMV16x16[14], currMV, &pSad16x16[14 * 8]); - //---- 16x16_15 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[60], &pBestMV8x8[60], &pBestSad16x16[15], &pBestMV16x16[15], currMV, &pSad16x16[15 * 8]); - - - - - //32x32 and 64x64 - GetEightHorizontalSearchPointResults_32x32_64x64(pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); + EB_U8 *srcPtr = contextPtr->lcuSrcPtr; + + EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); + + EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; + + EB_U32 searchPositionTLIndex = searchRegionIndex; + EB_U32 searchPositionIndex; + EB_U32 blockIndex; + + EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); + EB_U32 refNext16x16Offset = (reflumaStride << 4); + + EB_U32 currMVy = (((EB_U16)ySearchIndex) << 18); + EB_U16 currMVx = (((EB_U16)xSearchIndex << 2)); + EB_U32 currMV = currMVy | currMVx; + + EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; + EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; + EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; + EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; + + EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; + EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; + EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; + EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; + + EB_U16 *pSad16x16 = contextPtr->pEightPosSad16x16; + + /* + ---------------------- ---------------------- + | 16x16_0 | 16x16_1 | 16x16_4 | 16x16_5 | + ---------------------- ---------------------- + | 16x16_2 | 16x16_3 | 16x16_6 | 16x16_7 | + ----------------------- ----------------------- + | 16x16_8 | 16x16_9 | 16x16_12 | 16x16_13 | + ---------------------- ---------------------- + | 16x16_10 | 16x16_11 | 16x16_14 | 16x16_15 | + ----------------------- ----------------------- + */ + + const EB_U32 srcStride = contextPtr->lcuSrcStride; + srcNext16x16Offset = srcStride << 4; + + //---- 16x16_0 + blockIndex = 0; + searchPositionIndex = searchPositionTLIndex; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[0], &pBestMV8x8[0], &pBestSad16x16[0], &pBestMV16x16[0], currMV, &pSad16x16[0 * 8]); + //---- 16x16_1 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionTLIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[4], &pBestMV8x8[4], &pBestSad16x16[1], &pBestMV16x16[1], currMV, &pSad16x16[1 * 8]); + //---- 16x16_4 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[16], &pBestMV8x8[16], &pBestSad16x16[4], &pBestMV16x16[4], currMV, &pSad16x16[4 * 8]); + //---- 16x16_5 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[20], &pBestMV8x8[20], &pBestSad16x16[5], &pBestMV16x16[5], currMV, &pSad16x16[5 * 8]); + + + + //---- 16x16_2 + blockIndex = srcNext16x16Offset; + searchPositionIndex = searchPositionTLIndex + refNext16x16Offset; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[8], &pBestMV8x8[8], &pBestSad16x16[2], &pBestMV16x16[2], currMV, &pSad16x16[2 * 8]); + //---- 16x16_3 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[12], &pBestMV8x8[12], &pBestSad16x16[3], &pBestMV16x16[3], currMV, &pSad16x16[3 * 8]); + //---- 16x16_6 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[24], &pBestMV8x8[24], &pBestSad16x16[6], &pBestMV16x16[6], currMV, &pSad16x16[6 * 8]); + //---- 16x16_7 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[28], &pBestMV8x8[28], &pBestSad16x16[7], &pBestMV16x16[7], currMV, &pSad16x16[7 * 8]); + + + //---- 16x16_8 + blockIndex = (srcNext16x16Offset << 1); + searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset << 1); + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[32], &pBestMV8x8[32], &pBestSad16x16[8], &pBestMV16x16[8], currMV, &pSad16x16[8 * 8]); + //---- 16x16_9 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[36], &pBestMV8x8[36], &pBestSad16x16[9], &pBestMV16x16[9], currMV, &pSad16x16[9 * 8]); + //---- 16x16_12 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[48], &pBestMV8x8[48], &pBestSad16x16[12], &pBestMV16x16[12], currMV, &pSad16x16[12 * 8]); + //---- 16x1_13 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[52], &pBestMV8x8[52], &pBestSad16x16[13], &pBestMV16x16[13], currMV, &pSad16x16[13 * 8]); + + + + //---- 16x16_10 + blockIndex = (srcNext16x16Offset * 3); + searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset * 3); + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[40], &pBestMV8x8[40], &pBestSad16x16[10], &pBestMV16x16[10], currMV, &pSad16x16[10 * 8]); + //---- 16x16_11 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[44], &pBestMV8x8[44], &pBestSad16x16[11], &pBestMV16x16[11], currMV, &pSad16x16[11 * 8]); + //---- 16x16_14 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[56], &pBestMV8x8[56], &pBestSad16x16[14], &pBestMV16x16[14], currMV, &pSad16x16[14 * 8]); + //---- 16x16_15 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + GetEightHorizontalSearchPointResults_8x8_16x16_PU(srcPtr + blockIndex, contextPtr->lcuSrcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[60], &pBestMV8x8[60], &pBestSad16x16[15], &pBestMV16x16[15], currMV, &pSad16x16[15 * 8]); + + + + + //32x32 and 64x64 + GetEightHorizontalSearchPointResults_32x32_64x64(pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); } @@ -427,20 +427,20 @@ static void GetEightHorizontalSearchPointResultsAll85PUs_AVX2_INTRIN( #endif typedef void(*EB_FPSEARCH_FUNC)( - MeContext_t *contextPtr, - EB_U32 listIndex, - EB_U32 searchRegionIndex, - EB_U32 xSearchIndex, - EB_U32 ySearchIndex); + MeContext_t *contextPtr, + EB_U32 listIndex, + EB_U32 searchRegionIndex, + EB_U32 xSearchIndex, + EB_U32 ySearchIndex); /***************************** * Function Tables *****************************/ static EB_FPSEARCH_FUNC FUNC_TABLE GetEightHorizontalSearchPointResultsAll85PUs_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - GetEightHorizontalSearchPointResultsAll85PUs_C, + GetEightHorizontalSearchPointResultsAll85PUs_C, #ifndef NON_AVX512_SUPPORT - GetEightHorizontalSearchPointResultsAll85PUs_AVX512_INTRIN + GetEightHorizontalSearchPointResultsAll85PUs_AVX512_INTRIN #else GetEightHorizontalSearchPointResultsAll85PUs_AVX2_INTRIN #endif @@ -451,132 +451,132 @@ static EB_FPSEARCH_FUNC FUNC_TABLE GetEightHorizontalSearchPointResultsAll85PUs_ * GetSearchPointResults *******************************************/ static void GetSearchPointResults( - MeContext_t *contextPtr, // input parameter, ME context Ptr, used to get LCU Ptr - EB_U32 listIndex, // input parameter, reference list index - EB_U32 searchRegionIndex, // input parameter, search area origin, used to point to reference samples - EB_U32 xSearchIndex, // input parameter, search region position in the horizontal direction, used to derive xMV - EB_U32 ySearchIndex) // input parameter, search region position in the vertical direction, used to derive yMV + MeContext_t *contextPtr, // input parameter, ME context Ptr, used to get LCU Ptr + EB_U32 listIndex, // input parameter, reference list index + EB_U32 searchRegionIndex, // input parameter, search area origin, used to point to reference samples + EB_U32 xSearchIndex, // input parameter, search region position in the horizontal direction, used to derive xMV + EB_U32 ySearchIndex) // input parameter, search region position in the vertical direction, used to derive yMV { - EB_U8 *srcPtr = contextPtr->lcuSrcPtr; + EB_U8 *srcPtr = contextPtr->lcuSrcPtr; - // EB_U8 *refPtr = refPicPtr->bufferY; // NADER - EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); + // EB_U8 *refPtr = refPicPtr->bufferY; // NADER + EB_U8 *refPtr = contextPtr->integerBufferPtr[listIndex][0] + (ME_FILTER_TAP >> 1) + ((ME_FILTER_TAP >> 1) * contextPtr->interpolatedFullStride[listIndex][0]); - // EB_U32 reflumaStride = refPicPtr->strideY; // NADER - EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; + // EB_U32 reflumaStride = refPicPtr->strideY; // NADER + EB_U32 reflumaStride = contextPtr->interpolatedFullStride[listIndex][0]; - EB_U32 searchPositionTLIndex = searchRegionIndex; - EB_U32 searchPositionIndex; - EB_U32 blockIndex; + EB_U32 searchPositionTLIndex = searchRegionIndex; + EB_U32 searchPositionIndex; + EB_U32 blockIndex; - EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); - //EB_U32 refNext16x16Offset = (refPicPtr->strideY << 4); // NADER - EB_U32 refNext16x16Offset = (reflumaStride << 4); + EB_U32 srcNext16x16Offset = (MAX_LCU_SIZE << 4); + //EB_U32 refNext16x16Offset = (refPicPtr->strideY << 4); // NADER + EB_U32 refNext16x16Offset = (reflumaStride << 4); - EB_U32 currMV1 = (((EB_U16)ySearchIndex) << 18); - EB_U16 currMV2 = (((EB_U16)xSearchIndex << 2)); - EB_U32 currMV = currMV1 | currMV2; + EB_U32 currMV1 = (((EB_U16)ySearchIndex) << 18); + EB_U16 currMV2 = (((EB_U16)xSearchIndex << 2)); + EB_U32 currMV = currMV1 | currMV2; - EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; - EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; - EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; - EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; + EB_U32 *pBestSad8x8 = contextPtr->pBestSad8x8; + EB_U32 *pBestSad16x16 = contextPtr->pBestSad16x16; + EB_U32 *pBestSad32x32 = contextPtr->pBestSad32x32; + EB_U32 *pBestSad64x64 = contextPtr->pBestSad64x64; - EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; - EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; - EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; - EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; - EB_U32 *pSad16x16 = contextPtr->pSad16x16; + EB_U32 *pBestMV8x8 = contextPtr->pBestMV8x8; + EB_U32 *pBestMV16x16 = contextPtr->pBestMV16x16; + EB_U32 *pBestMV32x32 = contextPtr->pBestMV32x32; + EB_U32 *pBestMV64x64 = contextPtr->pBestMV64x64; + EB_U32 *pSad16x16 = contextPtr->pSad16x16; - const EB_U32 srcStride = contextPtr->lcuSrcStride; - srcNext16x16Offset = srcStride << 4; + const EB_U32 srcStride = contextPtr->lcuSrcStride; + srcNext16x16Offset = srcStride << 4; - //---- 16x16 : 0 - blockIndex = 0; - searchPositionIndex = searchPositionTLIndex; - SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[0], &pBestSad16x16[0], &pBestMV8x8[0], &pBestMV16x16[0], currMV, &pSad16x16[0]); + //---- 16x16 : 0 + blockIndex = 0; + searchPositionIndex = searchPositionTLIndex; + SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[0], &pBestSad16x16[0], &pBestMV8x8[0], &pBestMV16x16[0], currMV, &pSad16x16[0]); - //---- 16x16 : 1 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionTLIndex + 16; + //---- 16x16 : 1 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionTLIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[4], &pBestSad16x16[1], &pBestMV8x8[4], &pBestMV16x16[1], currMV, &pSad16x16[1]); //---- 16x16 : 4 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[16], &pBestSad16x16[4], &pBestMV8x8[16], &pBestMV16x16[4], currMV, &pSad16x16[4]); - //---- 16x16 : 5 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + //---- 16x16 : 5 + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[20], &pBestSad16x16[5], &pBestMV8x8[20], &pBestMV16x16[5], currMV, &pSad16x16[5]); - //---- 16x16 : 2 - blockIndex = srcNext16x16Offset; - searchPositionIndex = searchPositionTLIndex + refNext16x16Offset; + //---- 16x16 : 2 + blockIndex = srcNext16x16Offset; + searchPositionIndex = searchPositionTLIndex + refNext16x16Offset; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[8], &pBestSad16x16[2], &pBestMV8x8[8], &pBestMV16x16[2], currMV, &pSad16x16[2]); //---- 16x16 : 3 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[12], &pBestSad16x16[3], &pBestMV8x8[12], &pBestMV16x16[3], currMV, &pSad16x16[3]); + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[12], &pBestSad16x16[3], &pBestMV8x8[12], &pBestMV16x16[3], currMV, &pSad16x16[3]); //---- 16x16 : 6 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; - SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[24], &pBestSad16x16[6], &pBestMV8x8[24], &pBestMV16x16[6], currMV, &pSad16x16[6]); + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; + SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[24], &pBestSad16x16[6], &pBestMV8x8[24], &pBestMV16x16[6], currMV, &pSad16x16[6]); //---- 16x16 : 7 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[28], &pBestSad16x16[7], &pBestMV8x8[28], &pBestMV16x16[7], currMV, &pSad16x16[7]); - //---- 16x16 : 8 - blockIndex = (srcNext16x16Offset << 1); - searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset << 1); - SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[32], &pBestSad16x16[8], &pBestMV8x8[32], &pBestMV16x16[8], currMV, &pSad16x16[8]); + //---- 16x16 : 8 + blockIndex = (srcNext16x16Offset << 1); + searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset << 1); + SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[32], &pBestSad16x16[8], &pBestMV8x8[32], &pBestMV16x16[8], currMV, &pSad16x16[8]); //---- 16x16 : 9 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[36], &pBestSad16x16[9], &pBestMV8x8[36], &pBestMV16x16[9], currMV, &pSad16x16[9]); //---- 16x16 : 12 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[48], &pBestSad16x16[12], &pBestMV8x8[48], &pBestMV16x16[12], currMV, &pSad16x16[12]); //---- 16x16 : 13 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[52], &pBestSad16x16[13], &pBestMV8x8[52], &pBestMV16x16[13], currMV, &pSad16x16[13]); - //---- 16x16 : 10 - blockIndex = (srcNext16x16Offset * 3); - searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset * 3); + //---- 16x16 : 10 + blockIndex = (srcNext16x16Offset * 3); + searchPositionIndex = searchPositionTLIndex + (refNext16x16Offset * 3); SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[40], &pBestSad16x16[10], &pBestMV8x8[40], &pBestMV16x16[10], currMV, &pSad16x16[10]); //---- 16x16 : 11 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[44], &pBestSad16x16[11], &pBestMV8x8[44], &pBestMV16x16[11], currMV, &pSad16x16[11]); //---- 16x16 : 14 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[56], &pBestSad16x16[14], &pBestMV8x8[56], &pBestMV16x16[14], currMV, &pSad16x16[14]); //---- 16x16 : 15 - blockIndex = blockIndex + 16; - searchPositionIndex = searchPositionIndex + 16; + blockIndex = blockIndex + 16; + searchPositionIndex = searchPositionIndex + 16; SadCalculation_8x8_16x16_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](srcPtr + blockIndex, srcStride, refPtr + searchPositionIndex, reflumaStride, &pBestSad8x8[60], &pBestSad16x16[15], &pBestMV8x8[60], &pBestMV16x16[15], currMV, &pSad16x16[15]); - SadCalculation_32x32_64x64_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); + SadCalculation_32x32_64x64_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pSad16x16, pBestSad32x32, pBestSad64x64, pBestMV32x32, pBestMV64x64, currMV); } @@ -584,52 +584,52 @@ static void GetSearchPointResults( * FullPelSearch_LCU *******************************************/ static void FullPelSearch_LCU( - MeContext_t *contextPtr, - EB_U32 listIndex, - EB_S16 xSearchAreaOrigin, - EB_S16 ySearchAreaOrigin, - EB_U32 searchAreaWidth, - EB_U32 searchAreaHeight + MeContext_t *contextPtr, + EB_U32 listIndex, + EB_S16 xSearchAreaOrigin, + EB_S16 ySearchAreaOrigin, + EB_U32 searchAreaWidth, + EB_U32 searchAreaHeight ) { - EB_U32 xSearchIndex, ySearchIndex; + EB_U32 xSearchIndex, ySearchIndex; - EB_U32 searchAreaWidthRest8 = searchAreaWidth & 7; - EB_U32 searchAreaWidthMult8 = searchAreaWidth - searchAreaWidthRest8; + EB_U32 searchAreaWidthRest8 = searchAreaWidth & 7; + EB_U32 searchAreaWidthMult8 = searchAreaWidth - searchAreaWidthRest8; - for (ySearchIndex = 0; ySearchIndex < searchAreaHeight; ySearchIndex++){ + for (ySearchIndex = 0; ySearchIndex < searchAreaHeight; ySearchIndex++){ - for (xSearchIndex = 0; xSearchIndex < searchAreaWidthMult8; xSearchIndex += 8){ + for (xSearchIndex = 0; xSearchIndex < searchAreaWidthMult8; xSearchIndex += 8){ - //this function will do: xSearchIndex, +1, +2, ..., +7 + //this function will do: xSearchIndex, +1, +2, ..., +7 #ifndef NON_AVX512_SUPPORT - GetEightHorizontalSearchPointResultsAll85PUs_funcPtrArray[ !!(ASM_TYPES & AVX512_MASK) ]( + GetEightHorizontalSearchPointResultsAll85PUs_funcPtrArray[ !!(ASM_TYPES & AVX512_MASK) ]( #else GetEightHorizontalSearchPointResultsAll85PUs_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( #endif - contextPtr, - listIndex, - xSearchIndex + ySearchIndex * contextPtr->interpolatedFullStride[listIndex][0], - xSearchIndex + xSearchAreaOrigin, - ySearchIndex + ySearchAreaOrigin - ); - } + contextPtr, + listIndex, + xSearchIndex + ySearchIndex * contextPtr->interpolatedFullStride[listIndex][0], + xSearchIndex + xSearchAreaOrigin, + ySearchIndex + ySearchAreaOrigin + ); + } - for (xSearchIndex = searchAreaWidthMult8; xSearchIndex < searchAreaWidth; xSearchIndex++){ + for (xSearchIndex = searchAreaWidthMult8; xSearchIndex < searchAreaWidth; xSearchIndex++){ - GetSearchPointResults( - contextPtr, - listIndex, - xSearchIndex + ySearchIndex * contextPtr->interpolatedFullStride[listIndex][0], - xSearchIndex + xSearchAreaOrigin, - ySearchIndex + ySearchAreaOrigin); + GetSearchPointResults( + contextPtr, + listIndex, + xSearchIndex + ySearchIndex * contextPtr->interpolatedFullStride[listIndex][0], + xSearchIndex + xSearchAreaOrigin, + ySearchIndex + ySearchAreaOrigin); - } + } - } + } } /******************************************* @@ -643,87 +643,87 @@ static void FullPelSearch_LCU( * F2: {-2, 16, 54, -4} ********************************************/ void EbHevcInterpolateSearchRegionAVC( - MeContext_t *contextPtr, // input/output parameter, ME context ptr, used to get/set interpolated search area Ptr - EB_U32 listIndex, // Refrence picture list index - EB_U8 *searchRegionBuffer, // input parameter, search region index, used to point to reference samples - EB_U32 lumaStride, // input parameter, reference Picture stride - EB_U32 searchAreaWidth, // input parameter, search area width - EB_U32 searchAreaHeight) // input parameter, search area height + MeContext_t *contextPtr, // input/output parameter, ME context ptr, used to get/set interpolated search area Ptr + EB_U32 listIndex, // Refrence picture list index + EB_U8 *searchRegionBuffer, // input parameter, search region index, used to point to reference samples + EB_U32 lumaStride, // input parameter, reference Picture stride + EB_U32 searchAreaWidth, // input parameter, search area width + EB_U32 searchAreaHeight) // input parameter, search area height { - // 0 1 2 3 - // 0 A a b c - // 1 d e f g - // 2 h i j k - // 3 n p q r - - // Position Frac-pos Y Frac-pos X Horizontal filter Vertical filter - // A 0 0 - - - // a 0 1 F0 - - // b 0 2 F1 - - // c 0 3 F2 - - // d 1 0 - F0 - // e 1 1 F0 F0 - // f 1 2 F1 F0 - // g 1 3 F2 F0 - // h 2 0 - F1 - // i 2 1 F0 F1 - // j 2 2 F1 F1 - // k 2 3 F2 F1 - // n 3 0 - F2 - // p 3 1 F0 F2 - // q 3 2 F1 F2 - // r 3 3 F2 F2 - - // Start a b c - - // The Search area needs to be a multiple of 8 to align with the ASM kernel - // Also the search area must be oversized by 2 to account for edge conditions - EB_U32 searchAreaWidthForAsm = ROUND_UP_MUL_8(searchAreaWidth + 2); - - // Half pel interpolation of the search region using f1 -> posbBuffer - if (searchAreaWidthForAsm){ - - AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][1]( - searchRegionBuffer - (ME_FILTER_TAP >> 1) * lumaStride - (ME_FILTER_TAP >> 1) + 1, - lumaStride, - contextPtr->posbBuffer[listIndex][0], - contextPtr->interpolatedStride, - searchAreaWidthForAsm, - searchAreaHeight + ME_FILTER_TAP, - contextPtr->avctempBuffer, - 2); - } - - // Half pel interpolation of the search region using f1 -> poshBuffer - if (searchAreaWidthForAsm){ - AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][2]( - searchRegionBuffer - (ME_FILTER_TAP >> 1) * lumaStride - 1 + lumaStride, - lumaStride, - contextPtr->poshBuffer[listIndex][0], - contextPtr->interpolatedStride, - searchAreaWidthForAsm, - searchAreaHeight + 1, - contextPtr->avctempBuffer, - 2); - } - - if (searchAreaWidthForAsm){ - // Half pel interpolation of the search region using f1 -> posjBuffer - AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][2]( - contextPtr->posbBuffer[listIndex][0] + contextPtr->interpolatedStride, - contextPtr->interpolatedStride, - contextPtr->posjBuffer[listIndex][0], - contextPtr->interpolatedStride, - searchAreaWidthForAsm, - searchAreaHeight + 1, - contextPtr->avctempBuffer, - 2); - } - - - - return; + // 0 1 2 3 + // 0 A a b c + // 1 d e f g + // 2 h i j k + // 3 n p q r + + // Position Frac-pos Y Frac-pos X Horizontal filter Vertical filter + // A 0 0 - - + // a 0 1 F0 - + // b 0 2 F1 - + // c 0 3 F2 - + // d 1 0 - F0 + // e 1 1 F0 F0 + // f 1 2 F1 F0 + // g 1 3 F2 F0 + // h 2 0 - F1 + // i 2 1 F0 F1 + // j 2 2 F1 F1 + // k 2 3 F2 F1 + // n 3 0 - F2 + // p 3 1 F0 F2 + // q 3 2 F1 F2 + // r 3 3 F2 F2 + + // Start a b c + + // The Search area needs to be a multiple of 8 to align with the ASM kernel + // Also the search area must be oversized by 2 to account for edge conditions + EB_U32 searchAreaWidthForAsm = ROUND_UP_MUL_8(searchAreaWidth + 2); + + // Half pel interpolation of the search region using f1 -> posbBuffer + if (searchAreaWidthForAsm){ + + AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][1]( + searchRegionBuffer - (ME_FILTER_TAP >> 1) * lumaStride - (ME_FILTER_TAP >> 1) + 1, + lumaStride, + contextPtr->posbBuffer[listIndex][0], + contextPtr->interpolatedStride, + searchAreaWidthForAsm, + searchAreaHeight + ME_FILTER_TAP, + contextPtr->avctempBuffer, + 2); + } + + // Half pel interpolation of the search region using f1 -> poshBuffer + if (searchAreaWidthForAsm){ + AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][2]( + searchRegionBuffer - (ME_FILTER_TAP >> 1) * lumaStride - 1 + lumaStride, + lumaStride, + contextPtr->poshBuffer[listIndex][0], + contextPtr->interpolatedStride, + searchAreaWidthForAsm, + searchAreaHeight + 1, + contextPtr->avctempBuffer, + 2); + } + + if (searchAreaWidthForAsm){ + // Half pel interpolation of the search region using f1 -> posjBuffer + AvcStyleUniPredLumaIFFunctionPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][2]( + contextPtr->posbBuffer[listIndex][0] + contextPtr->interpolatedStride, + contextPtr->interpolatedStride, + contextPtr->posjBuffer[listIndex][0], + contextPtr->interpolatedStride, + searchAreaWidthForAsm, + searchAreaHeight + 1, + contextPtr->avctempBuffer, + 2); + } + + + + return; } /******************************************* @@ -805,12 +805,12 @@ static void PU_HalfPelRefinement( puWidth); } - // Use SATD only when QP mod, and RC are OFF - // QP mod, and RC assume that ME distotion is always SAD. - // This problem might be solved by computing SAD for the best position after fractional search is done, or by considring the full pel resolution SAD. - { - // L position - searchRegionIndex = xSearchIndex + (EB_S16)contextPtr->interpolatedStride * ySearchIndex; + // Use SATD only when QP mod, and RC are OFF + // QP mod, and RC assume that ME distotion is always SAD. + // This problem might be solved by computing SAD for the best position after fractional search is done, or by considring the full pel resolution SAD. + { + // L position + searchRegionIndex = xSearchIndex + (EB_S16)contextPtr->interpolatedStride * ySearchIndex; distortionLeftPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(posbBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -832,8 +832,8 @@ static void PU_HalfPelRefinement( } } - // R position - searchRegionIndex++; + // R position + searchRegionIndex++; distortionRightPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(posbBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -856,8 +856,8 @@ static void PU_HalfPelRefinement( } } - // T position - searchRegionIndex = xSearchIndex + (EB_S16)contextPtr->interpolatedStride * ySearchIndex; + // T position + searchRegionIndex = xSearchIndex + (EB_S16)contextPtr->interpolatedStride * ySearchIndex; distortionTopPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(poshBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -879,8 +879,8 @@ static void PU_HalfPelRefinement( } } - // B position - searchRegionIndex += (EB_S16)contextPtr->interpolatedStride; + // B position + searchRegionIndex += (EB_S16)contextPtr->interpolatedStride; distortionBottomPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(poshBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -902,8 +902,8 @@ static void PU_HalfPelRefinement( } } - //TL position - searchRegionIndex = xSearchIndex + (EB_S16)contextPtr->interpolatedStride * ySearchIndex; + //TL position + searchRegionIndex = xSearchIndex + (EB_S16)contextPtr->interpolatedStride * ySearchIndex; distortionTopLeftPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(posjBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -926,8 +926,8 @@ static void PU_HalfPelRefinement( } - //TR position - searchRegionIndex++; + //TR position + searchRegionIndex++; distortionTopRightPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(posjBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -949,8 +949,8 @@ static void PU_HalfPelRefinement( } } - //BR position - searchRegionIndex += (EB_S16)contextPtr->interpolatedStride; + //BR position + searchRegionIndex += (EB_S16)contextPtr->interpolatedStride; distortionBottomRightPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(posjBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -972,8 +972,8 @@ static void PU_HalfPelRefinement( } } - //BL position - searchRegionIndex--; + //BL position + searchRegionIndex--; distortionBottomLeftPosition = (contextPtr->fractionalSearchMethod == SSD_SEARCH) ? SpatialFullDistortionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][Log2f(puWidth) - 2](&(contextPtr->lcuSrcPtr[puLcuBufferIndex]), contextPtr->lcuSrcStride, &(posjBuffer[searchRegionIndex]), contextPtr->interpolatedStride, puHeight, puWidth) : @@ -994,37 +994,37 @@ static void PU_HalfPelRefinement( *pBestMV = ((EB_U16)yMvHalf[7] << 16) | ((EB_U16)xMvHalf[7]); } } - } - - bestHalfSad = MIN(distortionLeftPosition, MIN(distortionRightPosition, MIN(distortionTopPosition, MIN(distortionBottomPosition, MIN(distortionTopLeftPosition, MIN(distortionTopRightPosition, MIN(distortionBottomLeftPosition, distortionBottomRightPosition))))))); - - - if (bestHalfSad == distortionLeftPosition) { - *psubPelDirection = LEFT_POSITION; - } - else if (bestHalfSad == distortionRightPosition) { - *psubPelDirection = RIGHT_POSITION; - } - else if (bestHalfSad == distortionTopPosition) { - *psubPelDirection = TOP_POSITION; - } - else if (bestHalfSad == distortionBottomPosition) { - *psubPelDirection = BOTTOM_POSITION; - } - else if (bestHalfSad == distortionTopLeftPosition) { - *psubPelDirection = TOP_LEFT_POSITION; - } - else if (bestHalfSad == distortionTopRightPosition) { - *psubPelDirection = TOP_RIGHT_POSITION; - } - else if (bestHalfSad == distortionBottomLeftPosition) { - *psubPelDirection = BOTTOM_LEFT_POSITION; - } - else if (bestHalfSad == distortionBottomRightPosition) { - *psubPelDirection = BOTTOM_RIGHT_POSITION; - } - - return; + } + + bestHalfSad = MIN(distortionLeftPosition, MIN(distortionRightPosition, MIN(distortionTopPosition, MIN(distortionBottomPosition, MIN(distortionTopLeftPosition, MIN(distortionTopRightPosition, MIN(distortionBottomLeftPosition, distortionBottomRightPosition))))))); + + + if (bestHalfSad == distortionLeftPosition) { + *psubPelDirection = LEFT_POSITION; + } + else if (bestHalfSad == distortionRightPosition) { + *psubPelDirection = RIGHT_POSITION; + } + else if (bestHalfSad == distortionTopPosition) { + *psubPelDirection = TOP_POSITION; + } + else if (bestHalfSad == distortionBottomPosition) { + *psubPelDirection = BOTTOM_POSITION; + } + else if (bestHalfSad == distortionTopLeftPosition) { + *psubPelDirection = TOP_LEFT_POSITION; + } + else if (bestHalfSad == distortionTopRightPosition) { + *psubPelDirection = TOP_RIGHT_POSITION; + } + else if (bestHalfSad == distortionBottomLeftPosition) { + *psubPelDirection = BOTTOM_LEFT_POSITION; + } + else if (bestHalfSad == distortionBottomRightPosition) { + *psubPelDirection = BOTTOM_RIGHT_POSITION; + } + + return; } @@ -1034,28 +1034,28 @@ static void PU_HalfPelRefinement( * performs Half Pel refinement for the 85 PUs *******************************************/ void EbHevcHalfPelSearch_LCU( - SequenceControlSet_t *sequenceControlSetPtr, // input parameter, Sequence control set Ptr - MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results + SequenceControlSet_t *sequenceControlSetPtr, // input parameter, Sequence control set Ptr + MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results EB_U8 *refBuffer, EB_U32 refStride, - EB_U8 *posbBuffer, // input parameter, position "b" interpolated search area Ptr - EB_U8 *poshBuffer, // input parameter, position "h" interpolated search area Ptr - EB_U8 *posjBuffer, // input parameter, position "j" interpolated search area Ptr - EB_S16 xSearchAreaOrigin, // input parameter, search area origin in the horizontal direction, used to point to reference samples - EB_S16 ySearchAreaOrigin, // input parameter, search area origin in the vertical direction, used to point to reference samples - EB_BOOL disable8x8CuInMeFlag, - EB_BOOL enableHalfPel32x32, - EB_BOOL enableHalfPel16x16, - EB_BOOL enableHalfPel8x8){ - - EB_U32 idx; - EB_U32 puIndex; - EB_U32 puShiftXIndex; - EB_U32 puShiftYIndex; - EB_U32 puLcuBufferIndex; - EB_U32 posbBufferIndex; - EB_U32 poshBufferIndex; - EB_U32 posjBufferIndex; + EB_U8 *posbBuffer, // input parameter, position "b" interpolated search area Ptr + EB_U8 *poshBuffer, // input parameter, position "h" interpolated search area Ptr + EB_U8 *posjBuffer, // input parameter, position "j" interpolated search area Ptr + EB_S16 xSearchAreaOrigin, // input parameter, search area origin in the horizontal direction, used to point to reference samples + EB_S16 ySearchAreaOrigin, // input parameter, search area origin in the vertical direction, used to point to reference samples + EB_BOOL disable8x8CuInMeFlag, + EB_BOOL enableHalfPel32x32, + EB_BOOL enableHalfPel16x16, + EB_BOOL enableHalfPel8x8){ + + EB_U32 idx; + EB_U32 puIndex; + EB_U32 puShiftXIndex; + EB_U32 puShiftYIndex; + EB_U32 puLcuBufferIndex; + EB_U32 posbBufferIndex; + EB_U32 poshBufferIndex; + EB_U32 posjBufferIndex; if (contextPtr->fractionalSearch64x64){ PU_HalfPelRefinement( @@ -1077,113 +1077,113 @@ void EbHevcHalfPelSearch_LCU( &contextPtr->psubPelDirection64x64); } - if ( enableHalfPel32x32 ) - { - // 32x32 [4 partitions] - for (puIndex = 0; puIndex < 4; ++puIndex) { + if ( enableHalfPel32x32 ) + { + // 32x32 [4 partitions] + for (puIndex = 0; puIndex < 4; ++puIndex) { - puShiftXIndex = (puIndex & 0x01) << 5; - puShiftYIndex = (puIndex >> 1) << 5; + puShiftXIndex = (puIndex & 0x01) << 5; + puShiftYIndex = (puIndex >> 1) << 5; - puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; - posbBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - poshBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - posjBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; + posbBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + poshBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + posjBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - PU_HalfPelRefinement( - sequenceControlSetPtr, - contextPtr, + PU_HalfPelRefinement( + sequenceControlSetPtr, + contextPtr, &(refBuffer[puShiftYIndex * refStride + puShiftXIndex]), refStride, &contextPtr->pBestSsd32x32[puIndex], - puLcuBufferIndex, - &(posbBuffer[posbBufferIndex]), - &(poshBuffer[poshBufferIndex]), - &(posjBuffer[posjBufferIndex]), - 32, - 32, - xSearchAreaOrigin, - ySearchAreaOrigin, - &contextPtr->pBestSad32x32[puIndex], - &contextPtr->pBestMV32x32[puIndex], - &contextPtr->psubPelDirection32x32[puIndex]); - } - } - if ( enableHalfPel16x16 ) - { - // 16x16 [16 partitions] - for (puIndex = 0; puIndex < 16; ++puIndex) { - - idx = tab32x32[puIndex]; //TODO bitwise this - - puShiftXIndex = (puIndex & 0x03) << 4; - puShiftYIndex = (puIndex >> 2) << 4; - - puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; - posbBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - poshBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - posjBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - - PU_HalfPelRefinement( - sequenceControlSetPtr, - contextPtr, + puLcuBufferIndex, + &(posbBuffer[posbBufferIndex]), + &(poshBuffer[poshBufferIndex]), + &(posjBuffer[posjBufferIndex]), + 32, + 32, + xSearchAreaOrigin, + ySearchAreaOrigin, + &contextPtr->pBestSad32x32[puIndex], + &contextPtr->pBestMV32x32[puIndex], + &contextPtr->psubPelDirection32x32[puIndex]); + } + } + if ( enableHalfPel16x16 ) + { + // 16x16 [16 partitions] + for (puIndex = 0; puIndex < 16; ++puIndex) { + + idx = tab32x32[puIndex]; //TODO bitwise this + + puShiftXIndex = (puIndex & 0x03) << 4; + puShiftYIndex = (puIndex >> 2) << 4; + + puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; + posbBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + poshBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + posjBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + + PU_HalfPelRefinement( + sequenceControlSetPtr, + contextPtr, &(refBuffer[puShiftYIndex * refStride + puShiftXIndex]), refStride, &contextPtr->pBestSsd16x16[idx], - puLcuBufferIndex, - &(posbBuffer[posbBufferIndex]), - &(poshBuffer[poshBufferIndex]), - &(posjBuffer[posjBufferIndex]), - 16, - 16, - xSearchAreaOrigin, - ySearchAreaOrigin, - &contextPtr->pBestSad16x16[idx], - &contextPtr->pBestMV16x16[idx], - &contextPtr->psubPelDirection16x16[idx]); - } - } - if ( enableHalfPel8x8 ) - { - // 8x8 [64 partitions] - if (!disable8x8CuInMeFlag){ - for (puIndex = 0; puIndex < 64; ++puIndex) { - - idx = tab8x8[puIndex]; //TODO bitwise this - - puShiftXIndex = (puIndex & 0x07) << 3; - puShiftYIndex = (puIndex >> 3) << 3; - - puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; - - posbBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - poshBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - posjBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; - - PU_HalfPelRefinement( - sequenceControlSetPtr, - contextPtr, + puLcuBufferIndex, + &(posbBuffer[posbBufferIndex]), + &(poshBuffer[poshBufferIndex]), + &(posjBuffer[posjBufferIndex]), + 16, + 16, + xSearchAreaOrigin, + ySearchAreaOrigin, + &contextPtr->pBestSad16x16[idx], + &contextPtr->pBestMV16x16[idx], + &contextPtr->psubPelDirection16x16[idx]); + } + } + if ( enableHalfPel8x8 ) + { + // 8x8 [64 partitions] + if (!disable8x8CuInMeFlag){ + for (puIndex = 0; puIndex < 64; ++puIndex) { + + idx = tab8x8[puIndex]; //TODO bitwise this + + puShiftXIndex = (puIndex & 0x07) << 3; + puShiftYIndex = (puIndex >> 3) << 3; + + puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; + + posbBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + poshBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + posjBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->interpolatedStride; + + PU_HalfPelRefinement( + sequenceControlSetPtr, + contextPtr, &(refBuffer[puShiftYIndex * refStride + puShiftXIndex]), refStride, &contextPtr->pBestSsd8x8[idx], - puLcuBufferIndex, - &(posbBuffer[posbBufferIndex]), - &(poshBuffer[poshBufferIndex]), - &(posjBuffer[posjBufferIndex]), - 8, - 8, - xSearchAreaOrigin, - ySearchAreaOrigin, - &contextPtr->pBestSad8x8[idx], - &contextPtr->pBestMV8x8[idx], - &contextPtr->psubPelDirection8x8[idx]); - - } - } - } - - return; + puLcuBufferIndex, + &(posbBuffer[posbBufferIndex]), + &(poshBuffer[poshBufferIndex]), + &(posjBuffer[posjBufferIndex]), + 8, + 8, + xSearchAreaOrigin, + ySearchAreaOrigin, + &contextPtr->pBestSad8x8[idx], + &contextPtr->pBestMV8x8[idx], + &contextPtr->psubPelDirection8x8[idx]); + + } + } + } + + return; } /******************************************* @@ -1621,19 +1621,19 @@ static void SetQuarterPelRefinementInputsOnTheFly( * performs Quarter Pel refinement for the 85 PUs *******************************************/ static void QuarterPelSearch_LCU( - MeContext_t *contextPtr, //[IN/OUT] ME context Ptr, used to get/update ME results - EB_U8 *pos_Full, //[IN] - EB_U32 FullStride, //[IN] - EB_U8 *pos_b, //[IN] - EB_U8 *pos_h, //[IN] - EB_U8 *pos_j, //[IN] - EB_S16 xSearchAreaOrigin, //[IN] search area origin in the horizontal direction, used to point to reference samples - EB_S16 ySearchAreaOrigin, //[IN] search area origin in the vertical direction, used to point to reference samples - EB_BOOL disable8x8CuInMeFlag, - EB_BOOL enableHalfPel32x32, - EB_BOOL enableHalfPel16x16, - EB_BOOL enableHalfPel8x8, - EB_BOOL enableQuarterPel) + MeContext_t *contextPtr, //[IN/OUT] ME context Ptr, used to get/update ME results + EB_U8 *pos_Full, //[IN] + EB_U32 FullStride, //[IN] + EB_U8 *pos_b, //[IN] + EB_U8 *pos_h, //[IN] + EB_U8 *pos_j, //[IN] + EB_S16 xSearchAreaOrigin, //[IN] search area origin in the horizontal direction, used to point to reference samples + EB_S16 ySearchAreaOrigin, //[IN] search area origin in the vertical direction, used to point to reference samples + EB_BOOL disable8x8CuInMeFlag, + EB_BOOL enableHalfPel32x32, + EB_BOOL enableHalfPel16x16, + EB_BOOL enableHalfPel8x8, + EB_BOOL enableQuarterPel) { EB_U32 puIndex; @@ -1845,117 +1845,117 @@ static void QuarterPelSearch_LCU( void EbHevcHmeOneQuadrantLevel0( - MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results - EB_S16 originX, // input parameter, LCU position in the horizontal direction- sixteenth resolution - EB_S16 originY, // input parameter, LCU position in the vertical direction- sixteenth resolution - EB_U32 lcuWidth, // input parameter, LCU pwidth - sixteenth resolution - EB_U32 lcuHeight, // input parameter, LCU height - sixteenth resolution - EB_S16 xHmeSearchCenter, // input parameter, HME search center in the horizontal direction - EB_S16 yHmeSearchCenter, // input parameter, HME search center in the vertical direction - EbPictureBufferDesc_t *sixteenthRefPicPtr, // input parameter, sixteenth reference Picture Ptr - EB_U64 *level0BestSad, // output parameter, Level0 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *xLevel0SearchCenter, // output parameter, Level0 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *yLevel0SearchCenter, // output parameter, Level0 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_U32 searchAreaMultiplierX, - EB_U32 searchAreaMultiplierY) + MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results + EB_S16 originX, // input parameter, LCU position in the horizontal direction- sixteenth resolution + EB_S16 originY, // input parameter, LCU position in the vertical direction- sixteenth resolution + EB_U32 lcuWidth, // input parameter, LCU pwidth - sixteenth resolution + EB_U32 lcuHeight, // input parameter, LCU height - sixteenth resolution + EB_S16 xHmeSearchCenter, // input parameter, HME search center in the horizontal direction + EB_S16 yHmeSearchCenter, // input parameter, HME search center in the vertical direction + EbPictureBufferDesc_t *sixteenthRefPicPtr, // input parameter, sixteenth reference Picture Ptr + EB_U64 *level0BestSad, // output parameter, Level0 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *xLevel0SearchCenter, // output parameter, Level0 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *yLevel0SearchCenter, // output parameter, Level0 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_U32 searchAreaMultiplierX, + EB_U32 searchAreaMultiplierY) { - EB_S16 xTopLeftSearchRegion; - EB_S16 yTopLeftSearchRegion; - EB_U32 searchRegionIndex; - EB_S16 xSearchAreaOrigin; - EB_S16 ySearchAreaOrigin; - EB_S16 xSearchRegionDistance; - EB_S16 ySearchRegionDistance; + EB_S16 xTopLeftSearchRegion; + EB_S16 yTopLeftSearchRegion; + EB_U32 searchRegionIndex; + EB_S16 xSearchAreaOrigin; + EB_S16 ySearchAreaOrigin; + EB_S16 xSearchRegionDistance; + EB_S16 ySearchRegionDistance; - EB_S16 padWidth; - EB_S16 padHeight; + EB_S16 padWidth; + EB_S16 padHeight; EB_S16 searchAreaWidth = (EB_S16)(((contextPtr->hmeLevel0TotalSearchAreaWidth * searchAreaMultiplierX) / 100)); - EB_S16 searchAreaHeight = (EB_S16)(((contextPtr->hmeLevel0TotalSearchAreaHeight * searchAreaMultiplierY) / 100)); + EB_S16 searchAreaHeight = (EB_S16)(((contextPtr->hmeLevel0TotalSearchAreaHeight * searchAreaMultiplierY) / 100)); if(contextPtr->hmeSearchType == HME_SPARSE) searchAreaWidth = ((searchAreaWidth +4)>>3)<<3; //round down/up the width to the nearest multiple of 8. - xSearchRegionDistance = xHmeSearchCenter; - ySearchRegionDistance = yHmeSearchCenter; - padWidth = (EB_S16)(sixteenthRefPicPtr->originX) - 1; - padHeight = (EB_S16)(sixteenthRefPicPtr->originY) - 1; + xSearchRegionDistance = xHmeSearchCenter; + ySearchRegionDistance = yHmeSearchCenter; + padWidth = (EB_S16)(sixteenthRefPicPtr->originX) - 1; + padHeight = (EB_S16)(sixteenthRefPicPtr->originY) - 1; xSearchAreaOrigin = -(EB_S16)(searchAreaWidth >> 1) + xSearchRegionDistance; - ySearchAreaOrigin = -(EB_S16)(searchAreaHeight >> 1) + ySearchRegionDistance; + ySearchAreaOrigin = -(EB_S16)(searchAreaHeight >> 1) + ySearchRegionDistance; - // Correct the left edge of the Search Area if it is not on the reference Picture - xSearchAreaOrigin = ((originX + xSearchAreaOrigin) < -padWidth) ? - -padWidth - originX : - xSearchAreaOrigin; + // Correct the left edge of the Search Area if it is not on the reference Picture + xSearchAreaOrigin = ((originX + xSearchAreaOrigin) < -padWidth) ? + -padWidth - originX : + xSearchAreaOrigin; - searchAreaWidth = ((originX + xSearchAreaOrigin) < -padWidth) ? - searchAreaWidth - (-padWidth - (originX + xSearchAreaOrigin)) : - searchAreaWidth; + searchAreaWidth = ((originX + xSearchAreaOrigin) < -padWidth) ? + searchAreaWidth - (-padWidth - (originX + xSearchAreaOrigin)) : + searchAreaWidth; - // Correct the right edge of the Search Area if its not on the reference Picture - xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->width - 1) ? - xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->width - 1)) : - xSearchAreaOrigin; + // Correct the right edge of the Search Area if its not on the reference Picture + xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->width - 1) ? + xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->width - 1)) : + xSearchAreaOrigin; - searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)sixteenthRefPicPtr->width) ? - MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)sixteenthRefPicPtr->width)) : - searchAreaWidth; + searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)sixteenthRefPicPtr->width) ? + MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)sixteenthRefPicPtr->width)) : + searchAreaWidth; - // Correct the top edge of the Search Area if it is not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? - -padHeight - originY : - ySearchAreaOrigin; + // Correct the top edge of the Search Area if it is not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? + -padHeight - originY : + ySearchAreaOrigin; - searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? - searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : - searchAreaHeight; + searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? + searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : + searchAreaHeight; - // Correct the bottom edge of the Search Area if its not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->height - 1) ? - ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->height - 1)) : - ySearchAreaOrigin; + // Correct the bottom edge of the Search Area if its not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->height - 1) ? + ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->height - 1)) : + ySearchAreaOrigin; - searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)sixteenthRefPicPtr->height) ? - MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)sixteenthRefPicPtr->height)) : - searchAreaHeight; + searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)sixteenthRefPicPtr->height) ? + MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)sixteenthRefPicPtr->height)) : + searchAreaHeight; - xTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originX + originX) + xSearchAreaOrigin; - yTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originY + originY) + ySearchAreaOrigin; - searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * sixteenthRefPicPtr->strideY; + xTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originX + originX) + xSearchAreaOrigin; + yTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originY + originY) + ySearchAreaOrigin; + searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * sixteenthRefPicPtr->strideY; - { + { - if ((searchAreaWidth & 15) != 0) - { - searchAreaWidth = (EB_S16)((double)((searchAreaWidth >> 4) << 4)); - } + if ((searchAreaWidth & 15) != 0) + { + searchAreaWidth = (EB_S16)((double)((searchAreaWidth >> 4) << 4)); + } #ifndef NON_AVX512_SUPPORT - if (((searchAreaWidth & 15) == 0) && (!!(ASM_TYPES & AVX512_MASK))) + if (((searchAreaWidth & 15) == 0) && (!!(ASM_TYPES & AVX512_MASK))) #else if (((searchAreaWidth & 15) == 0) && (!!(ASM_TYPES & AVX2_MASK))) #endif - { + { #ifndef NON_AVX512_SUPPORT - SadLoopKernel_AVX512_HmeL0_INTRIN( - &contextPtr->sixteenthLcuBuffer[0], - contextPtr->sixteenthLcuBufferStride, - &sixteenthRefPicPtr->bufferY[searchRegionIndex], - sixteenthRefPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - // results - level0BestSad, - xLevel0SearchCenter, - yLevel0SearchCenter, - // range - sixteenthRefPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); + SadLoopKernel_AVX512_HmeL0_INTRIN( + &contextPtr->sixteenthLcuBuffer[0], + contextPtr->sixteenthLcuBufferStride, + &sixteenthRefPicPtr->bufferY[searchRegionIndex], + sixteenthRefPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + // results + level0BestSad, + xLevel0SearchCenter, + yLevel0SearchCenter, + // range + sixteenthRefPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); #else SadLoopKernel_AVX2_HmeL0_INTRIN( &contextPtr->sixteenthLcuBuffer[0], @@ -1999,132 +1999,132 @@ void EbHevcHmeOneQuadrantLevel0( } } - *level0BestSad *= 2; // Multiply by 2 because considered only ever other line - *xLevel0SearchCenter += xSearchAreaOrigin; - *xLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution - *yLevel0SearchCenter += ySearchAreaOrigin; - *yLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution + *level0BestSad *= 2; // Multiply by 2 because considered only ever other line + *xLevel0SearchCenter += xSearchAreaOrigin; + *xLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution + *yLevel0SearchCenter += ySearchAreaOrigin; + *yLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution - return; + return; } void EbHevcHmeLevel0( - MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results - EB_S16 originX, // input parameter, LCU position in the horizontal direction- sixteenth resolution - EB_S16 originY, // input parameter, LCU position in the vertical direction- sixteenth resolution - EB_U32 lcuWidth, // input parameter, LCU pwidth - sixteenth resolution - EB_U32 lcuHeight, // input parameter, LCU height - sixteenth resolution - EB_S16 xHmeSearchCenter, // input parameter, HME search center in the horizontal direction - EB_S16 yHmeSearchCenter, // input parameter, HME search center in the vertical direction - EbPictureBufferDesc_t *sixteenthRefPicPtr, // input parameter, sixteenth reference Picture Ptr - EB_U32 searchRegionNumberInWidth, // input parameter, search region number in the horizontal direction - EB_U32 searchRegionNumberInHeight, // input parameter, search region number in the vertical direction - EB_U64 *level0BestSad, // output parameter, Level0 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *xLevel0SearchCenter, // output parameter, Level0 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *yLevel0SearchCenter, // output parameter, Level0 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_U32 searchAreaMultiplierX, - EB_U32 searchAreaMultiplierY) + MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results + EB_S16 originX, // input parameter, LCU position in the horizontal direction- sixteenth resolution + EB_S16 originY, // input parameter, LCU position in the vertical direction- sixteenth resolution + EB_U32 lcuWidth, // input parameter, LCU pwidth - sixteenth resolution + EB_U32 lcuHeight, // input parameter, LCU height - sixteenth resolution + EB_S16 xHmeSearchCenter, // input parameter, HME search center in the horizontal direction + EB_S16 yHmeSearchCenter, // input parameter, HME search center in the vertical direction + EbPictureBufferDesc_t *sixteenthRefPicPtr, // input parameter, sixteenth reference Picture Ptr + EB_U32 searchRegionNumberInWidth, // input parameter, search region number in the horizontal direction + EB_U32 searchRegionNumberInHeight, // input parameter, search region number in the vertical direction + EB_U64 *level0BestSad, // output parameter, Level0 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *xLevel0SearchCenter, // output parameter, Level0 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *yLevel0SearchCenter, // output parameter, Level0 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_U32 searchAreaMultiplierX, + EB_U32 searchAreaMultiplierY) { - EB_S16 xTopLeftSearchRegion; - EB_S16 yTopLeftSearchRegion; - EB_U32 searchRegionIndex; - EB_S16 xSearchAreaOrigin; - EB_S16 ySearchAreaOrigin; - EB_S16 xSearchRegionDistance; - EB_S16 ySearchRegionDistance; - - EB_S16 padWidth; - EB_S16 padHeight; - - // Adjust SR size based on the searchAreaShift - EB_S16 searchAreaWidth = (EB_S16)(((contextPtr->hmeLevel0SearchAreaInWidthArray[searchRegionNumberInWidth] * searchAreaMultiplierX) / 100)); - EB_S16 searchAreaHeight = (EB_S16)(((contextPtr->hmeLevel0SearchAreaInHeightArray[searchRegionNumberInHeight] * searchAreaMultiplierY) / 100)); - - - xSearchRegionDistance = xHmeSearchCenter; - ySearchRegionDistance = yHmeSearchCenter; - padWidth = (EB_S16)(sixteenthRefPicPtr->originX) - 1; - padHeight = (EB_S16)(sixteenthRefPicPtr->originY) - 1; - - while (searchRegionNumberInWidth) { - searchRegionNumberInWidth--; - xSearchRegionDistance += (EB_S16)(((contextPtr->hmeLevel0SearchAreaInWidthArray[searchRegionNumberInWidth] * searchAreaMultiplierX) / 100)); - } - - while (searchRegionNumberInHeight) { - searchRegionNumberInHeight--; - ySearchRegionDistance += (EB_S16)(((contextPtr->hmeLevel0SearchAreaInHeightArray[searchRegionNumberInHeight] * searchAreaMultiplierY) / 100)); - } - - xSearchAreaOrigin = -(EB_S16)((((contextPtr->hmeLevel0TotalSearchAreaWidth * searchAreaMultiplierX) / 100) ) >> 1) + xSearchRegionDistance; - ySearchAreaOrigin = -(EB_S16)((((contextPtr->hmeLevel0TotalSearchAreaHeight * searchAreaMultiplierY) / 100)) >> 1) + ySearchRegionDistance; - - // Correct the left edge of the Search Area if it is not on the reference Picture - xSearchAreaOrigin = ((originX + xSearchAreaOrigin) < -padWidth) ? - -padWidth - originX : - xSearchAreaOrigin; - - searchAreaWidth = ((originX + xSearchAreaOrigin) < -padWidth) ? - searchAreaWidth - (-padWidth - (originX + xSearchAreaOrigin)) : - searchAreaWidth; - - // Correct the right edge of the Search Area if its not on the reference Picture - xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->width - 1) ? - xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->width - 1)) : - xSearchAreaOrigin; - - searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)sixteenthRefPicPtr->width) ? - MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)sixteenthRefPicPtr->width)) : - searchAreaWidth; - - // Correct the top edge of the Search Area if it is not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? - -padHeight - originY : - ySearchAreaOrigin; - - searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? - searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : - searchAreaHeight; - - // Correct the bottom edge of the Search Area if its not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->height - 1) ? - ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->height - 1)) : - ySearchAreaOrigin; - - searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)sixteenthRefPicPtr->height) ? - MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)sixteenthRefPicPtr->height)) : - searchAreaHeight; - - xTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originX + originX) + xSearchAreaOrigin; - yTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originY + originY) + ySearchAreaOrigin; - searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * sixteenthRefPicPtr->strideY; - - if (((lcuWidth & 7) == 0) || (lcuWidth == 4)) - { + EB_S16 xTopLeftSearchRegion; + EB_S16 yTopLeftSearchRegion; + EB_U32 searchRegionIndex; + EB_S16 xSearchAreaOrigin; + EB_S16 ySearchAreaOrigin; + EB_S16 xSearchRegionDistance; + EB_S16 ySearchRegionDistance; + + EB_S16 padWidth; + EB_S16 padHeight; + + // Adjust SR size based on the searchAreaShift + EB_S16 searchAreaWidth = (EB_S16)(((contextPtr->hmeLevel0SearchAreaInWidthArray[searchRegionNumberInWidth] * searchAreaMultiplierX) / 100)); + EB_S16 searchAreaHeight = (EB_S16)(((contextPtr->hmeLevel0SearchAreaInHeightArray[searchRegionNumberInHeight] * searchAreaMultiplierY) / 100)); + + + xSearchRegionDistance = xHmeSearchCenter; + ySearchRegionDistance = yHmeSearchCenter; + padWidth = (EB_S16)(sixteenthRefPicPtr->originX) - 1; + padHeight = (EB_S16)(sixteenthRefPicPtr->originY) - 1; + + while (searchRegionNumberInWidth) { + searchRegionNumberInWidth--; + xSearchRegionDistance += (EB_S16)(((contextPtr->hmeLevel0SearchAreaInWidthArray[searchRegionNumberInWidth] * searchAreaMultiplierX) / 100)); + } + + while (searchRegionNumberInHeight) { + searchRegionNumberInHeight--; + ySearchRegionDistance += (EB_S16)(((contextPtr->hmeLevel0SearchAreaInHeightArray[searchRegionNumberInHeight] * searchAreaMultiplierY) / 100)); + } + + xSearchAreaOrigin = -(EB_S16)((((contextPtr->hmeLevel0TotalSearchAreaWidth * searchAreaMultiplierX) / 100) ) >> 1) + xSearchRegionDistance; + ySearchAreaOrigin = -(EB_S16)((((contextPtr->hmeLevel0TotalSearchAreaHeight * searchAreaMultiplierY) / 100)) >> 1) + ySearchRegionDistance; + + // Correct the left edge of the Search Area if it is not on the reference Picture + xSearchAreaOrigin = ((originX + xSearchAreaOrigin) < -padWidth) ? + -padWidth - originX : + xSearchAreaOrigin; + + searchAreaWidth = ((originX + xSearchAreaOrigin) < -padWidth) ? + searchAreaWidth - (-padWidth - (originX + xSearchAreaOrigin)) : + searchAreaWidth; + + // Correct the right edge of the Search Area if its not on the reference Picture + xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->width - 1) ? + xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->width - 1)) : + xSearchAreaOrigin; + + searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)sixteenthRefPicPtr->width) ? + MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)sixteenthRefPicPtr->width)) : + searchAreaWidth; + + // Correct the top edge of the Search Area if it is not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? + -padHeight - originY : + ySearchAreaOrigin; + + searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? + searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : + searchAreaHeight; + + // Correct the bottom edge of the Search Area if its not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)sixteenthRefPicPtr->height - 1) ? + ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)sixteenthRefPicPtr->height - 1)) : + ySearchAreaOrigin; + + searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)sixteenthRefPicPtr->height) ? + MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)sixteenthRefPicPtr->height)) : + searchAreaHeight; + + xTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originX + originX) + xSearchAreaOrigin; + yTopLeftSearchRegion = ((EB_S16)sixteenthRefPicPtr->originY + originY) + ySearchAreaOrigin; + searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * sixteenthRefPicPtr->strideY; + + if (((lcuWidth & 7) == 0) || (lcuWidth == 4)) + { #ifndef NON_AVX512_SUPPORT if (((searchAreaWidth & 15) == 0) && (!!(ASM_TYPES & AVX512_MASK))) #else if (((searchAreaWidth & 15) == 0) && (!!(ASM_TYPES & AVX2_MASK))) #endif - { + { #ifndef NON_AVX512_SUPPORT - SadLoopKernel_AVX512_HmeL0_INTRIN( - &contextPtr->sixteenthLcuBuffer[0], - contextPtr->sixteenthLcuBufferStride, - &sixteenthRefPicPtr->bufferY[searchRegionIndex], - sixteenthRefPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - // results - level0BestSad, - xLevel0SearchCenter, - yLevel0SearchCenter, - // range - sixteenthRefPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); + SadLoopKernel_AVX512_HmeL0_INTRIN( + &contextPtr->sixteenthLcuBuffer[0], + contextPtr->sixteenthLcuBufferStride, + &sixteenthRefPicPtr->bufferY[searchRegionIndex], + sixteenthRefPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + // results + level0BestSad, + xLevel0SearchCenter, + yLevel0SearchCenter, + // range + sixteenthRefPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); #else SadLoopKernel_AVX2_HmeL0_INTRIN( &contextPtr->sixteenthLcuBuffer[0], @@ -2143,89 +2143,89 @@ void EbHevcHmeLevel0( ); #endif } - else - { - // Put the first search location into level0 results - NxMSadLoopKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - &contextPtr->sixteenthLcuBuffer[0], - contextPtr->sixteenthLcuBufferStride, - &sixteenthRefPicPtr->bufferY[searchRegionIndex], - sixteenthRefPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - /* results */ - level0BestSad, - xLevel0SearchCenter, - yLevel0SearchCenter, - /* range */ - sixteenthRefPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); - } - } - else - { - SadLoopKernel( - &contextPtr->sixteenthLcuBuffer[0], - contextPtr->sixteenthLcuBufferStride, - &sixteenthRefPicPtr->bufferY[searchRegionIndex], - sixteenthRefPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - /* results */ - level0BestSad, - xLevel0SearchCenter, - yLevel0SearchCenter, - /* range */ - sixteenthRefPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); - } - - *level0BestSad *= 2; // Multiply by 2 because considered only ever other line - *xLevel0SearchCenter += xSearchAreaOrigin; - *xLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution - *yLevel0SearchCenter += ySearchAreaOrigin; - *yLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution - - return; + else + { + // Put the first search location into level0 results + NxMSadLoopKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + &contextPtr->sixteenthLcuBuffer[0], + contextPtr->sixteenthLcuBufferStride, + &sixteenthRefPicPtr->bufferY[searchRegionIndex], + sixteenthRefPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + /* results */ + level0BestSad, + xLevel0SearchCenter, + yLevel0SearchCenter, + /* range */ + sixteenthRefPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); + } + } + else + { + SadLoopKernel( + &contextPtr->sixteenthLcuBuffer[0], + contextPtr->sixteenthLcuBufferStride, + &sixteenthRefPicPtr->bufferY[searchRegionIndex], + sixteenthRefPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + /* results */ + level0BestSad, + xLevel0SearchCenter, + yLevel0SearchCenter, + /* range */ + sixteenthRefPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); + } + + *level0BestSad *= 2; // Multiply by 2 because considered only ever other line + *xLevel0SearchCenter += xSearchAreaOrigin; + *xLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution + *yLevel0SearchCenter += ySearchAreaOrigin; + *yLevel0SearchCenter *= 4; // Multiply by 4 because operating on 1/4 resolution + + return; } void EbHevcHmeLevel1( - MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results - EB_S16 originX, // input parameter, LCU position in the horizontal direction - quarter resolution - EB_S16 originY, // input parameter, LCU position in the vertical direction - quarter resolution - EB_U32 lcuWidth, // input parameter, LCU pwidth - quarter resolution - EB_U32 lcuHeight, // input parameter, LCU height - quarter resolution - EbPictureBufferDesc_t *quarterRefPicPtr, // input parameter, quarter reference Picture Ptr - EB_S16 hmeLevel1SearchAreaInWidth, // input parameter, hme level 1 search area in width - EB_S16 hmeLevel1SearchAreaInHeight, // input parameter, hme level 1 search area in height - EB_S16 xLevel0SearchCenter, // input parameter, best Level0 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 yLevel0SearchCenter, // input parameter, best Level0 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_U64 *level1BestSad, // output parameter, Level1 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *xLevel1SearchCenter, // output parameter, Level1 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *yLevel1SearchCenter) // output parameter, Level1 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results + EB_S16 originX, // input parameter, LCU position in the horizontal direction - quarter resolution + EB_S16 originY, // input parameter, LCU position in the vertical direction - quarter resolution + EB_U32 lcuWidth, // input parameter, LCU pwidth - quarter resolution + EB_U32 lcuHeight, // input parameter, LCU height - quarter resolution + EbPictureBufferDesc_t *quarterRefPicPtr, // input parameter, quarter reference Picture Ptr + EB_S16 hmeLevel1SearchAreaInWidth, // input parameter, hme level 1 search area in width + EB_S16 hmeLevel1SearchAreaInHeight, // input parameter, hme level 1 search area in height + EB_S16 xLevel0SearchCenter, // input parameter, best Level0 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 yLevel0SearchCenter, // input parameter, best Level0 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_U64 *level1BestSad, // output parameter, Level1 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *xLevel1SearchCenter, // output parameter, Level1 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *yLevel1SearchCenter) // output parameter, Level1 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) { - EB_S16 xTopLeftSearchRegion; - EB_S16 yTopLeftSearchRegion; - EB_U32 searchRegionIndex; - // round the search region width to nearest multiple of 8 if it is less than 8 or non multiple of 8 - // SAD calculation performance is the same for searchregion width from 1 to 8 - EB_S16 searchAreaWidth = (hmeLevel1SearchAreaInWidth < 8) ? 8 : (hmeLevel1SearchAreaInWidth & 7) ? hmeLevel1SearchAreaInWidth + (hmeLevel1SearchAreaInWidth - ((hmeLevel1SearchAreaInWidth >> 3) << 3)) : hmeLevel1SearchAreaInWidth; - EB_S16 searchAreaHeight = hmeLevel1SearchAreaInHeight; + EB_S16 xTopLeftSearchRegion; + EB_S16 yTopLeftSearchRegion; + EB_U32 searchRegionIndex; + // round the search region width to nearest multiple of 8 if it is less than 8 or non multiple of 8 + // SAD calculation performance is the same for searchregion width from 1 to 8 + EB_S16 searchAreaWidth = (hmeLevel1SearchAreaInWidth < 8) ? 8 : (hmeLevel1SearchAreaInWidth & 7) ? hmeLevel1SearchAreaInWidth + (hmeLevel1SearchAreaInWidth - ((hmeLevel1SearchAreaInWidth >> 3) << 3)) : hmeLevel1SearchAreaInWidth; + EB_S16 searchAreaHeight = hmeLevel1SearchAreaInHeight; - EB_S16 xSearchAreaOrigin; - EB_S16 ySearchAreaOrigin; + EB_S16 xSearchAreaOrigin; + EB_S16 ySearchAreaOrigin; - EB_S16 padWidth = (EB_S16)(quarterRefPicPtr->originX) - 1; - EB_S16 padHeight = (EB_S16)(quarterRefPicPtr->originY) - 1; + EB_S16 padWidth = (EB_S16)(quarterRefPicPtr->originX) - 1; + EB_S16 padHeight = (EB_S16)(quarterRefPicPtr->originY) - 1; - xSearchAreaOrigin = -(searchAreaWidth >> 1) + xLevel0SearchCenter; - ySearchAreaOrigin = -(searchAreaHeight >> 1) + yLevel0SearchCenter; + xSearchAreaOrigin = -(searchAreaWidth >> 1) + xLevel0SearchCenter; + ySearchAreaOrigin = -(searchAreaHeight >> 1) + yLevel0SearchCenter; - // Correct the left edge of the Search Area if it is not on the reference Picture + // Correct the left edge of the Search Area if it is not on the reference Picture xSearchAreaOrigin = ((originX + xSearchAreaOrigin) < -padWidth) ? -padWidth - originX : xSearchAreaOrigin; @@ -2233,365 +2233,365 @@ void EbHevcHmeLevel1( searchAreaWidth = ((originX + xSearchAreaOrigin) < -padWidth) ? searchAreaWidth - (-padWidth - (originX + xSearchAreaOrigin)) : searchAreaWidth; - // Correct the right edge of the Search Area if its not on the reference Picture - xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)quarterRefPicPtr->width - 1) ? - xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)quarterRefPicPtr->width - 1)) : - xSearchAreaOrigin; - - searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)quarterRefPicPtr->width) ? - MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)quarterRefPicPtr->width)) : - searchAreaWidth; - - // Correct the top edge of the Search Area if it is not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? - -padHeight - originY : - ySearchAreaOrigin; - - searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? - searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : - searchAreaHeight; - - // Correct the bottom edge of the Search Area if its not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)quarterRefPicPtr->height - 1) ? - ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)quarterRefPicPtr->height - 1)) : - ySearchAreaOrigin; - - searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)quarterRefPicPtr->height) ? - MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)quarterRefPicPtr->height)) : - searchAreaHeight; - - // Move to the top left of the search region - xTopLeftSearchRegion = ((EB_S16)quarterRefPicPtr->originX + originX) + xSearchAreaOrigin; - yTopLeftSearchRegion = ((EB_S16)quarterRefPicPtr->originY + originY) + ySearchAreaOrigin; - searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * quarterRefPicPtr->strideY; - - if (((lcuWidth & 7) == 0) || (lcuWidth == 4)) - { - // Put the first search location into level0 results - NxMSadLoopKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - &contextPtr->quarterLcuBuffer[0], - contextPtr->quarterLcuBufferStride * 2, - &quarterRefPicPtr->bufferY[searchRegionIndex], - quarterRefPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - /* results */ - level1BestSad, - xLevel1SearchCenter, - yLevel1SearchCenter, - /* range */ - quarterRefPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); - } - else - { - SadLoopKernel( - &contextPtr->quarterLcuBuffer[0], - contextPtr->quarterLcuBufferStride * 2, - &quarterRefPicPtr->bufferY[searchRegionIndex], - quarterRefPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - /* results */ - level1BestSad, - xLevel1SearchCenter, - yLevel1SearchCenter, - /* range */ - quarterRefPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); - } - - *level1BestSad *= 2; // Multiply by 2 because considered only ever other line - *xLevel1SearchCenter += xSearchAreaOrigin; - *xLevel1SearchCenter *= 2; // Multiply by 2 because operating on 1/2 resolution - *yLevel1SearchCenter += ySearchAreaOrigin; - *yLevel1SearchCenter *= 2; // Multiply by 2 because operating on 1/2 resolution - - return; + // Correct the right edge of the Search Area if its not on the reference Picture + xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)quarterRefPicPtr->width - 1) ? + xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)quarterRefPicPtr->width - 1)) : + xSearchAreaOrigin; + + searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)quarterRefPicPtr->width) ? + MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)quarterRefPicPtr->width)) : + searchAreaWidth; + + // Correct the top edge of the Search Area if it is not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? + -padHeight - originY : + ySearchAreaOrigin; + + searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? + searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : + searchAreaHeight; + + // Correct the bottom edge of the Search Area if its not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)quarterRefPicPtr->height - 1) ? + ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)quarterRefPicPtr->height - 1)) : + ySearchAreaOrigin; + + searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)quarterRefPicPtr->height) ? + MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)quarterRefPicPtr->height)) : + searchAreaHeight; + + // Move to the top left of the search region + xTopLeftSearchRegion = ((EB_S16)quarterRefPicPtr->originX + originX) + xSearchAreaOrigin; + yTopLeftSearchRegion = ((EB_S16)quarterRefPicPtr->originY + originY) + ySearchAreaOrigin; + searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * quarterRefPicPtr->strideY; + + if (((lcuWidth & 7) == 0) || (lcuWidth == 4)) + { + // Put the first search location into level0 results + NxMSadLoopKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + &contextPtr->quarterLcuBuffer[0], + contextPtr->quarterLcuBufferStride * 2, + &quarterRefPicPtr->bufferY[searchRegionIndex], + quarterRefPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + /* results */ + level1BestSad, + xLevel1SearchCenter, + yLevel1SearchCenter, + /* range */ + quarterRefPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); + } + else + { + SadLoopKernel( + &contextPtr->quarterLcuBuffer[0], + contextPtr->quarterLcuBufferStride * 2, + &quarterRefPicPtr->bufferY[searchRegionIndex], + quarterRefPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + /* results */ + level1BestSad, + xLevel1SearchCenter, + yLevel1SearchCenter, + /* range */ + quarterRefPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); + } + + *level1BestSad *= 2; // Multiply by 2 because considered only ever other line + *xLevel1SearchCenter += xSearchAreaOrigin; + *xLevel1SearchCenter *= 2; // Multiply by 2 because operating on 1/2 resolution + *yLevel1SearchCenter += ySearchAreaOrigin; + *yLevel1SearchCenter *= 2; // Multiply by 2 because operating on 1/2 resolution + + return; } void EbHevcHmeLevel2( - MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results - EB_S16 originX, // input parameter, LCU position in the horizontal direction - EB_S16 originY, // input parameter, LCU position in the vertical direction - EB_U32 lcuWidth, // input parameter, LCU pwidth - full resolution - EB_U32 lcuHeight, // input parameter, LCU height - full resolution - EbPictureBufferDesc_t *refPicPtr, // input parameter, reference Picture Ptr - EB_U32 searchRegionNumberInWidth, // input parameter, search region number in the horizontal direction - EB_U32 searchRegionNumberInHeight, // input parameter, search region number in the vertical direction - EB_S16 xLevel1SearchCenter, // input parameter, best Level1 xMV at(searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 yLevel1SearchCenter, // input parameter, best Level1 yMV at(searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_U64 *level2BestSad, // output parameter, Level2 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *xLevel2SearchCenter, // output parameter, Level2 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) - EB_S16 *yLevel2SearchCenter) // output parameter, Level2 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + MeContext_t *contextPtr, // input/output parameter, ME context Ptr, used to get/update ME results + EB_S16 originX, // input parameter, LCU position in the horizontal direction + EB_S16 originY, // input parameter, LCU position in the vertical direction + EB_U32 lcuWidth, // input parameter, LCU pwidth - full resolution + EB_U32 lcuHeight, // input parameter, LCU height - full resolution + EbPictureBufferDesc_t *refPicPtr, // input parameter, reference Picture Ptr + EB_U32 searchRegionNumberInWidth, // input parameter, search region number in the horizontal direction + EB_U32 searchRegionNumberInHeight, // input parameter, search region number in the vertical direction + EB_S16 xLevel1SearchCenter, // input parameter, best Level1 xMV at(searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 yLevel1SearchCenter, // input parameter, best Level1 yMV at(searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_U64 *level2BestSad, // output parameter, Level2 SAD at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *xLevel2SearchCenter, // output parameter, Level2 xMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) + EB_S16 *yLevel2SearchCenter) // output parameter, Level2 yMV at (searchRegionNumberInWidth, searchRegionNumberInHeight) { - EB_S16 xTopLeftSearchRegion; - EB_S16 yTopLeftSearchRegion; - EB_U32 searchRegionIndex; - - // round the search region width to nearest multiple of 8 if it is less than 8 or non multiple of 8 - // SAD calculation performance is the same for searchregion width from 1 to 8 - EB_S16 hmeLevel2SearchAreaInWidth = (EB_S16)contextPtr->hmeLevel2SearchAreaInWidthArray[searchRegionNumberInWidth]; - EB_S16 searchAreaWidth = (hmeLevel2SearchAreaInWidth < 8) ? 8 : (hmeLevel2SearchAreaInWidth & 7) ? hmeLevel2SearchAreaInWidth + (hmeLevel2SearchAreaInWidth - ((hmeLevel2SearchAreaInWidth >> 3) << 3)) : hmeLevel2SearchAreaInWidth; - EB_S16 searchAreaHeight = (EB_S16)contextPtr->hmeLevel2SearchAreaInHeightArray[searchRegionNumberInHeight]; - - EB_S16 xSearchAreaOrigin; - EB_S16 ySearchAreaOrigin; - - EB_S16 padWidth = (EB_S16)MAX_LCU_SIZE - 1; - EB_S16 padHeight = (EB_S16)MAX_LCU_SIZE - 1; - - xSearchAreaOrigin = -(searchAreaWidth >> 1) + xLevel1SearchCenter; - ySearchAreaOrigin = -(searchAreaHeight >> 1) + yLevel1SearchCenter; - - // Correct the left edge of the Search Area if it is not on the reference Picture - xSearchAreaOrigin = ((originX + xSearchAreaOrigin) < -padWidth) ? - -padWidth - originX : - xSearchAreaOrigin; - - searchAreaWidth = ((originX + xSearchAreaOrigin) < -padWidth) ? - searchAreaWidth - (-padWidth - (originX + xSearchAreaOrigin)) : - searchAreaWidth; - - // Correct the right edge of the Search Area if its not on the reference Picture - xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)refPicPtr->width - 1) ? - xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)refPicPtr->width - 1)) : - xSearchAreaOrigin; - - searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)refPicPtr->width) ? - MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)refPicPtr->width)) : - searchAreaWidth; - - // Correct the top edge of the Search Area if it is not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? - -padHeight - originY : - ySearchAreaOrigin; - - searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? - searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : - searchAreaHeight; - - // Correct the bottom edge of the Search Area if its not on the reference Picture - ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)refPicPtr->height - 1) ? - ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)refPicPtr->height - 1)) : - ySearchAreaOrigin; - - searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)refPicPtr->height) ? - MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)refPicPtr->height)) : - searchAreaHeight; - - // Move to the top left of the search region - xTopLeftSearchRegion = ((EB_S16)refPicPtr->originX + originX) + xSearchAreaOrigin; - yTopLeftSearchRegion = ((EB_S16)refPicPtr->originY + originY) + ySearchAreaOrigin; - searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * refPicPtr->strideY; - if ((((lcuWidth & 7) == 0) && (lcuWidth != 40) && (lcuWidth != 56))) - { - // Put the first search location into level0 results - NxMSadLoopKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - contextPtr->lcuSrcPtr, - contextPtr->lcuSrcStride * 2, - &refPicPtr->bufferY[searchRegionIndex], - refPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - /* results */ - level2BestSad, - xLevel2SearchCenter, - yLevel2SearchCenter, - /* range */ - refPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); - } - else - { - // Put the first search location into level0 results - SadLoopKernel( - contextPtr->lcuSrcPtr, - contextPtr->lcuSrcStride * 2, - &refPicPtr->bufferY[searchRegionIndex], - refPicPtr->strideY * 2, - lcuHeight >> 1, lcuWidth, - /* results */ - level2BestSad, - xLevel2SearchCenter, - yLevel2SearchCenter, - /* range */ - refPicPtr->strideY, - searchAreaWidth, - searchAreaHeight - ); - - } - - *level2BestSad *= 2; // Multiply by 2 because considered only every other line - *xLevel2SearchCenter += xSearchAreaOrigin; - *yLevel2SearchCenter += ySearchAreaOrigin; - - return; + EB_S16 xTopLeftSearchRegion; + EB_S16 yTopLeftSearchRegion; + EB_U32 searchRegionIndex; + + // round the search region width to nearest multiple of 8 if it is less than 8 or non multiple of 8 + // SAD calculation performance is the same for searchregion width from 1 to 8 + EB_S16 hmeLevel2SearchAreaInWidth = (EB_S16)contextPtr->hmeLevel2SearchAreaInWidthArray[searchRegionNumberInWidth]; + EB_S16 searchAreaWidth = (hmeLevel2SearchAreaInWidth < 8) ? 8 : (hmeLevel2SearchAreaInWidth & 7) ? hmeLevel2SearchAreaInWidth + (hmeLevel2SearchAreaInWidth - ((hmeLevel2SearchAreaInWidth >> 3) << 3)) : hmeLevel2SearchAreaInWidth; + EB_S16 searchAreaHeight = (EB_S16)contextPtr->hmeLevel2SearchAreaInHeightArray[searchRegionNumberInHeight]; + + EB_S16 xSearchAreaOrigin; + EB_S16 ySearchAreaOrigin; + + EB_S16 padWidth = (EB_S16)MAX_LCU_SIZE - 1; + EB_S16 padHeight = (EB_S16)MAX_LCU_SIZE - 1; + + xSearchAreaOrigin = -(searchAreaWidth >> 1) + xLevel1SearchCenter; + ySearchAreaOrigin = -(searchAreaHeight >> 1) + yLevel1SearchCenter; + + // Correct the left edge of the Search Area if it is not on the reference Picture + xSearchAreaOrigin = ((originX + xSearchAreaOrigin) < -padWidth) ? + -padWidth - originX : + xSearchAreaOrigin; + + searchAreaWidth = ((originX + xSearchAreaOrigin) < -padWidth) ? + searchAreaWidth - (-padWidth - (originX + xSearchAreaOrigin)) : + searchAreaWidth; + + // Correct the right edge of the Search Area if its not on the reference Picture + xSearchAreaOrigin = ((originX + xSearchAreaOrigin) > (EB_S16)refPicPtr->width - 1) ? + xSearchAreaOrigin - ((originX + xSearchAreaOrigin) - ((EB_S16)refPicPtr->width - 1)) : + xSearchAreaOrigin; + + searchAreaWidth = ((originX + xSearchAreaOrigin + searchAreaWidth) > (EB_S16)refPicPtr->width) ? + MAX(1, searchAreaWidth - ((originX + xSearchAreaOrigin + searchAreaWidth) - (EB_S16)refPicPtr->width)) : + searchAreaWidth; + + // Correct the top edge of the Search Area if it is not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) < -padHeight) ? + -padHeight - originY : + ySearchAreaOrigin; + + searchAreaHeight = ((originY + ySearchAreaOrigin) < -padHeight) ? + searchAreaHeight - (-padHeight - (originY + ySearchAreaOrigin)) : + searchAreaHeight; + + // Correct the bottom edge of the Search Area if its not on the reference Picture + ySearchAreaOrigin = ((originY + ySearchAreaOrigin) > (EB_S16)refPicPtr->height - 1) ? + ySearchAreaOrigin - ((originY + ySearchAreaOrigin) - ((EB_S16)refPicPtr->height - 1)) : + ySearchAreaOrigin; + + searchAreaHeight = (originY + ySearchAreaOrigin + searchAreaHeight > (EB_S16)refPicPtr->height) ? + MAX(1, searchAreaHeight - ((originY + ySearchAreaOrigin + searchAreaHeight) - (EB_S16)refPicPtr->height)) : + searchAreaHeight; + + // Move to the top left of the search region + xTopLeftSearchRegion = ((EB_S16)refPicPtr->originX + originX) + xSearchAreaOrigin; + yTopLeftSearchRegion = ((EB_S16)refPicPtr->originY + originY) + ySearchAreaOrigin; + searchRegionIndex = xTopLeftSearchRegion + yTopLeftSearchRegion * refPicPtr->strideY; + if ((((lcuWidth & 7) == 0) && (lcuWidth != 40) && (lcuWidth != 56))) + { + // Put the first search location into level0 results + NxMSadLoopKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + contextPtr->lcuSrcPtr, + contextPtr->lcuSrcStride * 2, + &refPicPtr->bufferY[searchRegionIndex], + refPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + /* results */ + level2BestSad, + xLevel2SearchCenter, + yLevel2SearchCenter, + /* range */ + refPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); + } + else + { + // Put the first search location into level0 results + SadLoopKernel( + contextPtr->lcuSrcPtr, + contextPtr->lcuSrcStride * 2, + &refPicPtr->bufferY[searchRegionIndex], + refPicPtr->strideY * 2, + lcuHeight >> 1, lcuWidth, + /* results */ + level2BestSad, + xLevel2SearchCenter, + yLevel2SearchCenter, + /* range */ + refPicPtr->strideY, + searchAreaWidth, + searchAreaHeight + ); + + } + + *level2BestSad *= 2; // Multiply by 2 because considered only every other line + *xLevel2SearchCenter += xSearchAreaOrigin; + *yLevel2SearchCenter += ySearchAreaOrigin; + + return; } static void SelectBuffer( - EB_U32 puIndex, //[IN] - EB_U8 fracPosition, //[IN] - EB_U32 puWidth, //[IN] Refrence picture list index - EB_U32 puHeight, //[IN] Refrence picture index in the list - EB_U8 *pos_Full, //[IN] - EB_U8 *pos_b, //[IN] - EB_U8 *pos_h, //[IN] - EB_U8 *pos_j, //[IN] - EB_U32 refHalfStride, //[IN] - EB_U32 refBufferFullStride, - EB_U8 **DstPtr, //[OUT] - EB_U32 *DstPtrStride) //[OUT] + EB_U32 puIndex, //[IN] + EB_U8 fracPosition, //[IN] + EB_U32 puWidth, //[IN] Refrence picture list index + EB_U32 puHeight, //[IN] Refrence picture index in the list + EB_U8 *pos_Full, //[IN] + EB_U8 *pos_b, //[IN] + EB_U8 *pos_h, //[IN] + EB_U8 *pos_j, //[IN] + EB_U32 refHalfStride, //[IN] + EB_U32 refBufferFullStride, + EB_U8 **DstPtr, //[OUT] + EB_U32 *DstPtrStride) //[OUT] { - (void)puWidth; - (void)puHeight; - - EB_U32 puShiftXIndex = puSearchIndexMap[puIndex][0]; - EB_U32 puShiftYIndex = puSearchIndexMap[puIndex][1]; - EB_U32 refStride = refHalfStride; - - //for each one of the 8 positions, we need to determine the 2 buffers to do averaging - EB_U8 *buf1 = pos_Full; - - switch (fracPosition) - { - case 0: // integer - buf1 = pos_Full; - refStride = refBufferFullStride; - break; - case 2: // b - buf1 = pos_b; - break; - case 8: // h - buf1 = pos_h; - break; - case 10: // j - buf1 = pos_j; - break; - default: - break; - } - - buf1 = buf1 + puShiftXIndex + puShiftYIndex * refStride; - - *DstPtr = buf1; - *DstPtrStride = refStride; - - - return; + (void)puWidth; + (void)puHeight; + + EB_U32 puShiftXIndex = puSearchIndexMap[puIndex][0]; + EB_U32 puShiftYIndex = puSearchIndexMap[puIndex][1]; + EB_U32 refStride = refHalfStride; + + //for each one of the 8 positions, we need to determine the 2 buffers to do averaging + EB_U8 *buf1 = pos_Full; + + switch (fracPosition) + { + case 0: // integer + buf1 = pos_Full; + refStride = refBufferFullStride; + break; + case 2: // b + buf1 = pos_b; + break; + case 8: // h + buf1 = pos_h; + break; + case 10: // j + buf1 = pos_j; + break; + default: + break; + } + + buf1 = buf1 + puShiftXIndex + puShiftYIndex * refStride; + + *DstPtr = buf1; + *DstPtrStride = refStride; + + + return; } static void QuarterPelCompensation( - EB_U32 puIndex, //[IN] - EB_U8 fracPosition, //[IN] - EB_U32 puWidth, //[IN] Refrence picture list index - EB_U32 puHeight, //[IN] Refrence picture index in the list - EB_U8 *pos_Full, //[IN] - EB_U8 *pos_b, //[IN] - EB_U8 *pos_h, //[IN] - EB_U8 *pos_j, //[IN] - EB_U32 refHalfStride, //[IN] - EB_U32 refBufferFullStride, - EB_U8 *Dst, //[IN] - EB_U32 DstStride) //[IN] + EB_U32 puIndex, //[IN] + EB_U8 fracPosition, //[IN] + EB_U32 puWidth, //[IN] Refrence picture list index + EB_U32 puHeight, //[IN] Refrence picture index in the list + EB_U8 *pos_Full, //[IN] + EB_U8 *pos_b, //[IN] + EB_U8 *pos_h, //[IN] + EB_U8 *pos_j, //[IN] + EB_U32 refHalfStride, //[IN] + EB_U32 refBufferFullStride, + EB_U8 *Dst, //[IN] + EB_U32 DstStride) //[IN] { - EB_U32 puShiftXIndex = puSearchIndexMap[puIndex][0]; - EB_U32 puShiftYIndex = puSearchIndexMap[puIndex][1]; - EB_U32 refStride1 = refHalfStride; - EB_U32 refStride2 = refHalfStride; - - //for each one of the 8 positions, we need to determine the 2 buffers to do averaging - EB_U8 *buf1 = pos_Full; - EB_U8 *buf2 = pos_Full; - - switch (fracPosition) - { - case 1: // a - buf1 = pos_Full; - buf2 = pos_b; - refStride1 = refBufferFullStride; - break; - - case 3: // c - buf1 = pos_b; - buf2 = pos_Full + 1; - refStride2 = refBufferFullStride; - break; - - case 4: // d - buf1 = pos_Full; - buf2 = pos_h; - refStride1 = refBufferFullStride; - break; - - case 5: // e - buf1 = pos_b; - buf2 = pos_h; - break; - - case 6: // f - buf1 = pos_b; - buf2 = pos_j; - break; - - case 7: // g - buf1 = pos_b; - buf2 = pos_h + 1; - break; - - case 9: // i - buf1 = pos_h; - buf2 = pos_j; - break; - - case 11: // k - buf1 = pos_j; - buf2 = pos_h + 1; - break; - - case 12: // L - buf1 = pos_h; - buf2 = pos_Full + refBufferFullStride; - refStride2 = refBufferFullStride; - break; - - case 13: // m - buf1 = pos_h; - buf2 = pos_b + refHalfStride; - break; - - case 14: // n - buf1 = pos_j; - buf2 = pos_b + refHalfStride; - break; - case 15: // 0 - buf1 = pos_h + 1; - buf2 = pos_b + refHalfStride; - break; - default: - break; - } - - - - buf1 = buf1 + puShiftXIndex + puShiftYIndex * refStride1; - buf2 = buf2 + puShiftXIndex + puShiftYIndex * refStride2; - - PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)](buf1, refStride1, buf2, refStride2, Dst, DstStride, puWidth, puHeight); - - return; + EB_U32 puShiftXIndex = puSearchIndexMap[puIndex][0]; + EB_U32 puShiftYIndex = puSearchIndexMap[puIndex][1]; + EB_U32 refStride1 = refHalfStride; + EB_U32 refStride2 = refHalfStride; + + //for each one of the 8 positions, we need to determine the 2 buffers to do averaging + EB_U8 *buf1 = pos_Full; + EB_U8 *buf2 = pos_Full; + + switch (fracPosition) + { + case 1: // a + buf1 = pos_Full; + buf2 = pos_b; + refStride1 = refBufferFullStride; + break; + + case 3: // c + buf1 = pos_b; + buf2 = pos_Full + 1; + refStride2 = refBufferFullStride; + break; + + case 4: // d + buf1 = pos_Full; + buf2 = pos_h; + refStride1 = refBufferFullStride; + break; + + case 5: // e + buf1 = pos_b; + buf2 = pos_h; + break; + + case 6: // f + buf1 = pos_b; + buf2 = pos_j; + break; + + case 7: // g + buf1 = pos_b; + buf2 = pos_h + 1; + break; + + case 9: // i + buf1 = pos_h; + buf2 = pos_j; + break; + + case 11: // k + buf1 = pos_j; + buf2 = pos_h + 1; + break; + + case 12: // L + buf1 = pos_h; + buf2 = pos_Full + refBufferFullStride; + refStride2 = refBufferFullStride; + break; + + case 13: // m + buf1 = pos_h; + buf2 = pos_b + refHalfStride; + break; + + case 14: // n + buf1 = pos_j; + buf2 = pos_b + refHalfStride; + break; + case 15: // 0 + buf1 = pos_h + 1; + buf2 = pos_b + refHalfStride; + break; + default: + break; + } + + + + buf1 = buf1 + puShiftXIndex + puShiftYIndex * refStride1; + buf2 = buf2 + puShiftXIndex + puShiftYIndex * refStride2; + + PictureAverageArray[!!(ASM_TYPES & PREAVX2_MASK)](buf1, refStride1, buf2, refStride2, Dst, DstStride, puWidth, puHeight); + + return; } /******************************************************************************* @@ -2607,110 +2607,110 @@ static void QuarterPelCompensation( *******************************************************************************/ EB_U32 EbHevcBiPredAverging( MeContext_t *contextPtr, - MePredUnit_t *meCandidate, - EB_U32 puIndex, - EB_U8 *sourcePic, - EB_U32 lumaStride, - EB_U8 firstFracPos, - EB_U8 secondFracPos, - EB_U32 puWidth, - EB_U32 puHeight, - EB_U8 *firstRefInteger, - EB_U8 *firstRefPosB, - EB_U8 *firstRefPosH, - EB_U8 *firstRefPosJ, - EB_U8 *secondRefInteger, - EB_U8 *secondRefPosB, - EB_U8 *secondRefPosH, - EB_U8 *secondRefPosJ, - EB_U32 refBufferStride, - EB_U32 refBufferFullList0Stride, - EB_U32 refBufferFullList1Stride, - EB_U8 *firstRefTempDst, - EB_U8 *secondRefTempDst) + MePredUnit_t *meCandidate, + EB_U32 puIndex, + EB_U8 *sourcePic, + EB_U32 lumaStride, + EB_U8 firstFracPos, + EB_U8 secondFracPos, + EB_U32 puWidth, + EB_U32 puHeight, + EB_U8 *firstRefInteger, + EB_U8 *firstRefPosB, + EB_U8 *firstRefPosH, + EB_U8 *firstRefPosJ, + EB_U8 *secondRefInteger, + EB_U8 *secondRefPosB, + EB_U8 *secondRefPosH, + EB_U8 *secondRefPosJ, + EB_U32 refBufferStride, + EB_U32 refBufferFullList0Stride, + EB_U32 refBufferFullList1Stride, + EB_U8 *firstRefTempDst, + EB_U8 *secondRefTempDst) { - EB_U8 *ptrList0, *ptrList1; - EB_U32 ptrList0Stride, ptrList1Stride; - - // Buffer Selection and quater-pel compensation on the fly - if (subPositionType[firstFracPos] != 2){ - - SelectBuffer( - puIndex, - firstFracPos, - puWidth, - puHeight, - firstRefInteger, - firstRefPosB, - firstRefPosH, - firstRefPosJ, - refBufferStride, - refBufferFullList0Stride, - &ptrList0, - &ptrList0Stride); - - } - else{ - - QuarterPelCompensation( - puIndex, - firstFracPos, - puWidth, - puHeight, - firstRefInteger, - firstRefPosB, - firstRefPosH, - firstRefPosJ, - refBufferStride, - refBufferFullList0Stride, - firstRefTempDst, - MAX_LCU_SIZE); - - ptrList0 = firstRefTempDst; - ptrList0Stride = MAX_LCU_SIZE; - } - - if (subPositionType[secondFracPos] != 2){ - - SelectBuffer( - puIndex, - secondFracPos, - puWidth, - puHeight, - secondRefInteger, - secondRefPosB, - secondRefPosH, - secondRefPosJ, - refBufferStride, - refBufferFullList1Stride, - &ptrList1, - &ptrList1Stride); - - } - else{ - //uni-prediction List1 luma - //doing the luma interpolation - QuarterPelCompensation( - puIndex, - secondFracPos, - puWidth, - puHeight, - secondRefInteger, - secondRefPosB, - secondRefPosH, - secondRefPosJ, - refBufferStride, - refBufferFullList1Stride, - secondRefTempDst, - MAX_LCU_SIZE); - - ptrList1 = secondRefTempDst; - ptrList1Stride = MAX_LCU_SIZE; - - } - - // bi-pred luma + EB_U8 *ptrList0, *ptrList1; + EB_U32 ptrList0Stride, ptrList1Stride; + + // Buffer Selection and quater-pel compensation on the fly + if (subPositionType[firstFracPos] != 2){ + + SelectBuffer( + puIndex, + firstFracPos, + puWidth, + puHeight, + firstRefInteger, + firstRefPosB, + firstRefPosH, + firstRefPosJ, + refBufferStride, + refBufferFullList0Stride, + &ptrList0, + &ptrList0Stride); + + } + else{ + + QuarterPelCompensation( + puIndex, + firstFracPos, + puWidth, + puHeight, + firstRefInteger, + firstRefPosB, + firstRefPosH, + firstRefPosJ, + refBufferStride, + refBufferFullList0Stride, + firstRefTempDst, + MAX_LCU_SIZE); + + ptrList0 = firstRefTempDst; + ptrList0Stride = MAX_LCU_SIZE; + } + + if (subPositionType[secondFracPos] != 2){ + + SelectBuffer( + puIndex, + secondFracPos, + puWidth, + puHeight, + secondRefInteger, + secondRefPosB, + secondRefPosH, + secondRefPosJ, + refBufferStride, + refBufferFullList1Stride, + &ptrList1, + &ptrList1Stride); + + } + else{ + //uni-prediction List1 luma + //doing the luma interpolation + QuarterPelCompensation( + puIndex, + secondFracPos, + puWidth, + puHeight, + secondRefInteger, + secondRefPosB, + secondRefPosH, + secondRefPosJ, + refBufferStride, + refBufferFullList1Stride, + secondRefTempDst, + MAX_LCU_SIZE); + + ptrList1 = secondRefTempDst; + ptrList1Stride = MAX_LCU_SIZE; + + } + + // bi-pred luma meCandidate->distortion = (contextPtr->fractionalSearchMethod == SUB_SAD_SEARCH) ? NxMSadAveragingKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][puWidth >> 3](sourcePic, lumaStride << 1, @@ -2721,15 +2721,15 @@ EB_U32 EbHevcBiPredAverging( puHeight >> 1, puWidth) << 1 : NxMSadAveragingKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][puWidth >> 3](sourcePic, - lumaStride, - ptrList0, - ptrList0Stride, - ptrList1, - ptrList1Stride, - puHeight, - puWidth); - - return meCandidate->distortion; + lumaStride, + ptrList0, + ptrList0Stride, + ptrList1, + ptrList1Stride, + puHeight, + puWidth); + + return meCandidate->distortion; } @@ -2740,126 +2740,126 @@ EB_U32 EbHevcBiPredAverging( * average *******************************************/ EB_ERRORTYPE EbHevcBiPredictionCompensation( - MeContext_t *contextPtr, - EB_U32 puIndex, - MePredUnit_t *meCandidate, - EB_U32 firstList, - EB_U32 firstRefMv, - EB_U32 secondList, - EB_U32 secondRefMv) + MeContext_t *contextPtr, + EB_U32 puIndex, + MePredUnit_t *meCandidate, + EB_U32 firstList, + EB_U32 firstRefMv, + EB_U32 secondList, + EB_U32 secondRefMv) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_S16 firstRefPosX; - EB_S16 firstRefPosY; - EB_S16 firstRefIntegPosx; - EB_S16 firstRefIntegPosy; - EB_U8 firstRefFracPosx; - EB_U8 firstRefFracPosy; - EB_U8 firstRefFracPos; - EB_S32 xfirstSearchIndex; - EB_S32 yfirstSearchIndex; - EB_S32 firstSearchRegionIndexPosInteg; - EB_S32 firstSearchRegionIndexPosb; - EB_S32 firstSearchRegionIndexPosh; - EB_S32 firstSearchRegionIndexPosj; - - EB_S16 secondRefPosX; - EB_S16 secondRefPosY; - EB_S16 secondRefIntegPosx; - EB_S16 secondRefIntegPosy; - EB_U8 secondRefFracPosx; - EB_U8 secondRefFracPosy; - EB_U8 secondRefFracPos; - EB_S32 xsecondSearchIndex; - EB_S32 ysecondSearchIndex; - EB_S32 secondSearchRegionIndexPosInteg; - EB_S32 secondSearchRegionIndexPosb; - EB_S32 secondSearchRegionIndexPosh; - EB_S32 secondSearchRegionIndexPosj; - - - EB_U32 puShiftXIndex = puSearchIndexMap[puIndex][0]; - EB_U32 puShiftYIndex = puSearchIndexMap[puIndex][1]; - - const EB_U32 puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; - - meCandidate->predictionDirection = BI_PRED; - - - // First refrence - // Set Candidate information - - firstRefPosX = _MVXT(firstRefMv), - firstRefPosY = _MVYT(firstRefMv), - meCandidate->Mv[0] = firstRefMv; - - firstRefIntegPosx = (firstRefPosX >> 2); - firstRefIntegPosy = (firstRefPosY >> 2); - firstRefFracPosx = (EB_U8)firstRefPosX & 0x03; - firstRefFracPosy = (EB_U8)firstRefPosY & 0x03; - - firstRefFracPos = (EB_U8)(firstRefFracPosx + (firstRefFracPosy << 2)); - - xfirstSearchIndex = (EB_S32)firstRefIntegPosx - contextPtr->xSearchAreaOrigin[firstList][0]; - yfirstSearchIndex = (EB_S32)firstRefIntegPosy - contextPtr->ySearchAreaOrigin[firstList][0]; - - firstSearchRegionIndexPosInteg = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1)) + (EB_S32)contextPtr->interpolatedFullStride[firstList][0] * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1)); - firstSearchRegionIndexPosb = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1)); - firstSearchRegionIndexPosh = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1); - firstSearchRegionIndexPosj = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1); - - // Second refrence - - // Set Candidate information - secondRefPosX = _MVXT(secondRefMv), - secondRefPosY = _MVYT(secondRefMv), - meCandidate->Mv[1] = secondRefMv; - - secondRefIntegPosx = (secondRefPosX >> 2); - secondRefIntegPosy = (secondRefPosY >> 2); - secondRefFracPosx = (EB_U8)secondRefPosX & 0x03; - secondRefFracPosy = (EB_U8)secondRefPosY & 0x03; - - secondRefFracPos = (EB_U8)(secondRefFracPosx + (secondRefFracPosy << 2)); - - xsecondSearchIndex = secondRefIntegPosx - contextPtr->xSearchAreaOrigin[secondList][0]; - ysecondSearchIndex = secondRefIntegPosy - contextPtr->ySearchAreaOrigin[secondList][0]; - - secondSearchRegionIndexPosInteg = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1)) + (EB_S32)contextPtr->interpolatedFullStride[secondList][0] * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1)); - secondSearchRegionIndexPosb = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1)); - secondSearchRegionIndexPosh = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1) - 1); - secondSearchRegionIndexPosj = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1) - 1); - - EB_U32 nIndex = puIndex > 20 ? tab8x8[puIndex-21] + 21 : - puIndex > 4 ? tab32x32[puIndex-5] + 5 : puIndex; - contextPtr->pLcuBipredSad[nIndex] = - - EbHevcBiPredAverging( + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_S16 firstRefPosX; + EB_S16 firstRefPosY; + EB_S16 firstRefIntegPosx; + EB_S16 firstRefIntegPosy; + EB_U8 firstRefFracPosx; + EB_U8 firstRefFracPosy; + EB_U8 firstRefFracPos; + EB_S32 xfirstSearchIndex; + EB_S32 yfirstSearchIndex; + EB_S32 firstSearchRegionIndexPosInteg; + EB_S32 firstSearchRegionIndexPosb; + EB_S32 firstSearchRegionIndexPosh; + EB_S32 firstSearchRegionIndexPosj; + + EB_S16 secondRefPosX; + EB_S16 secondRefPosY; + EB_S16 secondRefIntegPosx; + EB_S16 secondRefIntegPosy; + EB_U8 secondRefFracPosx; + EB_U8 secondRefFracPosy; + EB_U8 secondRefFracPos; + EB_S32 xsecondSearchIndex; + EB_S32 ysecondSearchIndex; + EB_S32 secondSearchRegionIndexPosInteg; + EB_S32 secondSearchRegionIndexPosb; + EB_S32 secondSearchRegionIndexPosh; + EB_S32 secondSearchRegionIndexPosj; + + + EB_U32 puShiftXIndex = puSearchIndexMap[puIndex][0]; + EB_U32 puShiftYIndex = puSearchIndexMap[puIndex][1]; + + const EB_U32 puLcuBufferIndex = puShiftXIndex + puShiftYIndex * contextPtr->lcuSrcStride; + + meCandidate->predictionDirection = BI_PRED; + + + // First refrence + // Set Candidate information + + firstRefPosX = _MVXT(firstRefMv), + firstRefPosY = _MVYT(firstRefMv), + meCandidate->Mv[0] = firstRefMv; + + firstRefIntegPosx = (firstRefPosX >> 2); + firstRefIntegPosy = (firstRefPosY >> 2); + firstRefFracPosx = (EB_U8)firstRefPosX & 0x03; + firstRefFracPosy = (EB_U8)firstRefPosY & 0x03; + + firstRefFracPos = (EB_U8)(firstRefFracPosx + (firstRefFracPosy << 2)); + + xfirstSearchIndex = (EB_S32)firstRefIntegPosx - contextPtr->xSearchAreaOrigin[firstList][0]; + yfirstSearchIndex = (EB_S32)firstRefIntegPosy - contextPtr->ySearchAreaOrigin[firstList][0]; + + firstSearchRegionIndexPosInteg = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1)) + (EB_S32)contextPtr->interpolatedFullStride[firstList][0] * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1)); + firstSearchRegionIndexPosb = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1)); + firstSearchRegionIndexPosh = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1); + firstSearchRegionIndexPosj = (EB_S32)(xfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(yfirstSearchIndex + (ME_FILTER_TAP >> 1) - 1); + + // Second refrence + + // Set Candidate information + secondRefPosX = _MVXT(secondRefMv), + secondRefPosY = _MVYT(secondRefMv), + meCandidate->Mv[1] = secondRefMv; + + secondRefIntegPosx = (secondRefPosX >> 2); + secondRefIntegPosy = (secondRefPosY >> 2); + secondRefFracPosx = (EB_U8)secondRefPosX & 0x03; + secondRefFracPosy = (EB_U8)secondRefPosY & 0x03; + + secondRefFracPos = (EB_U8)(secondRefFracPosx + (secondRefFracPosy << 2)); + + xsecondSearchIndex = secondRefIntegPosx - contextPtr->xSearchAreaOrigin[secondList][0]; + ysecondSearchIndex = secondRefIntegPosy - contextPtr->ySearchAreaOrigin[secondList][0]; + + secondSearchRegionIndexPosInteg = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1)) + (EB_S32)contextPtr->interpolatedFullStride[secondList][0] * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1)); + secondSearchRegionIndexPosb = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1)); + secondSearchRegionIndexPosh = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1) - 1); + secondSearchRegionIndexPosj = (EB_S32)(xsecondSearchIndex + (ME_FILTER_TAP >> 1) - 1) + (EB_S32)contextPtr->interpolatedStride * (EB_S32)(ysecondSearchIndex + (ME_FILTER_TAP >> 1) - 1); + + EB_U32 nIndex = puIndex > 20 ? tab8x8[puIndex-21] + 21 : + puIndex > 4 ? tab32x32[puIndex-5] + 5 : puIndex; + contextPtr->pLcuBipredSad[nIndex] = + + EbHevcBiPredAverging( contextPtr, - meCandidate, - puIndex, - &(contextPtr->lcuSrcPtr[puLcuBufferIndex]), - contextPtr->lcuSrcStride, - firstRefFracPos, - secondRefFracPos, - partitionWidth[puIndex], - partitionHeight[puIndex], - &(contextPtr->integerBufferPtr[firstList][0][firstSearchRegionIndexPosInteg]), - &(contextPtr->posbBuffer[firstList][0][firstSearchRegionIndexPosb]), - &(contextPtr->poshBuffer[firstList][0][firstSearchRegionIndexPosh]), - &(contextPtr->posjBuffer[firstList][0][firstSearchRegionIndexPosj]), - &(contextPtr->integerBufferPtr[secondList][0][secondSearchRegionIndexPosInteg]), - &(contextPtr->posbBuffer[secondList][0][secondSearchRegionIndexPosb]), - &(contextPtr->poshBuffer[secondList][0][secondSearchRegionIndexPosh]), - &(contextPtr->posjBuffer[secondList][0][secondSearchRegionIndexPosj]), - contextPtr->interpolatedStride, - contextPtr->interpolatedFullStride[firstList][0], - contextPtr->interpolatedFullStride[secondList][0], - &(contextPtr->oneDIntermediateResultsBuf0[0]), - &(contextPtr->oneDIntermediateResultsBuf1[0])); - - return return_error; + meCandidate, + puIndex, + &(contextPtr->lcuSrcPtr[puLcuBufferIndex]), + contextPtr->lcuSrcStride, + firstRefFracPos, + secondRefFracPos, + partitionWidth[puIndex], + partitionHeight[puIndex], + &(contextPtr->integerBufferPtr[firstList][0][firstSearchRegionIndexPosInteg]), + &(contextPtr->posbBuffer[firstList][0][firstSearchRegionIndexPosb]), + &(contextPtr->poshBuffer[firstList][0][firstSearchRegionIndexPosh]), + &(contextPtr->posjBuffer[firstList][0][firstSearchRegionIndexPosj]), + &(contextPtr->integerBufferPtr[secondList][0][secondSearchRegionIndexPosInteg]), + &(contextPtr->posbBuffer[secondList][0][secondSearchRegionIndexPosb]), + &(contextPtr->poshBuffer[secondList][0][secondSearchRegionIndexPosh]), + &(contextPtr->posjBuffer[secondList][0][secondSearchRegionIndexPosj]), + contextPtr->interpolatedStride, + contextPtr->interpolatedFullStride[firstList][0], + contextPtr->interpolatedFullStride[secondList][0], + &(contextPtr->oneDIntermediateResultsBuf0[0]), + &(contextPtr->oneDIntermediateResultsBuf1[0])); + + return return_error; } /******************************************* @@ -2868,111 +2868,111 @@ EB_ERRORTYPE EbHevcBiPredictionCompensation( *******************************************/ // This function enables all 16 Bipred candidates when MRP is ON EB_ERRORTYPE EbHevcBiPredictionSearch( - MeContext_t *contextPtr, - EB_U32 puIndex, - EB_U8 candidateIndex, - EB_U32 activeRefPicFirstLisNum, - EB_U32 activeRefPicSecondLisNum, - EB_U8 *totalMeCandidateIndex, - PictureParentControlSet_t *pictureControlSetPtr) + MeContext_t *contextPtr, + EB_U32 puIndex, + EB_U8 candidateIndex, + EB_U32 activeRefPicFirstLisNum, + EB_U32 activeRefPicSecondLisNum, + EB_U8 *totalMeCandidateIndex, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 firstListRefPictdx; - EB_U32 secondListRefPictdx; + EB_U32 firstListRefPictdx; + EB_U32 secondListRefPictdx; (void)pictureControlSetPtr; - EB_U32 nIndex = puIndex > 20 ? tab8x8[puIndex-21] + 21 : - puIndex > 4 ? tab32x32[puIndex-5] + 5 : puIndex; - for (firstListRefPictdx = 0; firstListRefPictdx < activeRefPicFirstLisNum; firstListRefPictdx++) { - for (secondListRefPictdx = 0; secondListRefPictdx < activeRefPicSecondLisNum; secondListRefPictdx++) { + EB_U32 nIndex = puIndex > 20 ? tab8x8[puIndex-21] + 21 : + puIndex > 4 ? tab32x32[puIndex-5] + 5 : puIndex; + for (firstListRefPictdx = 0; firstListRefPictdx < activeRefPicFirstLisNum; firstListRefPictdx++) { + for (secondListRefPictdx = 0; secondListRefPictdx < activeRefPicSecondLisNum; secondListRefPictdx++) { - { + { - EbHevcBiPredictionCompensation( - contextPtr, - puIndex, - &(contextPtr->meCandidate[candidateIndex].pu[puIndex]), - REFERENCE_PIC_LIST_0, - contextPtr->pLcuBestMV[REFERENCE_PIC_LIST_0][firstListRefPictdx][nIndex], - REFERENCE_PIC_LIST_1, - contextPtr->pLcuBestMV[REFERENCE_PIC_LIST_1][secondListRefPictdx][nIndex]); + EbHevcBiPredictionCompensation( + contextPtr, + puIndex, + &(contextPtr->meCandidate[candidateIndex].pu[puIndex]), + REFERENCE_PIC_LIST_0, + contextPtr->pLcuBestMV[REFERENCE_PIC_LIST_0][firstListRefPictdx][nIndex], + REFERENCE_PIC_LIST_1, + contextPtr->pLcuBestMV[REFERENCE_PIC_LIST_1][secondListRefPictdx][nIndex]); - candidateIndex++; + candidateIndex++; - } - } - } + } + } + } - *totalMeCandidateIndex = candidateIndex; + *totalMeCandidateIndex = candidateIndex; - return return_error; + return return_error; } #define NSET_CAND(mePuResult, num, dist, dir) \ (mePuResult)->distortionDirection[(num)].distortion = (dist); \ - (mePuResult)->distortionDirection[(num)].direction = (dir) ; + (mePuResult)->distortionDirection[(num)].direction = (dir) ; EB_S8 Sort3Elements(EB_U32 a, EB_U32 b, EB_U32 c){ EB_U8 sortCode = 0; - if (a <= b && a <= c){ - if (b <= c) { - sortCode = a_b_c; - }else{ - sortCode = a_c_b; - } - }else if (b <= a && b <= c) { - if (a <= c) { - sortCode = b_a_c; - }else { - sortCode = b_c_a; - } - - }else if (a <= b){ - sortCode = c_a_b; - } else{ - sortCode = c_b_a; - } - - - return sortCode; + if (a <= b && a <= c){ + if (b <= c) { + sortCode = a_b_c; + }else{ + sortCode = a_c_b; + } + }else if (b <= a && b <= c) { + if (a <= c) { + sortCode = b_a_c; + }else { + sortCode = b_c_a; + } + + }else if (a <= b){ + sortCode = c_a_b; + } else{ + sortCode = c_b_a; + } + + + return sortCode; } EB_ERRORTYPE EbHevcCheckZeroZeroCenter( - EbPictureBufferDesc_t *refPicPtr, - MeContext_t *contextPtr, - EB_U32 lcuOriginX, - EB_U32 lcuOriginY, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - EB_S16 *xSearchCenter, - EB_S16 *ySearchCenter) + EbPictureBufferDesc_t *refPicPtr, + MeContext_t *contextPtr, + EB_U32 lcuOriginX, + EB_U32 lcuOriginY, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + EB_S16 *xSearchCenter, + EB_S16 *ySearchCenter) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 searchRegionIndex, zeroMvSad, hmeMvSad, hmeMvdRate; - EB_U64 hmeMvCost, zeroMvCost, searchCenterCost; - EB_S16 originX = (EB_S16)lcuOriginX; - EB_S16 originY = (EB_S16)lcuOriginY; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 searchRegionIndex, zeroMvSad, hmeMvSad, hmeMvdRate; + EB_U64 hmeMvCost, zeroMvCost, searchCenterCost; + EB_S16 originX = (EB_S16)lcuOriginX; + EB_S16 originY = (EB_S16)lcuOriginY; EB_U32 subsampleSad = 1; EB_S16 padWidth = (EB_S16)MAX_LCU_SIZE - 1; EB_S16 padHeight = (EB_S16)MAX_LCU_SIZE - 1; - searchRegionIndex = (EB_S16)refPicPtr->originX + originX + - ((EB_S16)refPicPtr->originY + originY) * refPicPtr->strideY; + searchRegionIndex = (EB_S16)refPicPtr->originX + originX + + ((EB_S16)refPicPtr->originY + originY) * refPicPtr->strideY; - zeroMvSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][lcuWidth >> 3]( - contextPtr->lcuSrcPtr, - contextPtr->lcuSrcStride << subsampleSad, - &(refPicPtr->bufferY[searchRegionIndex]), - refPicPtr->strideY << subsampleSad, - lcuHeight >> subsampleSad, - lcuWidth); + zeroMvSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][lcuWidth >> 3]( + contextPtr->lcuSrcPtr, + contextPtr->lcuSrcStride << subsampleSad, + &(refPicPtr->bufferY[searchRegionIndex]), + refPicPtr->strideY << subsampleSad, + lcuHeight >> subsampleSad, + lcuWidth); zeroMvSad = zeroMvSad << subsampleSad; @@ -3001,368 +3001,368 @@ EB_ERRORTYPE EbHevcCheckZeroZeroCenter( (void)padHeight; } - zeroMvCost = zeroMvSad << COST_PRECISION; - searchRegionIndex = (EB_S16)(refPicPtr->originX + originX) + *xSearchCenter + - ((EB_S16)(refPicPtr->originY + originY) + *ySearchCenter) * refPicPtr->strideY; + zeroMvCost = zeroMvSad << COST_PRECISION; + searchRegionIndex = (EB_S16)(refPicPtr->originX + originX) + *xSearchCenter + + ((EB_S16)(refPicPtr->originY + originY) + *ySearchCenter) * refPicPtr->strideY; - hmeMvSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][lcuWidth >> 3]( - contextPtr->lcuSrcPtr, - contextPtr->lcuSrcStride << subsampleSad, - &(refPicPtr->bufferY[searchRegionIndex]), - refPicPtr->strideY << subsampleSad, - lcuHeight >> subsampleSad, - lcuWidth); + hmeMvSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][lcuWidth >> 3]( + contextPtr->lcuSrcPtr, + contextPtr->lcuSrcStride << subsampleSad, + &(refPicPtr->bufferY[searchRegionIndex]), + refPicPtr->strideY << subsampleSad, + lcuHeight >> subsampleSad, + lcuWidth); hmeMvSad = hmeMvSad << subsampleSad; - hmeMvdRate = 0; - MeEbHevcGetMvdFractionBits( - ABS(*xSearchCenter << 2), - ABS(*ySearchCenter << 2), - contextPtr->mvdBitsArray, - &hmeMvdRate); + hmeMvdRate = 0; + MeEbHevcGetMvdFractionBits( + ABS(*xSearchCenter << 2), + ABS(*ySearchCenter << 2), + contextPtr->mvdBitsArray, + &hmeMvdRate); - hmeMvCost = (hmeMvSad << COST_PRECISION) + (((contextPtr->lambda * hmeMvdRate) + MD_OFFSET) >> MD_SHIFT); - searchCenterCost = MIN(zeroMvCost, hmeMvCost); + hmeMvCost = (hmeMvSad << COST_PRECISION) + (((contextPtr->lambda * hmeMvdRate) + MD_OFFSET) >> MD_SHIFT); + searchCenterCost = MIN(zeroMvCost, hmeMvCost); - *xSearchCenter = (searchCenterCost == zeroMvCost) ? 0 : *xSearchCenter; - *ySearchCenter = (searchCenterCost == zeroMvCost) ? 0 : *ySearchCenter; + *xSearchCenter = (searchCenterCost == zeroMvCost) ? 0 : *xSearchCenter; + *ySearchCenter = (searchCenterCost == zeroMvCost) ? 0 : *ySearchCenter; - return return_error; + return return_error; } EB_ERRORTYPE SuPelEnable( - MeContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 listIndex, - EB_U32 refPicIndex, - EB_BOOL *enableHalfPel32x32, - EB_BOOL *enableHalfPel16x16, - EB_BOOL *enableHalfPel8x8) + MeContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 listIndex, + EB_U32 refPicIndex, + EB_BOOL *enableHalfPel32x32, + EB_BOOL *enableHalfPel16x16, + EB_BOOL *enableHalfPel8x8) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 mvMag32x32 = 0; - EB_U32 mvMag16x16 = 0; - EB_U32 mvMag8x8 = 0; - EB_U32 avgSad32x32 = 0; - EB_U32 avgSad16x16 = 0; - EB_U32 avgSad8x8 = 0; - EB_U32 avgMvx32x32 = 0; - EB_U32 avgMvy32x32 = 0; - EB_U32 avgMvx16x16 = 0; - EB_U32 avgMvy16x16 = 0; - EB_U32 avgMvx8x8 = 0; - EB_U32 avgMvy8x8 = 0; - - - avgMvx32x32 = (_MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_0]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_1]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_2]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_3])) >> 2; - avgMvy32x32 = (_MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_0]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_1]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_2]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_3])) >> 2; - mvMag32x32 = SQR(avgMvx32x32) + SQR(avgMvy32x32); - - avgMvx16x16 = (_MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_0]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_1]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_2]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_3]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_4]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_5]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_6]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_7]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_8]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_9]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_10]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_11]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_12]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_13]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_14]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_15]) - ) >> 4; - avgMvy16x16 = (_MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_0]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_1]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_2]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_3]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_4]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_5]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_6]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_7]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_8]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_9]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_10]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_11]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_12]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_13]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_14]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_15]) - ) >> 4; - mvMag16x16 = SQR(avgMvx16x16) + SQR(avgMvy16x16); - - avgMvx8x8 = (_MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_0]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_1]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_2]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_3]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_4]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_5]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_6]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_7]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_8]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_9]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_10]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_11]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_12]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_13]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_14]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_15]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_16]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_17]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_18]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_19]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_20]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_21]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_22]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_23]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_24]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_25]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_26]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_27]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_28]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_29]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_30]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_31]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_32]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_33]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_34]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_35]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_36]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_37]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_38]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_39]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_40]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_41]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_42]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_43]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_44]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_45]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_46]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_47]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_48]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_49]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_50]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_51]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_52]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_53]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_54]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_55]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_56]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_57]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_58]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_59]) - + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_60]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_61]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_62]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_63]) - ) >> 6; - avgMvy8x8 = (_MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_0]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_1]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_2]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_3]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_4]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_5]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_6]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_7]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_8]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_9]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_10]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_11]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_12]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_13]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_14]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_15]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_16]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_17]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_18]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_19]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_20]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_21]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_22]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_23]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_24]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_25]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_26]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_27]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_28]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_29]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_30]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_31]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_32]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_33]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_34]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_35]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_36]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_37]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_38]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_39]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_40]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_41]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_42]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_43]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_44]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_45]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_46]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_47]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_48]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_49]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_50]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_51]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_52]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_53]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_54]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_55]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_56]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_57]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_58]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_59]) - + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_60]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_61]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_62]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_63]) - ) >> 6; - mvMag8x8 = SQR(avgMvx8x8) + SQR(avgMvy8x8); - - avgSad32x32 = (contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_0] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_1] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_2] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_3]) >> 2; - avgSad16x16 = (contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_0] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_1] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_2] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_3] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_4] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_5] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_6] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_7] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_8] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_9] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_10] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_11] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_12] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_13] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_14] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_15] - ) >> 4; - avgSad8x8 = (contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_0] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_1] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_2] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_3] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_4] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_5] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_6] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_7] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_8] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_9] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_10] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_11] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_12] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_13] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_14] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_15] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_16] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_17] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_18] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_19] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_20] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_21] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_22] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_23] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_24] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_25] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_26] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_27] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_28] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_29] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_30] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_31] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_32] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_33] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_34] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_35] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_36] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_37] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_38] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_39] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_40] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_41] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_42] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_43] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_44] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_45] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_46] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_47] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_48] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_49] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_50] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_51] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_52] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_53] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_54] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_55] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_56] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_57] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_58] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_59] - + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_60] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_61] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_62] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_63] - ) >> 6; - - - if (pictureControlSetPtr->temporalLayerIndex == 0) - { - //32x32 - if ((mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_0 - } - else if ((mvMag32x32 < SQR(48)) && !(avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_FALSE; //CLASS_1 - } - else if (!(mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_2 - } - else - { - *enableHalfPel32x32 = EB_FALSE; //CLASS_3 - } - //16x16 - if ((mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_0 - } - else if ((mvMag16x16 < SQR(48)) && !(avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_3 - } - //8x8 - if ((mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_0 - } - else if ((mvMag8x8 < SQR(48)) && !(avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel8x8 = EB_TRUE; //CLASS_3 - } - - } - - else if (pictureControlSetPtr->temporalLayerIndex == 1) - { - //32x32 - if ((mvMag32x32 < SQR(32)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_0 - } - else if ((mvMag32x32 < SQR(32)) && !(avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_FALSE; //CLASS_1 - } - else if (!(mvMag32x32 < SQR(32)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_2 - } - else - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_3 - } - //16x16 - if ((mvMag16x16 < SQR(32)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_0 - } - else if ((mvMag16x16 < SQR(32)) && !(avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag16x16 < SQR(32)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_3 - } - //8x8 - if ((mvMag8x8 < SQR(32)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_0 - } - else if ((mvMag8x8 < SQR(32)) && !(avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag8x8 < SQR(32)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel8x8 = EB_TRUE; //CLASS_3 - } - - } - else if (pictureControlSetPtr->temporalLayerIndex == 2) - { - //32x32 - if ((mvMag32x32 < SQR(80)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_0 - } - else if ((mvMag32x32 < SQR(80)) && !(avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_FALSE; //CLASS_1 - - } - else if (!(mvMag32x32 < SQR(80)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_2 - } - else - { - *enableHalfPel32x32 = EB_FALSE; //CLASS_3 - } - //16x16 - if ((mvMag16x16 < SQR(80)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_0 - } - else if ((mvMag16x16 < SQR(80)) && !(avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag16x16 < SQR(80)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_3 - } - //8x8 - if ((mvMag8x8 < SQR(80)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_0 - } - else if ((mvMag8x8 < SQR(80)) && !(avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag8x8 < SQR(80)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel8x8 = EB_TRUE; //CLASS_3 - } - - } - else - { - //32x32 - if ((mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_0 - } - else if ((mvMag32x32 < SQR(48)) && !(avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) - { - *enableHalfPel32x32 = EB_TRUE; //CLASS_2 - } - else - { - *enableHalfPel32x32 = EB_FALSE; //CLASS_3 - } - //16x16 - if ((mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_0 - } - else if ((mvMag16x16 < SQR(48)) && !(avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) - { - *enableHalfPel16x16 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel16x16 = EB_TRUE; //CLASS_3 - } - //8x8 - if ((mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_0 - } - else if ((mvMag8x8 < SQR(48)) && !(avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_TRUE; //CLASS_1 - } - else if (!(mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) - { - *enableHalfPel8x8 = EB_FALSE; //CLASS_2 - } - else - { - *enableHalfPel8x8 = EB_FALSE;// EB_TRUE; //CLASS_3 - } - - } - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 mvMag32x32 = 0; + EB_U32 mvMag16x16 = 0; + EB_U32 mvMag8x8 = 0; + EB_U32 avgSad32x32 = 0; + EB_U32 avgSad16x16 = 0; + EB_U32 avgSad8x8 = 0; + EB_U32 avgMvx32x32 = 0; + EB_U32 avgMvy32x32 = 0; + EB_U32 avgMvx16x16 = 0; + EB_U32 avgMvy16x16 = 0; + EB_U32 avgMvx8x8 = 0; + EB_U32 avgMvy8x8 = 0; + + + avgMvx32x32 = (_MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_0]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_1]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_2]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_3])) >> 2; + avgMvy32x32 = (_MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_0]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_1]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_2]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_3])) >> 2; + mvMag32x32 = SQR(avgMvx32x32) + SQR(avgMvy32x32); + + avgMvx16x16 = (_MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_0]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_1]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_2]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_3]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_4]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_5]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_6]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_7]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_8]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_9]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_10]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_11]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_12]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_13]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_14]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_15]) + ) >> 4; + avgMvy16x16 = (_MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_0]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_1]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_2]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_3]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_4]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_5]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_6]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_7]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_8]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_9]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_10]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_11]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_12]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_13]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_14]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_15]) + ) >> 4; + mvMag16x16 = SQR(avgMvx16x16) + SQR(avgMvy16x16); + + avgMvx8x8 = (_MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_0]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_1]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_2]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_3]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_4]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_5]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_6]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_7]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_8]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_9]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_10]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_11]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_12]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_13]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_14]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_15]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_16]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_17]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_18]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_19]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_20]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_21]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_22]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_23]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_24]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_25]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_26]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_27]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_28]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_29]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_30]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_31]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_32]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_33]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_34]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_35]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_36]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_37]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_38]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_39]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_40]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_41]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_42]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_43]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_44]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_45]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_46]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_47]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_48]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_49]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_50]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_51]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_52]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_53]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_54]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_55]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_56]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_57]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_58]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_59]) + + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_60]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_61]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_62]) + _MVXT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_63]) + ) >> 6; + avgMvy8x8 = (_MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_0]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_1]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_2]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_3]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_4]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_5]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_6]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_7]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_8]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_9]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_10]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_11]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_12]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_13]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_14]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_15]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_16]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_17]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_18]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_19]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_20]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_21]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_22]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_23]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_24]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_25]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_26]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_27]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_28]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_29]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_30]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_31]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_32]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_33]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_34]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_35]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_36]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_37]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_38]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_39]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_40]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_41]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_42]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_43]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_44]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_45]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_46]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_47]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_48]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_49]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_50]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_51]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_52]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_53]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_54]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_55]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_56]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_57]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_58]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_59]) + + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_60]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_61]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_62]) + _MVYT(contextPtr->pLcuBestMV[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_63]) + ) >> 6; + mvMag8x8 = SQR(avgMvx8x8) + SQR(avgMvy8x8); + + avgSad32x32 = (contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_0] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_1] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_2] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_32x32_3]) >> 2; + avgSad16x16 = (contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_0] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_1] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_2] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_3] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_4] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_5] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_6] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_7] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_8] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_9] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_10] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_11] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_12] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_13] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_14] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_16x16_15] + ) >> 4; + avgSad8x8 = (contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_0] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_1] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_2] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_3] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_4] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_5] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_6] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_7] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_8] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_9] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_10] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_11] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_12] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_13] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_14] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_15] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_16] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_17] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_18] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_19] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_20] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_21] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_22] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_23] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_24] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_25] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_26] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_27] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_28] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_29] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_30] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_31] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_32] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_33] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_34] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_35] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_36] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_37] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_38] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_39] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_40] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_41] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_42] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_43] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_44] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_45] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_46] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_47] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_48] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_49] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_50] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_51] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_52] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_53] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_54] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_55] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_56] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_57] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_58] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_59] + + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_60] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_61] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_62] + contextPtr->pLcuBestSad[listIndex][refPicIndex][ME_TIER_ZERO_PU_8x8_63] + ) >> 6; + + + if (pictureControlSetPtr->temporalLayerIndex == 0) + { + //32x32 + if ((mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_0 + } + else if ((mvMag32x32 < SQR(48)) && !(avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_FALSE; //CLASS_1 + } + else if (!(mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_2 + } + else + { + *enableHalfPel32x32 = EB_FALSE; //CLASS_3 + } + //16x16 + if ((mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_0 + } + else if ((mvMag16x16 < SQR(48)) && !(avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_3 + } + //8x8 + if ((mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_0 + } + else if ((mvMag8x8 < SQR(48)) && !(avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel8x8 = EB_TRUE; //CLASS_3 + } + + } + + else if (pictureControlSetPtr->temporalLayerIndex == 1) + { + //32x32 + if ((mvMag32x32 < SQR(32)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_0 + } + else if ((mvMag32x32 < SQR(32)) && !(avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_FALSE; //CLASS_1 + } + else if (!(mvMag32x32 < SQR(32)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_2 + } + else + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_3 + } + //16x16 + if ((mvMag16x16 < SQR(32)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_0 + } + else if ((mvMag16x16 < SQR(32)) && !(avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag16x16 < SQR(32)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_3 + } + //8x8 + if ((mvMag8x8 < SQR(32)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_0 + } + else if ((mvMag8x8 < SQR(32)) && !(avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag8x8 < SQR(32)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel8x8 = EB_TRUE; //CLASS_3 + } + + } + else if (pictureControlSetPtr->temporalLayerIndex == 2) + { + //32x32 + if ((mvMag32x32 < SQR(80)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_0 + } + else if ((mvMag32x32 < SQR(80)) && !(avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_FALSE; //CLASS_1 + + } + else if (!(mvMag32x32 < SQR(80)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_2 + } + else + { + *enableHalfPel32x32 = EB_FALSE; //CLASS_3 + } + //16x16 + if ((mvMag16x16 < SQR(80)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_0 + } + else if ((mvMag16x16 < SQR(80)) && !(avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag16x16 < SQR(80)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_3 + } + //8x8 + if ((mvMag8x8 < SQR(80)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_0 + } + else if ((mvMag8x8 < SQR(80)) && !(avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag8x8 < SQR(80)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel8x8 = EB_TRUE; //CLASS_3 + } + + } + else + { + //32x32 + if ((mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_0 + } + else if ((mvMag32x32 < SQR(48)) && !(avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag32x32 < SQR(48)) && (avgSad32x32 < 32 * 32 * 6)) + { + *enableHalfPel32x32 = EB_TRUE; //CLASS_2 + } + else + { + *enableHalfPel32x32 = EB_FALSE; //CLASS_3 + } + //16x16 + if ((mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_0 + } + else if ((mvMag16x16 < SQR(48)) && !(avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag16x16 < SQR(48)) && (avgSad16x16 < 16 * 16 * 2)) + { + *enableHalfPel16x16 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel16x16 = EB_TRUE; //CLASS_3 + } + //8x8 + if ((mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_0 + } + else if ((mvMag8x8 < SQR(48)) && !(avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_TRUE; //CLASS_1 + } + else if (!(mvMag8x8 < SQR(48)) && (avgSad8x8 < 8 * 8 * 2)) + { + *enableHalfPel8x8 = EB_FALSE; //CLASS_2 + } + else + { + *enableHalfPel8x8 = EB_FALSE;// EB_TRUE; //CLASS_3 + } + + } + + return return_error; } static void TestSearchAreaBounds( EbPictureBufferDesc_t *refPicPtr, - MeContext_t *contextPtr, + MeContext_t *contextPtr, EB_S16 *xsc, EB_S16 *ysc, EB_U32 listIndex, @@ -3667,113 +3667,113 @@ static void TestSearchAreaBounds( * performs ME (LCU) *******************************************/ EB_ERRORTYPE MotionEstimateLcu( - PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr - EB_U32 lcuIndex, // input parameter, LCU Index - EB_U32 lcuOriginX, // input parameter, LCU Origin X - EB_U32 lcuOriginY, // input parameter, LCU Origin X - MeContext_t *contextPtr, // input parameter, ME Context Ptr, used to store decimated/interpolated LCU/SR - EbPictureBufferDesc_t *inputPtr) // input parameter, source Picture Ptr + PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr + EB_U32 lcuIndex, // input parameter, LCU Index + EB_U32 lcuOriginX, // input parameter, LCU Origin X + EB_U32 lcuOriginY, // input parameter, LCU Origin X + MeContext_t *contextPtr, // input parameter, ME Context Ptr, used to store decimated/interpolated LCU/SR + EbPictureBufferDesc_t *inputPtr) // input parameter, source Picture Ptr { - EB_ERRORTYPE return_error = EB_ErrorNone; - - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - - EB_S16 xTopLeftSearchRegion; - EB_S16 yTopLeftSearchRegion; - EB_U32 searchRegionIndex; - EB_S16 pictureWidth = (EB_S16)((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->lumaWidth; - EB_S16 pictureHeight = (EB_S16)((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->lumaHeight; - EB_U32 lcuWidth = (inputPtr->width - lcuOriginX) < MAX_LCU_SIZE ? inputPtr->width - lcuOriginX : MAX_LCU_SIZE; - EB_U32 lcuHeight = (inputPtr->height - lcuOriginY) < MAX_LCU_SIZE ? inputPtr->height - lcuOriginY : MAX_LCU_SIZE; - EB_S16 padWidth = (EB_S16)MAX_LCU_SIZE - 1; - EB_S16 padHeight = (EB_S16)MAX_LCU_SIZE - 1; - EB_S16 searchAreaWidth; - EB_S16 searchAreaHeight; - EB_S16 xSearchAreaOrigin; - EB_S16 ySearchAreaOrigin; - EB_S16 originX = (EB_S16)lcuOriginX; - EB_S16 originY = (EB_S16)lcuOriginY; - - // HME - EB_U32 searchRegionNumberInWidth = 0; - EB_U32 searchRegionNumberInHeight = 0; - EB_S16 xHmeLevel0SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_S16 yHmeLevel0SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_U64 hmeLevel0Sad[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_S16 xHmeLevel1SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_S16 yHmeLevel1SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_U64 hmeLevel1Sad[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_S16 xHmeLevel2SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_S16 yHmeLevel2SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_U64 hmeLevel2Sad[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - - // Hierarchical ME Search Center - EB_S16 xHmeSearchCenter = 0; - EB_S16 yHmeSearchCenter = 0; - - // Final ME Search Center - EB_S16 xSearchCenter = 0; - EB_S16 ySearchCenter = 0; - - // Search Center SADs - EB_U64 hmeMvSad = 0; - - EB_U32 puIndex; - - EB_U32 maxNumberOfPusPerLcu = pictureControlSetPtr->maxNumberOfPusPerLcu; - - EB_U32 numOfListToSearch; - EB_U32 listIndex; - EB_U8 candidateIndex = 0; - EB_U8 totalMeCandidateIndex = 0; - EbPaReferenceObject_t *referenceObject; // input parameter, reference Object Ptr - - EbPictureBufferDesc_t *refPicPtr; - EbPictureBufferDesc_t *quarterRefPicPtr; - EbPictureBufferDesc_t *sixteenthRefPicPtr; - - EB_S16 tempXHmeSearchCenter = 0; - EB_S16 tempYHmeSearchCenter = 0; - - EB_U32 numQuadInWidth; - EB_U32 totalMeQuad; - EB_U32 quadIndex; - EB_U32 nextQuadIndex; - EB_U64 tempXHmeSad; - - EB_U64 ref0Poc = 0; - EB_U64 ref1Poc = 0; - - EB_U64 i; - - EB_S16 hmeLevel1SearchAreaInWidth; - EB_S16 hmeLevel1SearchAreaInHeight; - - EB_U32 adjustSearchAreaDirection = 0; + EB_ERRORTYPE return_error = EB_ErrorNone; + + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + + EB_S16 xTopLeftSearchRegion; + EB_S16 yTopLeftSearchRegion; + EB_U32 searchRegionIndex; + EB_S16 pictureWidth = (EB_S16)((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->lumaWidth; + EB_S16 pictureHeight = (EB_S16)((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->lumaHeight; + EB_U32 lcuWidth = (inputPtr->width - lcuOriginX) < MAX_LCU_SIZE ? inputPtr->width - lcuOriginX : MAX_LCU_SIZE; + EB_U32 lcuHeight = (inputPtr->height - lcuOriginY) < MAX_LCU_SIZE ? inputPtr->height - lcuOriginY : MAX_LCU_SIZE; + EB_S16 padWidth = (EB_S16)MAX_LCU_SIZE - 1; + EB_S16 padHeight = (EB_S16)MAX_LCU_SIZE - 1; + EB_S16 searchAreaWidth; + EB_S16 searchAreaHeight; + EB_S16 xSearchAreaOrigin; + EB_S16 ySearchAreaOrigin; + EB_S16 originX = (EB_S16)lcuOriginX; + EB_S16 originY = (EB_S16)lcuOriginY; + + // HME + EB_U32 searchRegionNumberInWidth = 0; + EB_U32 searchRegionNumberInHeight = 0; + EB_S16 xHmeLevel0SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_S16 yHmeLevel0SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_U64 hmeLevel0Sad[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_S16 xHmeLevel1SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_S16 yHmeLevel1SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_U64 hmeLevel1Sad[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_S16 xHmeLevel2SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_S16 yHmeLevel2SearchCenter[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + EB_U64 hmeLevel2Sad[EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT][EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; + + // Hierarchical ME Search Center + EB_S16 xHmeSearchCenter = 0; + EB_S16 yHmeSearchCenter = 0; + + // Final ME Search Center + EB_S16 xSearchCenter = 0; + EB_S16 ySearchCenter = 0; + + // Search Center SADs + EB_U64 hmeMvSad = 0; + + EB_U32 puIndex; + + EB_U32 maxNumberOfPusPerLcu = pictureControlSetPtr->maxNumberOfPusPerLcu; + + EB_U32 numOfListToSearch; + EB_U32 listIndex; + EB_U8 candidateIndex = 0; + EB_U8 totalMeCandidateIndex = 0; + EbPaReferenceObject_t *referenceObject; // input parameter, reference Object Ptr + + EbPictureBufferDesc_t *refPicPtr; + EbPictureBufferDesc_t *quarterRefPicPtr; + EbPictureBufferDesc_t *sixteenthRefPicPtr; + + EB_S16 tempXHmeSearchCenter = 0; + EB_S16 tempYHmeSearchCenter = 0; + + EB_U32 numQuadInWidth; + EB_U32 totalMeQuad; + EB_U32 quadIndex; + EB_U32 nextQuadIndex; + EB_U64 tempXHmeSad; + + EB_U64 ref0Poc = 0; + EB_U64 ref1Poc = 0; + + EB_U64 i; + + EB_S16 hmeLevel1SearchAreaInWidth; + EB_S16 hmeLevel1SearchAreaInHeight; + + EB_U32 adjustSearchAreaDirection = 0; // Configure HME level 0, level 1 and level 2 from static config parameters EB_BOOL enableHmeLevel0Flag = pictureControlSetPtr->enableHmeLevel0Flag; EB_BOOL enableHmeLevel1Flag = pictureControlSetPtr->enableHmeLevel1Flag; EB_BOOL enableHmeLevel2Flag = pictureControlSetPtr->enableHmeLevel2Flag; - EB_BOOL enableHalfPel32x32 = EB_FALSE; - EB_BOOL enableHalfPel16x16 = EB_FALSE; - EB_BOOL enableHalfPel8x8 = EB_FALSE; - EB_BOOL enableQuarterPel = EB_FALSE; + EB_BOOL enableHalfPel32x32 = EB_FALSE; + EB_BOOL enableHalfPel16x16 = EB_FALSE; + EB_BOOL enableHalfPel8x8 = EB_FALSE; + EB_BOOL enableQuarterPel = EB_FALSE; numOfListToSearch = (pictureControlSetPtr->sliceType == EB_P_PICTURE) ? (EB_U32)REF_LIST_0 : (EB_U32)REF_LIST_1; - referenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->refPaPicPtrArray[0]->objectPtr; - ref0Poc = pictureControlSetPtr->refPicPocArray[0]; + referenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->refPaPicPtrArray[0]->objectPtr; + ref0Poc = pictureControlSetPtr->refPicPocArray[0]; - if (numOfListToSearch){ - referenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->refPaPicPtrArray[1]->objectPtr; - ref1Poc = pictureControlSetPtr->refPicPocArray[1]; - } + if (numOfListToSearch){ + referenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->refPaPicPtrArray[1]->objectPtr; + ref1Poc = pictureControlSetPtr->refPicPocArray[1]; + } - // Uni-Prediction motion estimation loop - // List Loop - for (listIndex = REF_LIST_0; listIndex <= numOfListToSearch; ++listIndex) { + // Uni-Prediction motion estimation loop + // List Loop + for (listIndex = REF_LIST_0; listIndex <= numOfListToSearch; ++listIndex) { // Ref Picture Loop referenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->refPaPicPtrArray[listIndex]->objectPtr; @@ -4314,192 +4314,192 @@ EB_ERRORTYPE MotionEstimateLcu( enableQuarterPel); } } - } + } + + // Bi-Prediction motion estimation loop + for (puIndex = 0; puIndex < maxNumberOfPusPerLcu; ++puIndex) { + candidateIndex = 0; + EB_U32 nIdx = puIndex > 20 ? tab8x8[puIndex-21] + 21 : + puIndex > 4 ? tab32x32[puIndex-5] + 5 : puIndex; + + for (listIndex = REF_LIST_0; listIndex <= numOfListToSearch; ++listIndex) { + candidateIndex++; + } + + totalMeCandidateIndex = candidateIndex; + + if (numOfListToSearch){ + EB_BOOL condition = (EB_BOOL)((pictureControlSetPtr->cu8x8Mode == CU_8x8_MODE_0 || puIndex < 21) && (pictureControlSetPtr->cu16x16Mode == CU_16x16_MODE_0 || puIndex < 5)); + + if (condition) { + EbHevcBiPredictionSearch( + contextPtr, + puIndex, + candidateIndex, + 1, + 1, + &totalMeCandidateIndex, + pictureControlSetPtr); + } + } + + MeCuResults_t * mePuResult = &pictureControlSetPtr->meResults[lcuIndex][puIndex]; + mePuResult->totalMeCandidateIndex = totalMeCandidateIndex; + + if (totalMeCandidateIndex == 3){ + + EB_U32 L0Sad = contextPtr->pLcuBestSad[0][0][nIdx]; + EB_U32 L1Sad = contextPtr->pLcuBestSad[1][0][nIdx]; + EB_U32 biSad = contextPtr->pLcuBipredSad[nIdx]; + + mePuResult->xMvL0 = _MVXT(contextPtr->pLcuBestMV[0][0][nIdx]); + mePuResult->yMvL0 = _MVYT(contextPtr->pLcuBestMV[0][0][nIdx]); + mePuResult->xMvL1 = _MVXT(contextPtr->pLcuBestMV[1][0][nIdx]); + mePuResult->yMvL1 = _MVYT(contextPtr->pLcuBestMV[1][0][nIdx]); + + EB_U32 order = Sort3Elements(L0Sad, L1Sad, biSad); + + switch (order){ + // a = l0Sad, b= l1Sad, c= biSad + case a_b_c: + + + NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) + NSET_CAND(mePuResult, 1, L1Sad, UNI_PRED_LIST_1) + NSET_CAND(mePuResult, 2, biSad, BI_PRED) + break; + + case a_c_b: - // Bi-Prediction motion estimation loop - for (puIndex = 0; puIndex < maxNumberOfPusPerLcu; ++puIndex) { - candidateIndex = 0; - EB_U32 nIdx = puIndex > 20 ? tab8x8[puIndex-21] + 21 : - puIndex > 4 ? tab32x32[puIndex-5] + 5 : puIndex; + NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) + NSET_CAND(mePuResult, 1, biSad, BI_PRED) + NSET_CAND(mePuResult, 2, L1Sad, UNI_PRED_LIST_1) + break; - for (listIndex = REF_LIST_0; listIndex <= numOfListToSearch; ++listIndex) { - candidateIndex++; - } - - totalMeCandidateIndex = candidateIndex; - - if (numOfListToSearch){ - EB_BOOL condition = (EB_BOOL)((pictureControlSetPtr->cu8x8Mode == CU_8x8_MODE_0 || puIndex < 21) && (pictureControlSetPtr->cu16x16Mode == CU_16x16_MODE_0 || puIndex < 5)); - - if (condition) { - EbHevcBiPredictionSearch( - contextPtr, - puIndex, - candidateIndex, - 1, - 1, - &totalMeCandidateIndex, - pictureControlSetPtr); - } - } - - MeCuResults_t * mePuResult = &pictureControlSetPtr->meResults[lcuIndex][puIndex]; - mePuResult->totalMeCandidateIndex = totalMeCandidateIndex; - - if (totalMeCandidateIndex == 3){ - - EB_U32 L0Sad = contextPtr->pLcuBestSad[0][0][nIdx]; - EB_U32 L1Sad = contextPtr->pLcuBestSad[1][0][nIdx]; - EB_U32 biSad = contextPtr->pLcuBipredSad[nIdx]; - - mePuResult->xMvL0 = _MVXT(contextPtr->pLcuBestMV[0][0][nIdx]); - mePuResult->yMvL0 = _MVYT(contextPtr->pLcuBestMV[0][0][nIdx]); - mePuResult->xMvL1 = _MVXT(contextPtr->pLcuBestMV[1][0][nIdx]); - mePuResult->yMvL1 = _MVYT(contextPtr->pLcuBestMV[1][0][nIdx]); - - EB_U32 order = Sort3Elements(L0Sad, L1Sad, biSad); - - switch (order){ - // a = l0Sad, b= l1Sad, c= biSad - case a_b_c: - - - NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) - NSET_CAND(mePuResult, 1, L1Sad, UNI_PRED_LIST_1) - NSET_CAND(mePuResult, 2, biSad, BI_PRED) - break; - - case a_c_b: - - NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) - NSET_CAND(mePuResult, 1, biSad, BI_PRED) - NSET_CAND(mePuResult, 2, L1Sad, UNI_PRED_LIST_1) - break; - - case b_a_c: - - NSET_CAND(mePuResult, 0, L1Sad, UNI_PRED_LIST_1) - NSET_CAND(mePuResult, 1, L0Sad, UNI_PRED_LIST_0) - NSET_CAND(mePuResult, 2, biSad, BI_PRED) - break; - - case b_c_a: - - NSET_CAND(mePuResult, 0, L1Sad, UNI_PRED_LIST_1) - NSET_CAND(mePuResult, 1, biSad, BI_PRED) - NSET_CAND(mePuResult, 2, L0Sad, UNI_PRED_LIST_0) - break; - - case c_a_b: - - NSET_CAND(mePuResult, 0, biSad, BI_PRED) - NSET_CAND(mePuResult, 1, L0Sad, UNI_PRED_LIST_0) - NSET_CAND(mePuResult, 2, L1Sad, UNI_PRED_LIST_1) - break; - - case c_b_a: - - NSET_CAND(mePuResult, 0, biSad, BI_PRED) - NSET_CAND(mePuResult, 1, L1Sad, UNI_PRED_LIST_1) - NSET_CAND(mePuResult, 2, L0Sad, UNI_PRED_LIST_0) - break; - - default: - SVT_LOG("Err in sorting"); - break; - } - } else if (totalMeCandidateIndex == 2){ - - EB_U32 L0Sad = contextPtr->pLcuBestSad[0][0][nIdx]; - EB_U32 L1Sad = contextPtr->pLcuBestSad[1][0][nIdx]; - - mePuResult->xMvL0 = _MVXT(contextPtr->pLcuBestMV[0][0][nIdx]); - mePuResult->yMvL0 = _MVYT(contextPtr->pLcuBestMV[0][0][nIdx]); - mePuResult->xMvL1 = _MVXT(contextPtr->pLcuBestMV[1][0][nIdx]); - mePuResult->yMvL1 = _MVYT(contextPtr->pLcuBestMV[1][0][nIdx]); - - if (L0Sad <= L1Sad){ - NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) - NSET_CAND(mePuResult, 1, L1Sad, UNI_PRED_LIST_1) - } - else{ - NSET_CAND(mePuResult, 0, L1Sad, UNI_PRED_LIST_1) - NSET_CAND(mePuResult, 1, L0Sad, UNI_PRED_LIST_0) - } - } else{ - EB_U32 L0Sad = contextPtr->pLcuBestSad[0][0][nIdx]; - mePuResult->xMvL0 = _MVXT(contextPtr->pLcuBestMV[0][0][nIdx]); - mePuResult->yMvL0 = _MVYT(contextPtr->pLcuBestMV[0][0][nIdx]); - mePuResult->xMvL1 = _MVXT(contextPtr->pLcuBestMV[1][0][nIdx]); - mePuResult->yMvL1 = _MVYT(contextPtr->pLcuBestMV[1][0][nIdx]); - NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) - } - } - - if (sequenceControlSetPtr->staticConfig.rateControlMode){ + case b_a_c: - // Compute the sum of the distortion of all 16 16x16 (best) blocks in the LCU - pictureControlSetPtr->rcMEdistortion[lcuIndex] = 0; - for (i = 0; i < 16; i++) { - pictureControlSetPtr->rcMEdistortion[lcuIndex] += pictureControlSetPtr->meResults[lcuIndex][5 + i].distortionDirection[0].distortion; - } + NSET_CAND(mePuResult, 0, L1Sad, UNI_PRED_LIST_1) + NSET_CAND(mePuResult, 1, L0Sad, UNI_PRED_LIST_0) + NSET_CAND(mePuResult, 2, biSad, BI_PRED) + break; - } + case b_c_a: + NSET_CAND(mePuResult, 0, L1Sad, UNI_PRED_LIST_1) + NSET_CAND(mePuResult, 1, biSad, BI_PRED) + NSET_CAND(mePuResult, 2, L0Sad, UNI_PRED_LIST_0) + break; - return return_error; + case c_a_b: + + NSET_CAND(mePuResult, 0, biSad, BI_PRED) + NSET_CAND(mePuResult, 1, L0Sad, UNI_PRED_LIST_0) + NSET_CAND(mePuResult, 2, L1Sad, UNI_PRED_LIST_1) + break; + + case c_b_a: + + NSET_CAND(mePuResult, 0, biSad, BI_PRED) + NSET_CAND(mePuResult, 1, L1Sad, UNI_PRED_LIST_1) + NSET_CAND(mePuResult, 2, L0Sad, UNI_PRED_LIST_0) + break; + + default: + SVT_LOG("Err in sorting"); + break; + } + } else if (totalMeCandidateIndex == 2){ + + EB_U32 L0Sad = contextPtr->pLcuBestSad[0][0][nIdx]; + EB_U32 L1Sad = contextPtr->pLcuBestSad[1][0][nIdx]; + + mePuResult->xMvL0 = _MVXT(contextPtr->pLcuBestMV[0][0][nIdx]); + mePuResult->yMvL0 = _MVYT(contextPtr->pLcuBestMV[0][0][nIdx]); + mePuResult->xMvL1 = _MVXT(contextPtr->pLcuBestMV[1][0][nIdx]); + mePuResult->yMvL1 = _MVYT(contextPtr->pLcuBestMV[1][0][nIdx]); + + if (L0Sad <= L1Sad){ + NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) + NSET_CAND(mePuResult, 1, L1Sad, UNI_PRED_LIST_1) + } + else{ + NSET_CAND(mePuResult, 0, L1Sad, UNI_PRED_LIST_1) + NSET_CAND(mePuResult, 1, L0Sad, UNI_PRED_LIST_0) + } + } else{ + EB_U32 L0Sad = contextPtr->pLcuBestSad[0][0][nIdx]; + mePuResult->xMvL0 = _MVXT(contextPtr->pLcuBestMV[0][0][nIdx]); + mePuResult->yMvL0 = _MVYT(contextPtr->pLcuBestMV[0][0][nIdx]); + mePuResult->xMvL1 = _MVXT(contextPtr->pLcuBestMV[1][0][nIdx]); + mePuResult->yMvL1 = _MVYT(contextPtr->pLcuBestMV[1][0][nIdx]); + NSET_CAND(mePuResult, 0, L0Sad, UNI_PRED_LIST_0) + } + } + + if (sequenceControlSetPtr->staticConfig.rateControlMode){ + + // Compute the sum of the distortion of all 16 16x16 (best) blocks in the LCU + pictureControlSetPtr->rcMEdistortion[lcuIndex] = 0; + for (i = 0; i < 16; i++) { + pictureControlSetPtr->rcMEdistortion[lcuIndex] += pictureControlSetPtr->meResults[lcuIndex][5 + i].distortionDirection[0].distortion; + } + + } + + + return return_error; } /** IntraOpenLoopSearchTheseModesOutputBest */ void IntraOpenLoopSearchTheseModesOutputBest( - EB_U32 cuSize, - MotionEstimationContext_t *contextPtr, - EB_U8 *src, - EB_U32 srcStride, - EB_U8 NumOfModesToTest, - EB_U32 *stage1ModesArray, - EB_U32 *sadArray, - EB_U32 *bestMode - ) + EB_U32 cuSize, + MotionEstimationContext_t *contextPtr, + EB_U8 *src, + EB_U32 srcStride, + EB_U8 NumOfModesToTest, + EB_U32 *stage1ModesArray, + EB_U32 *sadArray, + EB_U32 *bestMode + ) { - EB_U32 candidateIndex; - EB_U32 mode; - EB_U32 bestSAD = 32 * 32 * 255; - - for (candidateIndex = 0; candidateIndex < NumOfModesToTest; candidateIndex++) { + EB_U32 candidateIndex; + EB_U32 mode; + EB_U32 bestSAD = 32 * 32 * 255; - mode = stage1ModesArray[candidateIndex]; + for (candidateIndex = 0; candidateIndex < NumOfModesToTest; candidateIndex++) { - // Intra Prediction - IntraPredictionOpenLoop( - cuSize, - contextPtr, - (EB_U32)mode); + mode = stage1ModesArray[candidateIndex]; - //Distortion - sadArray[candidateIndex] = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting - src, - srcStride, - &(contextPtr->meContextPtr->lcuBuffer[0]), - MAX_LCU_SIZE, - cuSize, - cuSize); - - //kepp track of best SAD - if (sadArray[candidateIndex] < bestSAD){ - *bestMode = (EB_U32)mode; - bestSAD = sadArray[candidateIndex]; - } + // Intra Prediction + IntraPredictionOpenLoop( + cuSize, + contextPtr, + (EB_U32)mode); + + //Distortion + sadArray[candidateIndex] = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting + src, + srcStride, + &(contextPtr->meContextPtr->lcuBuffer[0]), + MAX_LCU_SIZE, + cuSize, + cuSize); + + //kepp track of best SAD + if (sadArray[candidateIndex] < bestSAD){ + *bestMode = (EB_U32)mode; + bestSAD = sadArray[candidateIndex]; + } - } + } } void InjectIntraCandidatesBasedOnBestModeIslice( OisCandidate_t *oisCuPtr, - EB_U32 *stage1SadArray, + EB_U32 *stage1SadArray, EB_U32 bestMode, EB_U8 *count) { @@ -4560,7 +4560,7 @@ void InjectIntraCandidatesBasedOnBestModeIslice( void InjectIntraCandidatesBasedOnBestMode( MotionEstimationContext_t *contextPtr, OisCandidate_t *oisCuPtr, - EB_U32 *stage1SadArray, + EB_U32 *stage1SadArray, EB_U32 bestMode) { EB_U32 count = 0; @@ -4756,20 +4756,20 @@ void InjectIntraCandidatesBasedOnBestMode( oisCuPtr[count].validDistortion = EB_FALSE; } - oisCuPtr[count++].intraMode = EB_INTRA_MODE_30; - oisCuPtr[count++].intraMode = EB_INTRA_DC; - oisCuPtr[count++].intraMode = EB_INTRA_PLANAR; - oisCuPtr[count++].intraMode = EB_INTRA_MODE_29; - oisCuPtr[count++].intraMode = EB_INTRA_MODE_31; - oisCuPtr[count++].intraMode = EB_INTRA_MODE_28; - oisCuPtr[count++].intraMode = EB_INTRA_MODE_32; - oisCuPtr[count++].intraMode = EB_INTRA_MODE_27; - oisCuPtr[count++].intraMode = EB_INTRA_MODE_33; + oisCuPtr[count++].intraMode = EB_INTRA_MODE_30; + oisCuPtr[count++].intraMode = EB_INTRA_DC; + oisCuPtr[count++].intraMode = EB_INTRA_PLANAR; + oisCuPtr[count++].intraMode = EB_INTRA_MODE_29; + oisCuPtr[count++].intraMode = EB_INTRA_MODE_31; + oisCuPtr[count++].intraMode = EB_INTRA_MODE_28; + oisCuPtr[count++].intraMode = EB_INTRA_MODE_32; + oisCuPtr[count++].intraMode = EB_INTRA_MODE_27; + oisCuPtr[count++].intraMode = EB_INTRA_MODE_33; - break; + break; - } + } } EB_S32 GetInterIntraSadDistance( @@ -4794,7 +4794,7 @@ EB_S32 GetInterIntraSadDistance( (EB_U32)1); //Distortion - stage1SadArray[0] = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting + stage1SadArray[0] = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting src, inputPtr->strideY, &(contextPtr->meContextPtr->lcuBuffer[0]), @@ -4867,117 +4867,117 @@ EB_ERRORTYPE SortOisCandidateOpenLoop( } EB_ERRORTYPE SortIntraModesOpenLoop( - PictureParentControlSet_t *pictureControlSetPtr, // input parameter, pointer to the current lcu - EB_U32 lcuIndex, // input parameter, lcu Index - EB_U32 cuIndex, // input parameter, cu index - EB_U32 sadDistortion, // input parameter, SAD - EB_U32 openLoopIntraCandidateIndex) // input parameter, intra mode + PictureParentControlSet_t *pictureControlSetPtr, // input parameter, pointer to the current lcu + EB_U32 lcuIndex, // input parameter, lcu Index + EB_U32 cuIndex, // input parameter, cu index + EB_U32 sadDistortion, // input parameter, SAD + EB_U32 openLoopIntraCandidateIndex) // input parameter, intra mode { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 worstIntraCandidateIndex; - EB_U32 bestIntraCandidateIndex; - EB_U64 worstSadDistortion; // could be EB_U32 + EB_U32 worstIntraCandidateIndex; + EB_U32 bestIntraCandidateIndex; + EB_U64 worstSadDistortion; // could be EB_U32 - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; - OisCandidate_t * oisCuPtr = cuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? - oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndex] : oisCu8ResultsPtr->sortedOisCandidate[cuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; + OisCandidate_t * oisCuPtr = cuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? + oisCu32Cu16ResultsPtr->sortedOisCandidate[cuIndex] : oisCu8ResultsPtr->sortedOisCandidate[cuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; - // Set the best MAX_OIS_2 modes - if (openLoopIntraCandidateIndex < MAX_OIS_2) { + // Set the best MAX_OIS_2 modes + if (openLoopIntraCandidateIndex < MAX_OIS_2) { - oisCuPtr[openLoopIntraCandidateIndex].distortion = sadDistortion; - oisCuPtr[openLoopIntraCandidateIndex].intraMode = openLoopIntraCandidateIndex; + oisCuPtr[openLoopIntraCandidateIndex].distortion = sadDistortion; + oisCuPtr[openLoopIntraCandidateIndex].intraMode = openLoopIntraCandidateIndex; - // Get a copy of the OIS SAD and mode - This array will be sorted - // This array is not used in RC and DeltaQP - oisCuPtr[openLoopIntraCandidateIndex].distortion = sadDistortion; - oisCuPtr[openLoopIntraCandidateIndex].intraMode = openLoopIntraCandidateIndex; + // Get a copy of the OIS SAD and mode - This array will be sorted + // This array is not used in RC and DeltaQP + oisCuPtr[openLoopIntraCandidateIndex].distortion = sadDistortion; + oisCuPtr[openLoopIntraCandidateIndex].intraMode = openLoopIntraCandidateIndex; - } - else { - EB_U32 intraIndex; - // Determine max SAD distortion - worstSadDistortion = oisCuPtr[0].distortion; - worstIntraCandidateIndex = EB_INTRA_PLANAR; + } + else { + EB_U32 intraIndex; + // Determine max SAD distortion + worstSadDistortion = oisCuPtr[0].distortion; + worstIntraCandidateIndex = EB_INTRA_PLANAR; - for (intraIndex = 1; intraIndex < MAX_OIS_2; ++intraIndex) { - bestIntraCandidateIndex = (EB_U32)intraIndex; - if (oisCuPtr[bestIntraCandidateIndex].distortion > worstSadDistortion) { + for (intraIndex = 1; intraIndex < MAX_OIS_2; ++intraIndex) { + bestIntraCandidateIndex = (EB_U32)intraIndex; + if (oisCuPtr[bestIntraCandidateIndex].distortion > worstSadDistortion) { - worstSadDistortion = oisCuPtr[bestIntraCandidateIndex].distortion; - worstIntraCandidateIndex = bestIntraCandidateIndex; - } - } + worstSadDistortion = oisCuPtr[bestIntraCandidateIndex].distortion; + worstIntraCandidateIndex = bestIntraCandidateIndex; + } + } - // Update the best MAX_OIS_2 modes - if (sadDistortion < worstSadDistortion) { + // Update the best MAX_OIS_2 modes + if (sadDistortion < worstSadDistortion) { - oisCuPtr[worstIntraCandidateIndex].distortion = sadDistortion; - oisCuPtr[worstIntraCandidateIndex].intraMode = openLoopIntraCandidateIndex; - } - } + oisCuPtr[worstIntraCandidateIndex].distortion = sadDistortion; + oisCuPtr[worstIntraCandidateIndex].intraMode = openLoopIntraCandidateIndex; + } + } - return return_error; + return return_error; } EB_U32 UpdateNeighborDcIntraPred( - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - EB_U32 cuSize) + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + EB_U32 cuSize) { - EB_U32 distortion; - // SVT_LOG("cuSize=%i x=%i y=%i rasterScanCuIndex=%i mdScanCuIndex=%i \n", cuSize, RASTER_SCAN_CU_X[rasterScanCuIndex], RASTER_SCAN_CU_Y[rasterScanCuIndex],rasterScanCuIndex, mdScanCuIndex ); - // Fill Neighbor Arrays - UpdateNeighborSamplesArrayOpenLoop( - contextPtr->intraRefPtr, - inputPtr, - inputPtr->strideY, - cuOriginX, - cuOriginY, - cuSize); - - // Intra Prediction - IntraPredictionOpenLoop( - cuSize, - contextPtr, - (EB_U32)INTRA_DC_MODE); - - distortion = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting - &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), - inputPtr->strideY, - &(contextPtr->meContextPtr->lcuBuffer[0]), - MAX_LCU_SIZE, - cuSize, - cuSize); - return(distortion); + EB_U32 distortion; + // SVT_LOG("cuSize=%i x=%i y=%i rasterScanCuIndex=%i mdScanCuIndex=%i \n", cuSize, RASTER_SCAN_CU_X[rasterScanCuIndex], RASTER_SCAN_CU_Y[rasterScanCuIndex],rasterScanCuIndex, mdScanCuIndex ); + // Fill Neighbor Arrays + UpdateNeighborSamplesArrayOpenLoop( + contextPtr->intraRefPtr, + inputPtr, + inputPtr->strideY, + cuOriginX, + cuOriginY, + cuSize); + + // Intra Prediction + IntraPredictionOpenLoop( + cuSize, + contextPtr, + (EB_U32)INTRA_DC_MODE); + + distortion = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting + &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), + inputPtr->strideY, + &(contextPtr->meContextPtr->lcuBuffer[0]), + MAX_LCU_SIZE, + cuSize, + cuSize); + return(distortion); } EB_ERRORTYPE OpenLoopIntraDC( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - EB_U32 rasterScanCuIndex) + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + EB_U32 rasterScanCuIndex) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; - OisCandidate_t *oisCuPtr = rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? - oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex] : oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; - EB_U32 cuSize = RASTER_SCAN_CU_SIZE[rasterScanCuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; + OisCandidate_t *oisCuPtr = rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? + oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex] : oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; + EB_U32 cuSize = RASTER_SCAN_CU_SIZE[rasterScanCuIndex]; - if ((cuSize == 32) || (cuSize == 16) || (cuSize == 8)) - { + if ((cuSize == 32) || (cuSize == 16) || (cuSize == 8)) + { if (!!(ASM_TYPES & AVX2_MASK)) { oisCuPtr[0].distortion = (EB_U32)UpdateNeighborDcIntraPred_AVX2_INTRIN( @@ -5001,29 +5001,29 @@ EB_ERRORTYPE OpenLoopIntraDC( cuSize); } - oisCuPtr[0].intraMode = INTRA_DC_MODE; - } - else{ + oisCuPtr[0].intraMode = INTRA_DC_MODE; + } + else{ - oisCuPtr[0].distortion = UpdateNeighborDcIntraPred( - contextPtr, - inputPtr, - cuOriginX, - cuOriginY, - cuSize); + oisCuPtr[0].distortion = UpdateNeighborDcIntraPred( + contextPtr, + inputPtr, + cuOriginX, + cuOriginY, + cuSize); - oisCuPtr[0].intraMode = INTRA_DC_MODE; - } + oisCuPtr[0].intraMode = INTRA_DC_MODE; + } oisCuPtr[0].validDistortion = 1; - if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) - oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = 1; - else - oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = 1; + if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) + oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = 1; + else + oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = 1; - return return_error; + return return_error; } EB_U8 GetNumOfIntraModesFromOisPoint( @@ -5049,272 +5049,272 @@ EB_U8 GetNumOfIntraModesFromOisPoint( } EB_ERRORTYPE OpenLoopIntraSearchLcu( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr) + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - EB_U32 rasterScanCuIndex; - EB_U32 meSad = 0xFFFFFFFF; - EB_U8 stage1NumOfModes = 0; - EB_S32 interIntraSadDistance = 0; - EB_U32 cuOriginX; - EB_U32 cuOriginY; - EB_U32 cuSize; - EB_U32 cuDepth; - EB_U32 stage1SadArray[11] = { 0 }; - EB_U32 openLoopIntraCandidateIndex; - EB_U32 sadDistortion; - EB_U32 intraCandidateIndex; - EB_U32 bestMode = EB_INTRA_PLANAR; + EB_ERRORTYPE return_error = EB_ErrorNone; + SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + EB_U32 rasterScanCuIndex; + EB_U32 meSad = 0xFFFFFFFF; + EB_U8 stage1NumOfModes = 0; + EB_S32 interIntraSadDistance = 0; + EB_U32 cuOriginX; + EB_U32 cuOriginY; + EB_U32 cuSize; + EB_U32 cuDepth; + EB_U32 stage1SadArray[11] = { 0 }; + EB_U32 openLoopIntraCandidateIndex; + EB_U32 sadDistortion; + EB_U32 intraCandidateIndex; + EB_U32 bestMode = EB_INTRA_PLANAR; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; - if (pictureControlSetPtr->sliceType == EB_I_PICTURE){ + if (pictureControlSetPtr->sliceType == EB_I_PICTURE){ - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_32x32_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_8x8_63; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_32x32_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_8x8_63; rasterScanCuIndex++) { - cuSize = RASTER_SCAN_CU_SIZE[rasterScanCuIndex]; + cuSize = RASTER_SCAN_CU_SIZE[rasterScanCuIndex]; - OisCandidate_t *oisCuPtr = rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? - oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex] : oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; + OisCandidate_t *oisCuPtr = rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? + oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex] : oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; // Initialize valid distortion flag for (intraCandidateIndex = 0; intraCandidateIndex < MAX_OIS_0; intraCandidateIndex++) { oisCuPtr[intraCandidateIndex].validDistortion = EB_FALSE; } - if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { - - cuOriginX = lcuParams->originX + RASTER_SCAN_CU_X[rasterScanCuIndex]; - cuOriginY = lcuParams->originY + RASTER_SCAN_CU_Y[rasterScanCuIndex]; - // Fill Neighbor Arrays - UpdateNeighborSamplesArrayOpenLoop( - contextPtr->intraRefPtr, - inputPtr, - inputPtr->strideY, - cuOriginX, - cuOriginY, - cuSize); - - if (cuSize == 32) { - - // Intra Prediction - IntraPredictionOpenLoop( - cuSize, - contextPtr, - (EB_U32)EB_INTRA_PLANAR); - - //Distortion - oisCuPtr[0].distortion = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting - &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), - inputPtr->strideY, - &(contextPtr->meContextPtr->lcuBuffer[0]), - MAX_LCU_SIZE, - cuSize, - cuSize); - - - oisCuPtr[0].intraMode = EB_INTRA_PLANAR; - oisCuPtr[0].validDistortion = EB_TRUE; - - } - else{ - EB_U8 count = 0; - IntraOpenLoopSearchTheseModesOutputBest(cuSize, - contextPtr, - &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), - inputPtr->strideY, + if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { + + cuOriginX = lcuParams->originX + RASTER_SCAN_CU_X[rasterScanCuIndex]; + cuOriginY = lcuParams->originY + RASTER_SCAN_CU_Y[rasterScanCuIndex]; + // Fill Neighbor Arrays + UpdateNeighborSamplesArrayOpenLoop( + contextPtr->intraRefPtr, + inputPtr, + inputPtr->strideY, + cuOriginX, + cuOriginY, + cuSize); + + if (cuSize == 32) { + + // Intra Prediction + IntraPredictionOpenLoop( + cuSize, + contextPtr, + (EB_U32)EB_INTRA_PLANAR); + + //Distortion + oisCuPtr[0].distortion = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( // Always SAD without weighting + &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), + inputPtr->strideY, + &(contextPtr->meContextPtr->lcuBuffer[0]), + MAX_LCU_SIZE, + cuSize, + cuSize); + + + oisCuPtr[0].intraMode = EB_INTRA_PLANAR; + oisCuPtr[0].validDistortion = EB_TRUE; + + } + else{ + EB_U8 count = 0; + IntraOpenLoopSearchTheseModesOutputBest(cuSize, + contextPtr, + &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), + inputPtr->strideY, MAX_OIS_0, // PL ,DC , 2 , H , 18, V , 34 - iSliceModesArray, - stage1SadArray, - &bestMode); + iSliceModesArray, + stage1SadArray, + &bestMode); - InjectIntraCandidatesBasedOnBestModeIslice( - oisCuPtr, - stage1SadArray, - bestMode, - &count); + InjectIntraCandidatesBasedOnBestModeIslice( + oisCuPtr, + stage1SadArray, + bestMode, + &count); - if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) - oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = count; - else - oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = count; + if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) + oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = count; + else + oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = count; - } - } - } - } - else{ + } + } + } + } + else{ EB_BOOL skipOis8x8 = pictureControlSetPtr->skipOis8x8; - EB_U32 maxCuIndex = (skipOis8x8 || pictureControlSetPtr->cu8x8Mode == CU_8x8_MODE_1) ? RASTER_SCAN_CU_INDEX_16x16_15 : RASTER_SCAN_CU_INDEX_8x8_63; + EB_U32 maxCuIndex = (skipOis8x8 || pictureControlSetPtr->cu8x8Mode == CU_8x8_MODE_1) ? RASTER_SCAN_CU_INDEX_16x16_15 : RASTER_SCAN_CU_INDEX_8x8_63; - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_32x32_0; rasterScanCuIndex <= maxCuIndex; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_32x32_0; rasterScanCuIndex <= maxCuIndex; rasterScanCuIndex++) { - EB_IOS_POINT oisPoint = OIS_VERY_COMPLEX_MODE; + EB_IOS_POINT oisPoint = OIS_VERY_COMPLEX_MODE; - cuSize = RASTER_SCAN_CU_SIZE[rasterScanCuIndex]; - cuDepth = RASTER_SCAN_CU_DEPTH[rasterScanCuIndex]; + cuSize = RASTER_SCAN_CU_SIZE[rasterScanCuIndex]; + cuDepth = RASTER_SCAN_CU_DEPTH[rasterScanCuIndex]; - OisCandidate_t * oisCuPtr = rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? - oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex] : oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; + OisCandidate_t * oisCuPtr = rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0 ? + oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex] : oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0]; - if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { - cuOriginX = lcuParams->originX + RASTER_SCAN_CU_X[rasterScanCuIndex]; - cuOriginY = lcuParams->originY + RASTER_SCAN_CU_Y[rasterScanCuIndex]; - if (pictureControlSetPtr->limitOisToDcModeFlag == EB_FALSE){ + if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { + cuOriginX = lcuParams->originX + RASTER_SCAN_CU_X[rasterScanCuIndex]; + cuOriginY = lcuParams->originY + RASTER_SCAN_CU_Y[rasterScanCuIndex]; + if (pictureControlSetPtr->limitOisToDcModeFlag == EB_FALSE){ - // Fill Neighbor Arrays - UpdateNeighborSamplesArrayOpenLoop( - contextPtr->intraRefPtr, - inputPtr, - inputPtr->strideY, - cuOriginX, - cuOriginY, - cuSize); - } + // Fill Neighbor Arrays + UpdateNeighborSamplesArrayOpenLoop( + contextPtr->intraRefPtr, + inputPtr, + inputPtr->strideY, + cuOriginX, + cuOriginY, + cuSize); + } - if (contextPtr->oisKernelLevel) { + if (contextPtr->oisKernelLevel) { // Initialize valid distortion flag - for (intraCandidateIndex = 0; intraCandidateIndex < MAX_OIS_2; intraCandidateIndex++) { - oisCuPtr[intraCandidateIndex].validDistortion = EB_FALSE; - } - - EB_U32 oisIndex; - for (oisIndex = 0; oisIndex < MAX_INTRA_MODES; ++oisIndex) { - - openLoopIntraCandidateIndex = (EB_U32)oisIndex; - // Intra Prediction - IntraPredictionOpenLoop( - cuSize, - contextPtr, - openLoopIntraCandidateIndex); - - //Distortion - sadDistortion = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( - &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), - inputPtr->strideY, - &(contextPtr->meContextPtr->lcuBuffer[0]), - MAX_LCU_SIZE, - cuSize, - cuSize); - - // BEST MAX_OIS_2 - SortIntraModesOpenLoop( - pictureControlSetPtr, - lcuIndex, - rasterScanCuIndex, - sadDistortion, - openLoopIntraCandidateIndex); - } - - // The sorted array is not used in RC and DeltaQP - SortOisCandidateOpenLoop(oisCuPtr); - - if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) - oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = MAX_OIS_2; - else - oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = MAX_OIS_2; - - } - else - { + for (intraCandidateIndex = 0; intraCandidateIndex < MAX_OIS_2; intraCandidateIndex++) { + oisCuPtr[intraCandidateIndex].validDistortion = EB_FALSE; + } + + EB_U32 oisIndex; + for (oisIndex = 0; oisIndex < MAX_INTRA_MODES; ++oisIndex) { + + openLoopIntraCandidateIndex = (EB_U32)oisIndex; + // Intra Prediction + IntraPredictionOpenLoop( + cuSize, + contextPtr, + openLoopIntraCandidateIndex); + + //Distortion + sadDistortion = (EB_U32)NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3]( + &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), + inputPtr->strideY, + &(contextPtr->meContextPtr->lcuBuffer[0]), + MAX_LCU_SIZE, + cuSize, + cuSize); + + // BEST MAX_OIS_2 + SortIntraModesOpenLoop( + pictureControlSetPtr, + lcuIndex, + rasterScanCuIndex, + sadDistortion, + openLoopIntraCandidateIndex); + } + + // The sorted array is not used in RC and DeltaQP + SortOisCandidateOpenLoop(oisCuPtr); + + if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) + oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = MAX_OIS_2; + else + oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = MAX_OIS_2; + + } + else + { // Initialize valid distortion flag for (intraCandidateIndex = 0; intraCandidateIndex < MAX_OIS_1; intraCandidateIndex++) { oisCuPtr[intraCandidateIndex].validDistortion = EB_FALSE; } - if (pictureControlSetPtr->limitOisToDcModeFlag == EB_TRUE){ - - OpenLoopIntraDC( - pictureControlSetPtr, - lcuIndex, - contextPtr, - inputPtr, - cuOriginX, - cuOriginY, - rasterScanCuIndex); - } - else{ - // Set ME distortion - - meSad = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; - - interIntraSadDistance = GetInterIntraSadDistance( - contextPtr, - inputPtr, - cuSize, - stage1SadArray, - meSad, - cuOriginX, - cuOriginY); - - oisPoint = GetOisPoint( + if (pictureControlSetPtr->limitOisToDcModeFlag == EB_TRUE){ + + OpenLoopIntraDC( + pictureControlSetPtr, + lcuIndex, + contextPtr, + inputPtr, + cuOriginX, + cuOriginY, + rasterScanCuIndex); + } + else{ + // Set ME distortion + + meSad = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; + + interIntraSadDistance = GetInterIntraSadDistance( + contextPtr, + inputPtr, + cuSize, + stage1SadArray, + meSad, + cuOriginX, + cuOriginY); + + oisPoint = GetOisPoint( contextPtr->oisThSet, - meSad, - pictureControlSetPtr->temporalLayerIndex, - interIntraSadDistance, - stage1SadArray); + meSad, + pictureControlSetPtr->temporalLayerIndex, + interIntraSadDistance, + stage1SadArray); - if (oisPoint == OIS_VERY_FAST_MODE){ + if (oisPoint == OIS_VERY_FAST_MODE){ - oisCuPtr[0].intraMode = INTRA_DC_MODE; - oisCuPtr[0].distortion = stage1SadArray[0]; + oisCuPtr[0].intraMode = INTRA_DC_MODE; + oisCuPtr[0].distortion = stage1SadArray[0]; - if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) - oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = 1; - else - oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = 1; + if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) + oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = 1; + else + oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = 1; - } - else{ - stage1NumOfModes = numberOfOisModePoints[oisPoint]; + } + else{ + stage1NumOfModes = numberOfOisModePoints[oisPoint]; - IntraOpenLoopSearchTheseModesOutputBest(cuSize, - contextPtr, - &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), - inputPtr->strideY, - stage1NumOfModes, - stage1ModesArray, - stage1SadArray, - &bestMode); + IntraOpenLoopSearchTheseModesOutputBest(cuSize, + contextPtr, + &(inputPtr->bufferY[(inputPtr->originY + cuOriginY) * inputPtr->strideY + (inputPtr->originX + cuOriginX)]), + inputPtr->strideY, + stage1NumOfModes, + stage1ModesArray, + stage1SadArray, + &bestMode); - InjectIntraCandidatesBasedOnBestMode( + InjectIntraCandidatesBasedOnBestMode( contextPtr, - oisCuPtr, - stage1SadArray, - bestMode); + oisCuPtr, + stage1SadArray, + bestMode); - if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) - oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = totalIntraLumaMode[oisPoint][cuDepth]; - else - oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = totalIntraLumaMode[oisPoint][cuDepth]; + if (rasterScanCuIndex < RASTER_SCAN_CU_INDEX_8x8_0) + oisCu32Cu16ResultsPtr->totalIntraLumaMode[rasterScanCuIndex] = totalIntraLumaMode[oisPoint][cuDepth]; + else + oisCu8ResultsPtr->totalIntraLumaMode[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0] = totalIntraLumaMode[oisPoint][cuDepth]; - } - } - } + } + } + } - } - } - } + } + } + } - return return_error; + return return_error; } diff --git a/Source/Lib/Codec/EbMotionEstimation.h b/Source/Lib/Codec/EbMotionEstimation.h index 3ab2f7b79..dc994272f 100644 --- a/Source/Lib/Codec/EbMotionEstimation.h +++ b/Source/Lib/Codec/EbMotionEstimation.h @@ -27,10 +27,10 @@ extern EB_ERRORTYPE MotionEstimateLcu( EbPictureBufferDesc_t *inputPtr); extern EB_ERRORTYPE OpenLoopIntraCandidateSearchLcu( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr); + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr); extern void Decimation2D( EB_U8 *inputSamples, @@ -42,20 +42,20 @@ extern void Decimation2D( EB_U32 decimStep); extern EB_ERRORTYPE OpenLoopIntraSearchLcu( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - MotionEstimationContext_t *contextPtr, - EbPictureBufferDesc_t *inputPtr); + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + MotionEstimationContext_t *contextPtr, + EbPictureBufferDesc_t *inputPtr); extern void EbHevcGetMv( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - EB_S32 *xCurrentMv, - EB_S32 *yCurrentMv); + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + EB_S32 *xCurrentMv, + EB_S32 *yCurrentMv); extern void EbHevcGetMeDist( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, EB_U32 *distortion); EB_S8 Sort3Elements(EB_U32 a, EB_U32 b, EB_U32 c); diff --git a/Source/Lib/Codec/EbMotionEstimationContext.c b/Source/Lib/Codec/EbMotionEstimationContext.c index 671e98f5d..094b3f674 100644 --- a/Source/Lib/Codec/EbMotionEstimationContext.c +++ b/Source/Lib/Codec/EbMotionEstimationContext.c @@ -59,7 +59,7 @@ EB_ERRORTYPE MeContextCtor( EB_MEMSET((*objectDblPtr)->lcuBuffer, 0 , sizeof(EB_U8) * MAX_LCU_SIZE * (*objectDblPtr)->lcuBufferStride); EB_MEMSET((*objectDblPtr)->hmeLcuBuffer, 0 ,sizeof(EB_U8) * (MAX_LCU_SIZE + HME_DECIM_FILTER_TAP - 1) * (*objectDblPtr)->hmeLcuBufferStride); - EB_MALLOC(EB_BitFraction *, (*objectDblPtr)->mvdBitsArray, sizeof(EB_BitFraction) * NUMBER_OF_MVD_CASES, EB_N_PTR); + EB_MALLOC(EB_BitFraction *, (*objectDblPtr)->mvdBitsArray, sizeof(EB_BitFraction) * NUMBER_OF_MVD_CASES, EB_N_PTR); // 15 intermediate buffers to retain the interpolated reference samples // 0 1 2 3 diff --git a/Source/Lib/Codec/EbMotionEstimationContext.h b/Source/Lib/Codec/EbMotionEstimationContext.h index 83d3ddaad..789d6200d 100644 --- a/Source/Lib/Codec/EbMotionEstimationContext.h +++ b/Source/Lib/Codec/EbMotionEstimationContext.h @@ -26,7 +26,7 @@ extern "C" { #define MEAN_PRECISION (VARIANCE_PRECISION >> 1) #define HME_RECTANGULAR 0 -#define HME_SPARSE 1 +#define HME_SPARSE 1 // Quater pel refinement methods typedef enum EB_QUARTER_PEL_REFINEMENT_METHOD { @@ -135,7 +135,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_8x8_61 = 82, ME_TIER_ZERO_PU_8x8_62 = 83, ME_TIER_ZERO_PU_8x8_63 = 84, - // 2NxN [42 partitions] + // 2NxN [42 partitions] ME_TIER_ZERO_PU_64x32_0 = 85, ME_TIER_ZERO_PU_64x32_1 = 86, ME_TIER_ZERO_PU_32x16_0 = 87, @@ -178,7 +178,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_16x8_29 = 124, ME_TIER_ZERO_PU_16x8_30 = 125, ME_TIER_ZERO_PU_16x8_31 = 126, - // Nx2N [42 partitions] + // Nx2N [42 partitions] ME_TIER_ZERO_PU_32x64_0 = 127, ME_TIER_ZERO_PU_32x64_1 = 128, ME_TIER_ZERO_PU_16x32_0 = 129, @@ -222,7 +222,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_8x16_30 = 167, ME_TIER_ZERO_PU_8x16_31 = 168, - // 2NxnU [10 partitions] + // 2NxnU [10 partitions] ME_TIER_ZERO_PU_64x16_0 = 169, ME_TIER_ZERO_PU_64x16_1 = 170, ME_TIER_ZERO_PU_32x8_0 = 171, @@ -233,7 +233,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_32x8_5 = 176, ME_TIER_ZERO_PU_32x8_6 = 177, ME_TIER_ZERO_PU_32x8_7 = 178, - // 2NxnD [10 partitions] + // 2NxnD [10 partitions] ME_TIER_ZERO_PU_64x48_0 = 179, ME_TIER_ZERO_PU_64x48_1 = 180, ME_TIER_ZERO_PU_32x24_0 = 181, @@ -244,7 +244,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_32x24_5 = 186, ME_TIER_ZERO_PU_32x24_6 = 187, ME_TIER_ZERO_PU_32x24_7 = 188, - // nLx2N [10 partitions] + // nLx2N [10 partitions] ME_TIER_ZERO_PU_16x64_0 = 189, ME_TIER_ZERO_PU_16x64_1 = 190, ME_TIER_ZERO_PU_8x32_0 = 191, @@ -255,7 +255,7 @@ typedef enum EB_ME_TIER_ZERO_PU { ME_TIER_ZERO_PU_8x32_5 = 196, ME_TIER_ZERO_PU_8x32_6 = 197, ME_TIER_ZERO_PU_8x32_7 = 198, - // nRx2N [10 partitions] + // nRx2N [10 partitions] ME_TIER_ZERO_PU_48x64_0 = 199, ME_TIER_ZERO_PU_48x64_1 = 200, ME_TIER_ZERO_PU_24x32_0 = 201, @@ -269,7 +269,7 @@ typedef enum EB_ME_TIER_ZERO_PU { } EB_ME_TIER_ZERO_PU; typedef struct MeTierZero_s { - + MePredictionUnit_t pu[MAX_ME_PU_COUNT]; } MeTierZero_t; @@ -288,36 +288,36 @@ typedef struct IntraReferenceSamplesOpenLoop_s { } IntraReferenceSamplesOpenLoop_t; typedef EB_U64 (*EB_ME_DISTORTION_FUNC)( - EB_U8 *src, - EB_U32 srcStride, - EB_U8 *ref, - EB_U32 refStride, - EB_U32 width, + EB_U8 *src, + EB_U32 srcStride, + EB_U8 *ref, + EB_U32 refStride, + EB_U32 width, EB_U32 height); typedef struct MePredUnit_s { EB_U32 distortion; - EB_PREDDIRECTION predictionDirection; + EB_PREDDIRECTION predictionDirection; EB_U32 Mv[MAX_NUM_OF_REF_PIC_LIST]; } MePredUnit_t; typedef struct MotionEstimationTierZero_s { - + MePredUnit_t pu[MAX_ME_PU_COUNT]; } MotionEstimationTierZero_t; typedef struct MeContext_s { - + // MV offset (search center) EB_BOOL updateHmeSearchCenter; EB_S16 xMvOffset; EB_S16 yMvOffset; // Search region stride - EB_U32 interpolatedStride; - EB_U32 interpolatedFullStride[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; + EB_U32 interpolatedStride; + EB_U32 interpolatedFullStride[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; MotionEstimationTierZero_t meCandidate[MAX_ME_CANDIDATE_PER_PU]; @@ -328,18 +328,18 @@ typedef struct MeContext_s { EB_U8 *lcuBuffer; EB_U8 *lcuBufferPtr; EB_U32 lcuBufferStride; - EB_U8 *hmeLcuBuffer; + EB_U8 *hmeLcuBuffer; EB_U32 hmeLcuBufferStride; - EB_U8 *lcuSrcPtr; - EB_U32 lcuSrcStride; + EB_U8 *lcuSrcPtr; + EB_U32 lcuSrcStride; EB_U8 *quarterLcuBuffer; EB_U32 quarterLcuBufferStride; EB_U8 *sixteenthLcuBuffer; EB_U32 sixteenthLcuBufferStride; EB_U8 *integerBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; - EB_U8 *integerBufferPtr[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; - EB_U8 *posbBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; + EB_U8 *integerBufferPtr[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; + EB_U8 *posbBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; EB_U8 *poshBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; EB_U8 *posjBuffer[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX]; @@ -405,12 +405,12 @@ typedef struct MeContext_s { EB_U8 psubPelDirection32x16[8]; EB_U8 psubPelDirection16x8[32]; - EB_U8 psubPelDirection32x64[2]; - EB_U8 psubPelDirection16x32[8]; + EB_U8 psubPelDirection32x64[2]; + EB_U8 psubPelDirection16x32[8]; EB_U8 psubPelDirection8x16[32]; - EB_U8 psubPelDirection64x16[2]; - EB_U8 psubPelDirection32x8[8]; + EB_U8 psubPelDirection64x16[2]; + EB_U8 psubPelDirection32x8[8]; EB_U8 psubPelDirection64x48[2]; EB_U8 psubPelDirection32x24[8]; @@ -426,7 +426,7 @@ typedef struct MeContext_s { EB_U32 pLcuBipredSad[MAX_ME_PU_COUNT];//needs to be upgraded to 209 pus EB_U32 pBestSadMap[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX][MAX_ME_PU_COUNT]; EB_U32 pBestMvMap[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX][MAX_ME_PU_COUNT]; - + EB_U32 pLcuBestSsd[MAX_NUM_OF_REF_PIC_LIST][MAX_REF_IDX][MAX_ME_PU_COUNT]; EB_U32 *pBestSsd8x8; @@ -436,19 +436,19 @@ typedef struct MeContext_s { EB_U16 *pEightPosSad16x16; - EB_U64 lambda; + EB_U64 lambda; EB_U8 hmeSearchType; // Multi-Mode signal(s) - EB_U8 fractionalSearchMethod; + EB_U8 fractionalSearchMethod; EB_U8 fractionalSearchModel; EB_BOOL fractionalSearch64x64; EB_BOOL oneQuadrantHME; - - // ME + + // ME EB_U8 searchAreaWidth; EB_U8 searchAreaHeight; - // HME + // HME EB_U16 numberHmeSearchRegionInWidth; EB_U16 numberHmeSearchRegionInHeight; EB_U16 hmeLevel0TotalSearchAreaWidth; @@ -461,13 +461,13 @@ typedef struct MeContext_s { EB_U16 hmeLevel2SearchAreaInHeightArray[EB_HME_SEARCH_AREA_ROW_MAX_COUNT]; - EB_BitFraction *mvdBitsArray; + EB_BitFraction *mvdBitsArray; } MeContext_t; extern EB_ERRORTYPE MeContextCtor( MeContext_t **objectDblPtr); - + #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbMotionEstimationLcuResults.h b/Source/Lib/Codec/EbMotionEstimationLcuResults.h index e36a7ff7a..ca34ff49f 100644 --- a/Source/Lib/Codec/EbMotionEstimationLcuResults.h +++ b/Source/Lib/Codec/EbMotionEstimationLcuResults.h @@ -11,25 +11,25 @@ extern "C" { #endif #define MAX_ME_PU_COUNT 85 // Sum of all the possible partitions which have both deminsions greater than 4. - // i.e. no 4x4, 8x4, or 4x8 partitions + // i.e. no 4x4, 8x4, or 4x8 partitions #define SQUARE_PU_COUNT 85 #define MAX_ME_CANDIDATE_PER_PU 3 typedef struct MeCandidate_s { - - union { - struct { - signed short xMvL0 ; //Note: Do not change the order of these fields - signed short yMvL0 ; - signed short xMvL1 ; - signed short yMvL1 ; + + union { + struct { + signed short xMvL0 ; //Note: Do not change the order of these fields + signed short yMvL0 ; + signed short xMvL1 ; + signed short yMvL1 ; }mv; - EB_U64 MVs; - }; + EB_U64 MVs; + }; - unsigned distortion : 32; // 20-bits holds maximum SAD of 64x64 PU + unsigned distortion : 32; // 20-bits holds maximum SAD of 64x64 PU - unsigned direction : 8; // 0: uni-pred L0, 1: uni-pred L1, 2: bi-pred + unsigned direction : 8; // 0: uni-pred L0, 1: uni-pred L1, 2: bi-pred } MeCandidate_t; @@ -49,25 +49,25 @@ typedef struct MeLcuResults_s { typedef struct DistDir_s{ - unsigned distortion : 32; //20bits are enough - unsigned direction : 2; + unsigned distortion : 32; //20bits are enough + unsigned direction : 2; } DistDir_t; typedef struct MeCuResults_s { - union { - struct { - signed short xMvL0; - signed short yMvL0; - signed short xMvL1; - signed short yMvL1; - }; - EB_U64 MVs; - }; - - DistDir_t distortionDirection[3]; - - EB_U8 totalMeCandidateIndex; + union { + struct { + signed short xMvL0; + signed short yMvL0; + signed short xMvL1; + signed short yMvL1; + }; + EB_U64 MVs; + }; + + DistDir_t distortionDirection[3]; + + EB_U8 totalMeCandidateIndex; } MeCuResults_t; diff --git a/Source/Lib/Codec/EbMotionEstimationProcess.c b/Source/Lib/Codec/EbMotionEstimationProcess.c index 01744c4e2..138b514aa 100644 --- a/Source/Lib/Codec/EbMotionEstimationProcess.c +++ b/Source/Lib/Codec/EbMotionEstimationProcess.c @@ -20,7 +20,7 @@ #include "emmintrin.h" #define SQUARE_PU_NUM 85 -#define BUFF_CHECK_SIZE 128 +#define BUFF_CHECK_SIZE 128 #define DERIVE_INTRA_32_FROM_16 0 //CHKN 1 @@ -52,49 +52,49 @@ ************************************************/ static void* SetMeHmeParamsOq( MeContext_t *meContextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr, - EB_INPUT_RESOLUTION inputResolution) + PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + EB_INPUT_RESOLUTION inputResolution) { - EB_U8 hmeMeLevel = pictureControlSetPtr->encMode; + EB_U8 hmeMeLevel = pictureControlSetPtr->encMode; - EB_U32 inputRatio = sequenceControlSetPtr->lumaWidth / sequenceControlSetPtr->lumaHeight; + EB_U32 inputRatio = sequenceControlSetPtr->lumaWidth / sequenceControlSetPtr->lumaHeight; - EB_U8 resolutionIndex = inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER ? 0 : // 480P - (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio < 2) ? 1 : // 720P - (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio > 3) ? 2 : // 1080I - (inputResolution <= INPUT_SIZE_1080p_RANGE) ? 3 : // 1080I - 4; // 4K + EB_U8 resolutionIndex = inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER ? 0 : // 480P + (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio < 2) ? 1 : // 720P + (inputResolution <= INPUT_SIZE_1080i_RANGE && inputRatio > 3) ? 2 : // 1080I + (inputResolution <= INPUT_SIZE_1080p_RANGE) ? 3 : // 1080I + 4; // 4K // HME/ME default settings - meContextPtr->numberHmeSearchRegionInWidth = EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT; - meContextPtr->numberHmeSearchRegionInHeight = EB_HME_SEARCH_AREA_ROW_MAX_COUNT; + meContextPtr->numberHmeSearchRegionInWidth = EB_HME_SEARCH_AREA_COLUMN_MAX_COUNT; + meContextPtr->numberHmeSearchRegionInHeight = EB_HME_SEARCH_AREA_ROW_MAX_COUNT; // HME Level0 - meContextPtr->hmeLevel0TotalSearchAreaWidth = HmeLevel0TotalSearchAreaWidthOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0TotalSearchAreaHeight = HmeLevel0TotalSearchAreaHeightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = HmeLevel0SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInWidthArray[1] = HmeLevel0SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInHeightArray[0] = HmeLevel0SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel0SearchAreaInHeightArray[1] = HmeLevel0SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0TotalSearchAreaWidth = HmeLevel0TotalSearchAreaWidthOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0TotalSearchAreaHeight = HmeLevel0TotalSearchAreaHeightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInWidthArray[0] = HmeLevel0SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInWidthArray[1] = HmeLevel0SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInHeightArray[0] = HmeLevel0SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel0SearchAreaInHeightArray[1] = HmeLevel0SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; // HME Level1 - meContextPtr->hmeLevel1SearchAreaInWidthArray[0] = HmeLevel1SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel1SearchAreaInWidthArray[1] = HmeLevel1SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel1SearchAreaInHeightArray[0] = HmeLevel1SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel1SearchAreaInHeightArray[1] = HmeLevel1SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInWidthArray[0] = HmeLevel1SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInWidthArray[1] = HmeLevel1SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInHeightArray[0] = HmeLevel1SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel1SearchAreaInHeightArray[1] = HmeLevel1SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; // HME Level2 - meContextPtr->hmeLevel2SearchAreaInWidthArray[0] = HmeLevel2SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel2SearchAreaInWidthArray[1] = HmeLevel2SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel2SearchAreaInHeightArray[0] = HmeLevel2SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; - meContextPtr->hmeLevel2SearchAreaInHeightArray[1] = HmeLevel2SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInWidthArray[0] = HmeLevel2SearchAreaInWidthArrayRightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInWidthArray[1] = HmeLevel2SearchAreaInWidthArrayLeftOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInHeightArray[0] = HmeLevel2SearchAreaInHeightArrayTopOq[resolutionIndex][hmeMeLevel]; + meContextPtr->hmeLevel2SearchAreaInHeightArray[1] = HmeLevel2SearchAreaInHeightArrayBottomOq[resolutionIndex][hmeMeLevel]; // ME - meContextPtr->searchAreaWidth = SearchAreaWidthOq[resolutionIndex][hmeMeLevel]; - meContextPtr->searchAreaHeight = SearchAreaHeightOq[resolutionIndex][hmeMeLevel]; + meContextPtr->searchAreaWidth = SearchAreaWidthOq[resolutionIndex][hmeMeLevel]; + meContextPtr->searchAreaHeight = SearchAreaHeightOq[resolutionIndex][hmeMeLevel]; - // HME Level0 adjustment for low frame rate contents (frame rate <= 30) + // HME Level0 adjustment for low frame rate contents (frame rate <= 30) if (inputResolution == INPUT_SIZE_4K_RANGE) { if ((sequenceControlSetPtr->staticConfig.frameRate >> 16) <= 30) { @@ -120,7 +120,7 @@ static void* SetMeHmeParamsOq( if ((inputResolution > INPUT_SIZE_576p_RANGE_OR_LOWER) && (sequenceControlSetPtr->staticConfig.tune > 0)) { meContextPtr->updateHmeSearchCenter = EB_TRUE; } - return EB_NULL; + return EB_NULL; }; @@ -130,7 +130,7 @@ static void* SetMeHmeParamsOq( * Set ME/HME Params from Config ************************************************/ static void SetMeHmeParamsFromConfig( - SequenceControlSet_t *sequenceControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, MeContext_t *meContextPtr) { @@ -143,28 +143,28 @@ static void SetMeHmeParamsFromConfig( ************************************************/ EB_ERRORTYPE MotionEstimationContextCtor( - MotionEstimationContext_t **contextDblPtr, - EbFifo_t *pictureDecisionResultsInputFifoPtr, - EbFifo_t *motionEstimationResultsOutputFifoPtr) { + MotionEstimationContext_t **contextDblPtr, + EbFifo_t *pictureDecisionResultsInputFifoPtr, + EbFifo_t *motionEstimationResultsOutputFifoPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - MotionEstimationContext_t *contextPtr; - EB_MALLOC(MotionEstimationContext_t*, contextPtr, sizeof(MotionEstimationContext_t), EB_N_PTR); + EB_ERRORTYPE return_error = EB_ErrorNone; + MotionEstimationContext_t *contextPtr; + EB_MALLOC(MotionEstimationContext_t*, contextPtr, sizeof(MotionEstimationContext_t), EB_N_PTR); - *contextDblPtr = contextPtr; + *contextDblPtr = contextPtr; - contextPtr->pictureDecisionResultsInputFifoPtr = pictureDecisionResultsInputFifoPtr; - contextPtr->motionEstimationResultsOutputFifoPtr = motionEstimationResultsOutputFifoPtr; - return_error = IntraOpenLoopReferenceSamplesCtor(&contextPtr->intraRefPtr); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - return_error = MeContextCtor(&(contextPtr->meContextPtr)); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } + contextPtr->pictureDecisionResultsInputFifoPtr = pictureDecisionResultsInputFifoPtr; + contextPtr->motionEstimationResultsOutputFifoPtr = motionEstimationResultsOutputFifoPtr; + return_error = IntraOpenLoopReferenceSamplesCtor(&contextPtr->intraRefPtr); + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + return_error = MeContextCtor(&(contextPtr->meContextPtr)); + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } - return EB_ErrorNone; + return EB_ErrorNone; } @@ -172,130 +172,130 @@ EB_ERRORTYPE MotionEstimationContextCtor( * ZZ Decimated SAD Computation ***************************************************************************************************/ static EB_ERRORTYPE ComputeDecimatedZzSad( - MotionEstimationContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 xLcuStartIndex, - EB_U32 xLcuEndIndex, - EB_U32 yLcuStartIndex, - EB_U32 yLcuEndIndex) { + MotionEstimationContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 xLcuStartIndex, + EB_U32 xLcuEndIndex, + EB_U32 yLcuStartIndex, + EB_U32 yLcuEndIndex) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - PictureParentControlSet_t *previousPictureControlSetWrapperPtr = ((PictureParentControlSet_t*)pictureControlSetPtr->previousPictureControlSetWrapperPtr->objectPtr); - EbPictureBufferDesc_t *previousInputPictureFull = previousPictureControlSetWrapperPtr->enhancedPicturePtr; + PictureParentControlSet_t *previousPictureControlSetWrapperPtr = ((PictureParentControlSet_t*)pictureControlSetPtr->previousPictureControlSetWrapperPtr->objectPtr); + EbPictureBufferDesc_t *previousInputPictureFull = previousPictureControlSetWrapperPtr->enhancedPicturePtr; - EB_U32 lcuIndex; + EB_U32 lcuIndex; - EB_U32 lcuWidth; - EB_U32 lcuHeight; + EB_U32 lcuWidth; + EB_U32 lcuHeight; - EB_U32 decimatedLcuWidth; - EB_U32 decimatedLcuHeight; + EB_U32 decimatedLcuWidth; + EB_U32 decimatedLcuHeight; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; - EB_U32 blkDisplacementDecimated; - EB_U32 blkDisplacementFull; + EB_U32 blkDisplacementDecimated; + EB_U32 blkDisplacementFull; - EB_U32 decimatedLcuCollocatedSad; + EB_U32 decimatedLcuCollocatedSad; - EB_U32 xLcuIndex; - EB_U32 yLcuIndex; + EB_U32 xLcuIndex; + EB_U32 yLcuIndex; - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - lcuIndex = xLcuIndex + yLcuIndex * sequenceControlSetPtr->pictureWidthInLcu; + lcuIndex = xLcuIndex + yLcuIndex * sequenceControlSetPtr->pictureWidthInLcu; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - lcuWidth = lcuParams->width; - lcuHeight = lcuParams->height; + lcuWidth = lcuParams->width; + lcuHeight = lcuParams->height; - lcuOriginX = lcuParams->originX; - lcuOriginY = lcuParams->originY; + lcuOriginX = lcuParams->originX; + lcuOriginY = lcuParams->originY; - lcuWidth = lcuParams->width; - lcuHeight = lcuParams->height; + lcuWidth = lcuParams->width; + lcuHeight = lcuParams->height; - decimatedLcuWidth = lcuWidth >> 2; - decimatedLcuHeight = lcuHeight >> 2; + decimatedLcuWidth = lcuWidth >> 2; + decimatedLcuHeight = lcuHeight >> 2; - decimatedLcuCollocatedSad = 0; + decimatedLcuCollocatedSad = 0; if (lcuParams->isCompleteLcu) - { + { - blkDisplacementDecimated = (sixteenthDecimatedPicturePtr->originY + (lcuOriginY >> 2)) * sixteenthDecimatedPicturePtr->strideY + sixteenthDecimatedPicturePtr->originX + (lcuOriginX >> 2); + blkDisplacementDecimated = (sixteenthDecimatedPicturePtr->originY + (lcuOriginY >> 2)) * sixteenthDecimatedPicturePtr->strideY + sixteenthDecimatedPicturePtr->originX + (lcuOriginX >> 2); blkDisplacementFull = (previousInputPictureFull->originY + lcuOriginY)* previousInputPictureFull->strideY + (previousInputPictureFull->originX + lcuOriginX); - // 1/16 collocated LCU decimation - Decimation2D( - &previousInputPictureFull->bufferY[blkDisplacementFull], - previousInputPictureFull->strideY, - MAX_LCU_SIZE, - MAX_LCU_SIZE, - contextPtr->meContextPtr->sixteenthLcuBuffer, - contextPtr->meContextPtr->sixteenthLcuBufferStride, - 4); - - // ZZ SAD between 1/16 current & 1/16 collocated - decimatedLcuCollocatedSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][2]( - &(sixteenthDecimatedPicturePtr->bufferY[blkDisplacementDecimated]), - sixteenthDecimatedPicturePtr->strideY, - contextPtr->meContextPtr->sixteenthLcuBuffer, - contextPtr->meContextPtr->sixteenthLcuBufferStride, - 16, 16); - - // Background Enhancement Algorithm - // Classification is important to: - // 1. Avoid improving moving objects. - // 2. Do not modulate when all the picture is background - // 3. Do give different importance to different regions - if (decimatedLcuCollocatedSad < BEA_CLASS_0_0_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < BEA_CLASS_0_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_1_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < BEA_CLASS_1_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < BEA_CLASS_2_DEC_TH) { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; - } - else { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; - } - - - } - else { - previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = INVALID_ZZ_COST; - decimatedLcuCollocatedSad = (EB_U32)~0; - } - - - // Keep track of non moving LCUs for QP modulation - if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 2)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; - } - else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 8)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; - } - else { //if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { - previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; - } - } - } - - return return_error; + // 1/16 collocated LCU decimation + Decimation2D( + &previousInputPictureFull->bufferY[blkDisplacementFull], + previousInputPictureFull->strideY, + MAX_LCU_SIZE, + MAX_LCU_SIZE, + contextPtr->meContextPtr->sixteenthLcuBuffer, + contextPtr->meContextPtr->sixteenthLcuBufferStride, + 4); + + // ZZ SAD between 1/16 current & 1/16 collocated + decimatedLcuCollocatedSad = NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][2]( + &(sixteenthDecimatedPicturePtr->bufferY[blkDisplacementDecimated]), + sixteenthDecimatedPicturePtr->strideY, + contextPtr->meContextPtr->sixteenthLcuBuffer, + contextPtr->meContextPtr->sixteenthLcuBufferStride, + 16, 16); + + // Background Enhancement Algorithm + // Classification is important to: + // 1. Avoid improving moving objects. + // 2. Do not modulate when all the picture is background + // 3. Do give different importance to different regions + if (decimatedLcuCollocatedSad < BEA_CLASS_0_0_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < BEA_CLASS_0_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_0_1_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < BEA_CLASS_1_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < BEA_CLASS_2_DEC_TH) { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; + } + else { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; + } + + + } + else { + previousPictureControlSetWrapperPtr->zzCostArray[lcuIndex] = INVALID_ZZ_COST; + decimatedLcuCollocatedSad = (EB_U32)~0; + } + + + // Keep track of non moving LCUs for QP modulation + if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 2)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_0_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_1_ZZ_COST; + } + else if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 8)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_2_ZZ_COST; + } + else { //if (decimatedLcuCollocatedSad < ((decimatedLcuWidth * decimatedLcuHeight) * 4)) { + previousPictureControlSetWrapperPtr->nonMovingIndexArray[lcuIndex] = BEA_CLASS_3_ZZ_COST; + } + } + } + + return return_error; } /****************************************************** @@ -344,22 +344,22 @@ EB_ERRORTYPE SignalDerivationMeKernelOq( } // Set 64x64 Fractional Search Flag - if (pictureControlSetPtr->encMode <= ENC_MODE_2) { - contextPtr->meContextPtr->fractionalSearch64x64 = EB_TRUE; - } - else { - contextPtr->meContextPtr->fractionalSearch64x64 = EB_FALSE; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_2) { + contextPtr->meContextPtr->fractionalSearch64x64 = EB_TRUE; + } + else { + contextPtr->meContextPtr->fractionalSearch64x64 = EB_FALSE; + } // Set OIS Kernel - if (pictureControlSetPtr->encMode <= ENC_MODE_4) { - if (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE) { - contextPtr->oisKernelLevel = (pictureControlSetPtr->temporalLayerIndex == 0) ? EB_TRUE : EB_FALSE; - } - else { - contextPtr->oisKernelLevel = EB_FALSE; - } - } + if (pictureControlSetPtr->encMode <= ENC_MODE_4) { + if (sequenceControlSetPtr->inputResolution < INPUT_SIZE_4K_RANGE) { + contextPtr->oisKernelLevel = (pictureControlSetPtr->temporalLayerIndex == 0) ? EB_TRUE : EB_FALSE; + } + else { + contextPtr->oisKernelLevel = EB_FALSE; + } + } else { contextPtr->oisKernelLevel = EB_FALSE; } @@ -382,16 +382,16 @@ EB_ERRORTYPE SignalDerivationMeKernelOq( } } else { - if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - contextPtr->oisThSet = 2; - } + if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + contextPtr->oisThSet = 2; + } else { contextPtr->oisThSet = 1; } } // Set valid flag for the best OIS - contextPtr->setBestOisDistortionToValid = EB_FALSE; + contextPtr->setBestOisDistortionToValid = EB_FALSE; // Set fractional search model // 0: search all blocks @@ -401,14 +401,14 @@ EB_ERRORTYPE SignalDerivationMeKernelOq( if (pictureControlSetPtr->encMode <= ENC_MODE_5) { contextPtr->meContextPtr->fractionalSearchModel = 0; } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - contextPtr->meContextPtr->fractionalSearchModel = 1; - } - else { - contextPtr->meContextPtr->fractionalSearchModel = 0; - } - } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + contextPtr->meContextPtr->fractionalSearchModel = 1; + } + else { + contextPtr->meContextPtr->fractionalSearchModel = 0; + } + } else { contextPtr->meContextPtr->fractionalSearchModel = 1; } @@ -427,10 +427,10 @@ EB_ERRORTYPE SignalDerivationMeKernelOq( Output : List0 MV ******************************************************/ void EbHevcGetMv( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, - EB_S32 *xCurrentMv, - EB_S32 *yCurrentMv) + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, + EB_S32 *xCurrentMv, + EB_S32 *yCurrentMv) { MeCuResults_t * cuResults = &pictureControlSetPtr->meResults[lcuIndex][0]; @@ -445,8 +445,8 @@ void EbHevcGetMv( Output : Best ME Distortion ******************************************************/ void EbHevcGetMeDist( - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex, EB_U32 *distortion) { @@ -459,7 +459,7 @@ void EbHevcGetMeDist( ******************************************************/ static void DeriveSimilarCollocatedFlag( PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + EB_U32 lcuIndex) { // Similairty detector for collocated LCU pictureControlSetPtr->similarColocatedLcuArray[lcuIndex] = EB_FALSE; @@ -502,8 +502,8 @@ static void StationaryEdgeOverUpdateOverTimeLcuPart1( PictureParentControlSet_t *pictureControlSetPtr, EB_U32 lcuIndex) { - EB_S32 xCurrentMv = 0; - EB_S32 yCurrentMv = 0; + EB_S32 xCurrentMv = 0; + EB_S32 yCurrentMv = 0; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; @@ -600,95 +600,95 @@ static void StationaryEdgeOverUpdateOverTimeLcuPart2( ************************************************/ void* MotionEstimationKernel(void *inputPtr) { - MotionEstimationContext_t *contextPtr = (MotionEstimationContext_t*)inputPtr; + MotionEstimationContext_t *contextPtr = (MotionEstimationContext_t*)inputPtr; - PictureParentControlSet_t *pictureControlSetPtr; - SequenceControlSet_t *sequenceControlSetPtr; + PictureParentControlSet_t *pictureControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; - EbObjectWrapper_t *inputResultsWrapperPtr; - PictureDecisionResults_t *inputResultsPtr; + EbObjectWrapper_t *inputResultsWrapperPtr; + PictureDecisionResults_t *inputResultsPtr; - EbObjectWrapper_t *outputResultsWrapperPtr; - MotionEstimationResults_t *outputResultsPtr; + EbObjectWrapper_t *outputResultsWrapperPtr; + MotionEstimationResults_t *outputResultsPtr; - EbPictureBufferDesc_t *inputPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr; EbPictureBufferDesc_t *inputPaddedPicturePtr; - EB_U32 bufferIndex; + EB_U32 bufferIndex; - EB_U32 lcuIndex; - EB_U32 xLcuIndex; - EB_U32 yLcuIndex; - EB_U32 pictureWidthInLcu; - EB_U32 pictureHeightInLcu; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U32 lcuWidth; - EB_U32 lcuHeight; - EB_U32 lcuRow; + EB_U32 lcuIndex; + EB_U32 xLcuIndex; + EB_U32 yLcuIndex; + EB_U32 pictureWidthInLcu; + EB_U32 pictureHeightInLcu; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U32 lcuWidth; + EB_U32 lcuHeight; + EB_U32 lcuRow; - EbPaReferenceObject_t *paReferenceObject; - EbPictureBufferDesc_t *quarterDecimatedPicturePtr; - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; + EbPaReferenceObject_t *paReferenceObject; + EbPictureBufferDesc_t *quarterDecimatedPicturePtr; + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; - // Segments - EB_U32 segmentIndex; - EB_U32 xSegmentIndex; - EB_U32 ySegmentIndex; - EB_U32 xLcuStartIndex; - EB_U32 xLcuEndIndex; - EB_U32 yLcuStartIndex; - EB_U32 yLcuEndIndex; + // Segments + EB_U32 segmentIndex; + EB_U32 xSegmentIndex; + EB_U32 ySegmentIndex; + EB_U32 xLcuStartIndex; + EB_U32 xLcuEndIndex; + EB_U32 yLcuStartIndex; + EB_U32 yLcuEndIndex; - EB_U32 intraSadIntervalIndex; + EB_U32 intraSadIntervalIndex; - MdRateEstimationContext_t *mdRateEstimationArray; + MdRateEstimationContext_t *mdRateEstimationArray; - for (;;) { + for (;;) { - // Get Input Full Object - EbGetFullObject( - contextPtr->pictureDecisionResultsInputFifoPtr, - &inputResultsWrapperPtr); + // Get Input Full Object + EbGetFullObject( + contextPtr->pictureDecisionResultsInputFifoPtr, + &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - inputResultsPtr = (PictureDecisionResults_t*)inputResultsWrapperPtr->objectPtr; - pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; - quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; - sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; + inputResultsPtr = (PictureDecisionResults_t*)inputResultsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; + quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; + sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; inputPaddedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->inputPaddedPicturePtr; - inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld ME IN \n", pictureControlSetPtr->pictureNumber); #endif - // Segments - segmentIndex = inputResultsPtr->segmentIndex; - pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - SEGMENT_CONVERT_IDX_TO_XY(segmentIndex, xSegmentIndex, ySegmentIndex, pictureControlSetPtr->meSegmentsColumnCount); - xLcuStartIndex = SEGMENT_START_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); - xLcuEndIndex = SEGMENT_END_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); - yLcuStartIndex = SEGMENT_START_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); - yLcuEndIndex = SEGMENT_END_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); - // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type - mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; - mdRateEstimationArray += pictureControlSetPtr->sliceType * TOTAL_NUMBER_OF_QP_VALUES + pictureControlSetPtr->pictureQp; - // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray - EB_MEMCPY(&(contextPtr->meContextPtr->mvdBitsArray[0]), &(mdRateEstimationArray->mvdBits[0]), sizeof(EB_BitFraction)*NUMBER_OF_MVD_CASES); + // Segments + segmentIndex = inputResultsPtr->segmentIndex; + pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + SEGMENT_CONVERT_IDX_TO_XY(segmentIndex, xSegmentIndex, ySegmentIndex, pictureControlSetPtr->meSegmentsColumnCount); + xLcuStartIndex = SEGMENT_START_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); + xLcuEndIndex = SEGMENT_END_IDX(xSegmentIndex, pictureWidthInLcu, pictureControlSetPtr->meSegmentsColumnCount); + yLcuStartIndex = SEGMENT_START_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); + yLcuEndIndex = SEGMENT_END_IDX(ySegmentIndex, pictureHeightInLcu, pictureControlSetPtr->meSegmentsRowCount); + // Increment the MD Rate Estimation array pointer to point to the right address based on the QP and slice type + mdRateEstimationArray = (MdRateEstimationContext_t*)sequenceControlSetPtr->encodeContextPtr->mdRateEstimationArray; + mdRateEstimationArray += pictureControlSetPtr->sliceType * TOTAL_NUMBER_OF_QP_VALUES + pictureControlSetPtr->pictureQp; + // Reset MD rate Estimation table to initial values by copying from mdRateEstimationArray + EB_MEMCPY(&(contextPtr->meContextPtr->mvdBitsArray[0]), &(mdRateEstimationArray->mvdBits[0]), sizeof(EB_BitFraction)*NUMBER_OF_MVD_CASES); SignalDerivationMeKernelOq( sequenceControlSetPtr, pictureControlSetPtr, contextPtr); - // Lambda Assignement + // Lambda Assignement if (pictureControlSetPtr->temporalLayerIndex == 0) { contextPtr->meContextPtr->lambda = lambdaModeDecisionRaSadBase[pictureControlSetPtr->pictureQp]; } @@ -725,7 +725,7 @@ void* MotionEstimationKernel(void *inputPtr) EB_U8 * srcPtr = &inputPaddedPicturePtr->bufferY[bufferIndex]; - //_MM_HINT_T0 //_MM_HINT_T1 //_MM_HINT_T2//_MM_HINT_NTA + //_MM_HINT_T0 //_MM_HINT_T1 //_MM_HINT_T2//_MM_HINT_NTA EB_U32 i; for (i = 0; i < lcuHeight; i++) { @@ -777,20 +777,20 @@ void* MotionEstimationKernel(void *inputPtr) } } - // OIS + Similar Collocated Checks + Stationary Edge Over Time Check + // OIS + Similar Collocated Checks + Stationary Edge Over Time Check // LCU Loop - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; - lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; lcuIndex = (EB_U16)(xLcuIndex + yLcuIndex * pictureWidthInLcu); - OpenLoopIntraSearchLcu( - pictureControlSetPtr, - lcuIndex, - contextPtr, - inputPicturePtr); + OpenLoopIntraSearchLcu( + pictureControlSetPtr, + lcuIndex, + contextPtr, + inputPicturePtr); // Derive Similar Collocated Flag DeriveSimilarCollocatedFlag( @@ -810,16 +810,16 @@ void* MotionEstimationKernel(void *inputPtr) pictureControlSetPtr, lcuIndex); } - } - } + } + } - // ZZ SADs Computation - // 1 lookahead frame is needed to get valid (0,0) SAD - if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { - // when DG is ON, the ZZ SADs are computed @ the PD process - { - // ZZ SADs Computation using decimated picture - if (pictureControlSetPtr->pictureNumber > 0) { + // ZZ SADs Computation + // 1 lookahead frame is needed to get valid (0,0) SAD + if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0) { + // when DG is ON, the ZZ SADs are computed @ the PD process + { + // ZZ SADs Computation using decimated picture + if (pictureControlSetPtr->pictureNumber > 0) { ComputeDecimatedZzSad( contextPtr, @@ -831,32 +831,32 @@ void* MotionEstimationKernel(void *inputPtr) yLcuStartIndex, yLcuEndIndex); - } - } - } + } + } + } - // Calculate the ME Distortion and OIS Historgrams + // Calculate the ME Distortion and OIS Historgrams EbBlockOnMutex(pictureControlSetPtr->rcDistortionHistogramMutex); - if (sequenceControlSetPtr->staticConfig.rateControlMode){ - if (pictureControlSetPtr->sliceType != EB_I_PICTURE){ - EB_U16 sadIntervalIndex; - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + if (sequenceControlSetPtr->staticConfig.rateControlMode){ + if (pictureControlSetPtr->sliceType != EB_I_PICTURE){ + EB_U16 sadIntervalIndex; + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; - lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; - lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; - lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; + lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; + lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; + lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; lcuIndex = (EB_U16)(xLcuIndex + yLcuIndex * pictureWidthInLcu); pictureControlSetPtr->interSadIntervalIndex[lcuIndex] = 0; pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = 0; - if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { + if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { - sadIntervalIndex = (EB_U16)(pictureControlSetPtr->rcMEdistortion[lcuIndex] >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) + sadIntervalIndex = (EB_U16)(pictureControlSetPtr->rcMEdistortion[lcuIndex] >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) sadIntervalIndex = (EB_U16)(sadIntervalIndex >> 2); if (sadIntervalIndex > (NUMBER_OF_SAD_INTERVALS>>1) -1){ @@ -875,12 +875,12 @@ void* MotionEstimationKernel(void *inputPtr) EB_U32 bestOisCuIndex = 0; - //DOUBLE CHECK THIS PIECE OF CODE + //DOUBLE CHECK THIS PIECE OF CODE intraSadIntervalIndex = (EB_U32) - (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; + (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; intraSadIntervalIndex = (EB_U16)(intraSadIntervalIndex >> 2); if (intraSadIntervalIndex > (NUMBER_OF_SAD_INTERVALS >> 1) - 1){ @@ -899,38 +899,38 @@ void* MotionEstimationKernel(void *inputPtr) - ++pictureControlSetPtr->fullLcuCount; - } + ++pictureControlSetPtr->fullLcuCount; + } - } - } - } - else{ - EB_U32 bestOisCuIndex = 0; + } + } + } + else{ + EB_U32 bestOisCuIndex = 0; - for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { - for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { - lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; - lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; - lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; - lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; + for (yLcuIndex = yLcuStartIndex; yLcuIndex < yLcuEndIndex; ++yLcuIndex) { + for (xLcuIndex = xLcuStartIndex; xLcuIndex < xLcuEndIndex; ++xLcuIndex) { + lcuOriginX = xLcuIndex * sequenceControlSetPtr->lcuSize; + lcuOriginY = yLcuIndex * sequenceControlSetPtr->lcuSize; + lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuOriginX) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaWidth - lcuOriginX : MAX_LCU_SIZE; + lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuOriginY) < MAX_LCU_SIZE ? sequenceControlSetPtr->lumaHeight - lcuOriginY : MAX_LCU_SIZE; lcuIndex = (EB_U16)(xLcuIndex + yLcuIndex * pictureWidthInLcu); pictureControlSetPtr->interSadIntervalIndex[lcuIndex] = 0; pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = 0; - if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { + if (lcuWidth == MAX_LCU_SIZE && lcuHeight == MAX_LCU_SIZE) { - //DOUBLE CHECK THIS PIECE OF CODE + //DOUBLE CHECK THIS PIECE OF CODE - intraSadIntervalIndex = (EB_U32) - (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + - pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; + intraSadIntervalIndex = (EB_U32) + (((pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[1][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[2][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[3][bestOisCuIndex].distortion + + pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[4][bestOisCuIndex].distortion)) >> (12 - SAD_PRECISION_INTERVAL));//change 12 to 2*log2(64) ; intraSadIntervalIndex = (EB_U16)(intraSadIntervalIndex >> 2); if (intraSadIntervalIndex > (NUMBER_OF_SAD_INTERVALS >> 1) - 1){ @@ -943,32 +943,32 @@ void* MotionEstimationKernel(void *inputPtr) intraSadIntervalIndex = NUMBER_OF_SAD_INTERVALS - 1; pictureControlSetPtr->intraSadIntervalIndex[lcuIndex] = intraSadIntervalIndex; - pictureControlSetPtr->oisDistortionHistogram[intraSadIntervalIndex] ++; - ++pictureControlSetPtr->fullLcuCount; - } - - } - } - } - } + pictureControlSetPtr->oisDistortionHistogram[intraSadIntervalIndex] ++; + ++pictureControlSetPtr->fullLcuCount; + } + + } + } + } + } #if DEADLOCK_DEBUG SVT_LOG("POC %lld ME OUT \n", pictureControlSetPtr->pictureNumber); #endif EbReleaseMutex(pictureControlSetPtr->rcDistortionHistogramMutex); - // Get Empty Results Object - EbGetEmptyObject( - contextPtr->motionEstimationResultsOutputFifoPtr, - &outputResultsWrapperPtr); - - outputResultsPtr = (MotionEstimationResults_t*)outputResultsWrapperPtr->objectPtr; - outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; - outputResultsPtr->segmentIndex = segmentIndex; - - // Release the Input Results - EbReleaseObject(inputResultsWrapperPtr); - - // Post the Full Results Object - EbPostFullObject(outputResultsWrapperPtr); - } - return EB_NULL; + // Get Empty Results Object + EbGetEmptyObject( + contextPtr->motionEstimationResultsOutputFifoPtr, + &outputResultsWrapperPtr); + + outputResultsPtr = (MotionEstimationResults_t*)outputResultsWrapperPtr->objectPtr; + outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; + outputResultsPtr->segmentIndex = segmentIndex; + + // Release the Input Results + EbReleaseObject(inputResultsWrapperPtr); + + // Post the Full Results Object + EbPostFullObject(outputResultsWrapperPtr); + } + return EB_NULL; } diff --git a/Source/Lib/Codec/EbMotionEstimationProcess.h b/Source/Lib/Codec/EbMotionEstimationProcess.h index b5815f015..b60c54690 100644 --- a/Source/Lib/Codec/EbMotionEstimationProcess.h +++ b/Source/Lib/Codec/EbMotionEstimationProcess.h @@ -19,7 +19,7 @@ extern "C" { * Context **************************************/ typedef struct MotionEstimationContext_s -{ +{ EbFifo_t *pictureDecisionResultsInputFifoPtr; EbFifo_t *motionEstimationResultsOutputFifoPtr; @@ -38,12 +38,12 @@ typedef struct MotionEstimationContext_s * Extern Function Declaration ***************************************/ extern EB_ERRORTYPE MotionEstimationContextCtor( - MotionEstimationContext_t **contextDblPtr, - EbFifo_t *pictureDecisionResultsInputFifoPtr, - EbFifo_t *motionEstimationResultsOutputFifoPtr); + MotionEstimationContext_t **contextDblPtr, + EbFifo_t *pictureDecisionResultsInputFifoPtr, + EbFifo_t *motionEstimationResultsOutputFifoPtr); -extern void* MotionEstimationKernel(void *inputPtr); +extern void* MotionEstimationKernel(void *inputPtr); #ifdef __cplusplus } diff --git a/Source/Lib/Codec/EbMotionEstimationResults.c b/Source/Lib/Codec/EbMotionEstimationResults.c index 68ba36161..0c9f42c12 100644 --- a/Source/Lib/Codec/EbMotionEstimationResults.c +++ b/Source/Lib/Codec/EbMotionEstimationResults.c @@ -14,7 +14,7 @@ EB_ERRORTYPE MotionEstimationResultsCtor( { MotionEstimationResults_t *contextPtr; EB_MALLOC(MotionEstimationResults_t*, contextPtr, sizeof(MotionEstimationResults_t), EB_N_PTR); - + *objectDblPtr = (EB_PTR) contextPtr; objectInitDataPtr = 0; diff --git a/Source/Lib/Codec/EbMotionEstimationResults.h b/Source/Lib/Codec/EbMotionEstimationResults.h index c357e49a3..0ce24edeb 100644 --- a/Source/Lib/Codec/EbMotionEstimationResults.h +++ b/Source/Lib/Codec/EbMotionEstimationResults.h @@ -14,7 +14,7 @@ extern "C" { /************************************** * Process Results **************************************/ -typedef struct MotionEstimationResults_s +typedef struct MotionEstimationResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; EB_U32 segmentIndex; @@ -29,7 +29,7 @@ typedef struct MotionEstimationResultsInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE MotionEstimationResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); diff --git a/Source/Lib/Codec/EbMotionVectorUnit.h b/Source/Lib/Codec/EbMotionVectorUnit.h index 912963d1d..63ad2aa40 100644 --- a/Source/Lib/Codec/EbMotionVectorUnit.h +++ b/Source/Lib/Codec/EbMotionVectorUnit.h @@ -13,18 +13,18 @@ extern "C" { #pragma pack(push, 1) typedef union { - struct - { - signed short x; - signed short y; - }; - EB_U32 mvUnion; + struct + { + signed short x; + signed short y; + }; + EB_U32 mvUnion; } Mv_t; #pragma pack(pop) #pragma pack(push, 1) -typedef struct +typedef struct { signed mvdX : 16; signed mvdY : 16; @@ -32,14 +32,14 @@ typedef struct unsigned : 7; unsigned predIdx : 1; unsigned : 7; - + } Mvd_t; #pragma pack(pop) typedef struct { - Mv_t mv[MAX_NUM_OF_REF_PIC_LIST]; - EB_U8 predDirection; + Mv_t mv[MAX_NUM_OF_REF_PIC_LIST]; + EB_U8 predDirection; } MvUnit_t; #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbNeighborArrays.c b/Source/Lib/Codec/EbNeighborArrays.c index 946223b51..5258968a5 100644 --- a/Source/Lib/Codec/EbNeighborArrays.c +++ b/Source/Lib/Codec/EbNeighborArrays.c @@ -23,7 +23,7 @@ EB_ERRORTYPE NeighborArrayUnitCtor( { NeighborArrayUnit_t *naUnitPtr; EB_MALLOC(NeighborArrayUnit_t*, naUnitPtr, sizeof(NeighborArrayUnit_t), EB_N_PTR); - + *naUnitDblPtr = naUnitPtr; naUnitPtr->unitSize = (EB_U8)(unitSize); naUnitPtr->granularityNormal = (EB_U8)(granularityNormal); @@ -248,7 +248,7 @@ void NeighborArrayUnitSampleWrite( picOriginX, picOriginY + (blockWidth - 1)) * naUnitPtr->unitSize; - EB_MEMCPY(dstPtr,readPtr,blockWidth); + EB_MEMCPY(dstPtr,readPtr,blockWidth); // Reset readPtr to the right-column readPtr = srcPtr + (blockWidth - 1); @@ -468,37 +468,37 @@ void NeighborArrayUnitModeWrite( { EB_U32 idx; EB_U8 *dstPtr; - + EB_U32 count; EB_U32 naOffset; - EB_U32 naUnitSize; + EB_U32 naUnitSize; - naUnitSize = naUnitPtr->unitSize; + naUnitSize = naUnitPtr->unitSize; if(neighborArrayTypeMask & NEIGHBOR_ARRAY_UNIT_TOP_MASK) { - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ + // | | // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX naOffset = GetNeighborArrayUnitTopIndex( naUnitPtr, originX); - dstPtr = naUnitPtr->topArray + + dstPtr = naUnitPtr->topArray + naOffset * naUnitSize; - + count = blockWidth >> naUnitPtr->granularityNormalLog2; for(idx = 0; idx < count; ++idx) { @@ -512,26 +512,26 @@ void NeighborArrayUnitModeWrite( if(neighborArrayTypeMask & NEIGHBOR_ARRAY_UNIT_LEFT_MASK) { // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY naOffset = GetNeighborArrayUnitLeftIndex( naUnitPtr, originY); - dstPtr = naUnitPtr->leftArray + + dstPtr = naUnitPtr->leftArray + naOffset * naUnitSize; count = blockHeight >> naUnitPtr->granularityNormalLog2; @@ -545,23 +545,23 @@ void NeighborArrayUnitModeWrite( } if(neighborArrayTypeMask & NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK) { - + /* // Top-left Neighbor Array - // + // // 4-5--6--7------------ - // 3 \ \ - // 2 \ \ - // 1 \ \ - // |\ xxxxxx7 - // | \ x 6 - // | \ x 5 - // | \1x2x3x4 - // | - // - // The top-left neighbor array is updated with the reversed samples - // from the right column and bottom row of the source block - // + // 3 \ \ + // 2 \ \ + // 1 \ \ + // |\ xxxxxx7 + // | \ x 6 + // | \ x 5 + // | \1x2x3x4 + // | + // + // The top-left neighbor array is updated with the reversed samples + // from the right column and bottom row of the source block + // // Index = originX - originY */ @@ -570,9 +570,9 @@ void NeighborArrayUnitModeWrite( originX, originY + (blockHeight - 1)); - // Copy bottom-row + right-column + // Copy bottom-row + right-column // *Note - start from the bottom-left corner - dstPtr = naUnitPtr->topLeftArray + + dstPtr = naUnitPtr->topLeftArray + naOffset * naUnitSize; count = ((blockWidth + blockHeight) >> naUnitPtr->granularityTopLeftLog2) - 1; @@ -580,7 +580,7 @@ void NeighborArrayUnitModeWrite( for(idx = 0; idx < count; ++idx) { EB_MEMCPY(dstPtr, value, naUnitSize); - + dstPtr += naUnitSize; } } @@ -597,55 +597,55 @@ void NeighborArrayUnitDepthSkipWrite(//NeighborArrayUnitDepthWrite( EB_U32 originY, EB_U32 blockSize) { - + EB_U8 *dstPtr; EB_U8 *naUnittopArray; - EB_U8 *naUnitleftArray; + EB_U8 *naUnitleftArray; EB_U32 count; - - naUnittopArray = naUnitPtr->topArray; - naUnitleftArray = naUnitPtr->leftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + naUnittopArray = naUnitPtr->topArray; + naUnitleftArray = naUnitPtr->leftArray; + + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // | | + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX dstPtr = naUnittopArray + (originX >> 3); count = blockSize >> 3; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY + - dstPtr = naUnitleftArray + (originY >> 3); - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); return; } @@ -660,56 +660,56 @@ void NeighborArrayUnitIntraWrite(//NeighborArrayUnitDepthWrite( EB_U32 originY, EB_U32 blockSize) { - + EB_U8 *dstPtr; EB_U8 *naUnittopArray; - EB_U8 *naUnitleftArray; + EB_U8 *naUnitleftArray; EB_U32 count; - - naUnittopArray = naUnitPtr->topArray; - naUnitleftArray = naUnitPtr->leftArray; + + naUnittopArray = naUnitPtr->topArray; + naUnitleftArray = naUnitPtr->leftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // | | + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX dstPtr = naUnittopArray + (originX >> 2); count = blockSize >> 2; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY + - dstPtr = naUnitleftArray + (originY >> 2); - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); return; } @@ -727,76 +727,76 @@ void NeighborArrayUnitModeTypeWrite( { EB_U8 *dstPtr; EB_U8 *naUnitTopArray; - EB_U8 *naUnitLeftArray; - EB_U8 *naUnitTopLeftArray; + EB_U8 *naUnitLeftArray; + EB_U8 *naUnitTopLeftArray; EB_U32 count; EB_U32 naOffset; - naUnitTopArray = naUnitPtr->topArray; - naUnitLeftArray = naUnitPtr->leftArray; - naUnitTopLeftArray = naUnitPtr->topLeftArray; + naUnitTopArray = naUnitPtr->topArray; + naUnitLeftArray = naUnitPtr->leftArray; + naUnitTopLeftArray = naUnitPtr->topLeftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // | | + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX naOffset = originX >> 2; dstPtr = naUnitTopArray + naOffset; count = blockSize >> 2; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY naOffset = originY >> 2; dstPtr = naUnitLeftArray + naOffset; - EB_MEMSET(dstPtr, *value, count); - - + EB_MEMSET(dstPtr, *value, count); + + /* // Top-left Neighbor Array - // + // // 4-5--6--7------------ - // 3 \ \ - // 2 \ \ - // 1 \ \ - // |\ xxxxxx7 - // | \ x 6 - // | \ x 5 - // | \1x2x3x4 - // | - // - // The top-left neighbor array is updated with the reversed samples - // from the right column and bottom row of the source block - // + // 3 \ \ + // 2 \ \ + // 1 \ \ + // |\ xxxxxx7 + // | \ x 6 + // | \ x 5 + // | \1x2x3x4 + // | + // + // The top-left neighbor array is updated with the reversed samples + // from the right column and bottom row of the source block + // // Index = originX - originY */ @@ -805,12 +805,12 @@ void NeighborArrayUnitModeTypeWrite( originX, originY + (blockSize - 1)); - // Copy bottom-row + right-column + // Copy bottom-row + right-column // *Note - start from the bottom-left corner dstPtr = naUnitTopLeftArray + naOffset; count = ((blockSize + blockSize) >> 2) - 1; - EB_MEMSET(dstPtr, *value, count); + EB_MEMSET(dstPtr, *value, count); return; @@ -825,7 +825,7 @@ void NeighborArrayUnitMvWrite( EB_U8 *value, EB_U32 originX, EB_U32 originY, - EB_U32 blockSize) + EB_U32 blockSize) { EB_U32 idx; EB_U8 *dstPtr; @@ -835,34 +835,34 @@ void NeighborArrayUnitMvWrite( EB_U32 count; EB_U32 naOffset; - EB_U32 naUnitSize; - - naUnitSize = naUnitPtr->unitSize; - naUnittopArray = naUnitPtr->topArray; - naUnitleftArray = naUnitPtr->leftArray; - naUnittopLeftArray = naUnitPtr->topLeftArray; + EB_U32 naUnitSize; + naUnitSize = naUnitPtr->unitSize; + naUnittopArray = naUnitPtr->topArray; + naUnitleftArray = naUnitPtr->leftArray; + naUnittopLeftArray = naUnitPtr->topLeftArray; - // - // ----------12345678--------------------- Top Neighbor Array - // ^ ^ + + // + // ----------12345678--------------------- Top Neighbor Array + // ^ ^ + // | | // | | - // | | - // xxxxxxxx - // x x - // x x - // 12345678 - // + // xxxxxxxx + // x x + // x x + // 12345678 + // // The top neighbor array is updated with the samples from the - // bottom row of the source block - // - // Index = originX + // bottom row of the source block + // + // Index = originX naOffset = originX >> 2 ; - dstPtr = naUnittopArray + + dstPtr = naUnittopArray + naOffset * naUnitSize; - + //dstStep = naUnitSize; count = blockSize >> 2; @@ -875,24 +875,24 @@ void NeighborArrayUnitMvWrite( // Left Neighbor Array - // - // | - // | - // 1 xxxxxxx1 - // 2 <---- x 2 - // 3 <---- x 3 - // 4 xxxxxxx4 - // | - // | - // + // + // | + // | + // 1 xxxxxxx1 + // 2 <---- x 2 + // 3 <---- x 3 + // 4 xxxxxxx4 + // | + // | + // // The left neighbor array is updated with the samples from the - // right column of the source block - // - // Index = originY + // right column of the source block + // + // Index = originY naOffset = originY >> 2 ; - dstPtr = naUnitleftArray + + dstPtr = naUnitleftArray + naOffset * naUnitSize; @@ -903,23 +903,23 @@ void NeighborArrayUnitMvWrite( dstPtr += naUnitSize; } - + /* // Top-left Neighbor Array - // + // // 4-5--6--7------------ - // 3 \ \ - // 2 \ \ - // 1 \ \ - // |\ xxxxxx7 - // | \ x 6 - // | \ x 5 - // | \1x2x3x4 - // | - // - // The top-left neighbor array is updated with the reversed samples - // from the right column and bottom row of the source block - // + // 3 \ \ + // 2 \ \ + // 1 \ \ + // |\ xxxxxx7 + // | \ x 6 + // | \ x 5 + // | \1x2x3x4 + // | + // + // The top-left neighbor array is updated with the reversed samples + // from the right column and bottom row of the source block + // // Index = originX - originY */ @@ -928,9 +928,9 @@ void NeighborArrayUnitMvWrite( originX, originY + (blockSize - 1)); - // Copy bottom-row + right-column + // Copy bottom-row + right-column // *Note - start from the bottom-left corner - dstPtr = naUnittopLeftArray + + dstPtr = naUnittopLeftArray + naOffset * naUnitSize; count = ((blockSize + blockSize) >> 2) - 1; @@ -938,7 +938,7 @@ void NeighborArrayUnitMvWrite( for(idx = 0; idx < count; ++idx) { EB_MEMCPY(dstPtr, value, naUnitSize); - + dstPtr += naUnitSize; } diff --git a/Source/Lib/Codec/EbNeighborArrays.h b/Source/Lib/Codec/EbNeighborArrays.h index 09462762e..73e1315e0 100644 --- a/Source/Lib/Codec/EbNeighborArrays.h +++ b/Source/Lib/Codec/EbNeighborArrays.h @@ -34,7 +34,7 @@ typedef enum NEIGHBOR_ARRAY_TYPE #define NEIGHBOR_ARRAY_UNIT_FULL_MASK (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK | NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK) #define NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK) -typedef struct NeighborArrayUnit_s +typedef struct NeighborArrayUnit_s { EB_U8 *leftArray; EB_U8 *topArray; @@ -42,7 +42,7 @@ typedef struct NeighborArrayUnit_s EB_U16 leftArraySize; EB_U16 topArraySize; EB_U16 topLeftArraySize; - EB_U8 unitSize; + EB_U8 unitSize; EB_U8 granularityNormal; EB_U8 granularityNormalLog2; EB_U8 granularityTopLeft; @@ -54,7 +54,7 @@ extern EB_ERRORTYPE NeighborArrayUnitCtor( NeighborArrayUnit_t **naUnitDblPtr, EB_U32 maxPictureWidth, EB_U32 maxPictureHeight, - EB_U32 unitSize, + EB_U32 unitSize, EB_U32 granularityNormal, EB_U32 granularityTopLeft, EB_U32 typeMask); @@ -78,7 +78,7 @@ extern EB_U32 GetNeighborArrayUnitTopLeftIndex( extern void NeighborArrayUnitSampleWrite( NeighborArrayUnit_t *naUnitPtr, - EB_U8 *srcPtr, + EB_U8 *srcPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, @@ -90,7 +90,7 @@ extern void NeighborArrayUnitSampleWrite( extern void NeighborArrayUnit16bitSampleWrite( NeighborArrayUnit_t *naUnitPtr, - EB_U16 *srcPtr, + EB_U16 *srcPtr, EB_U32 stride, EB_U32 srcOriginX, EB_U32 srcOriginY, diff --git a/Source/Lib/Codec/EbPackUnPack.h b/Source/Lib/Codec/EbPackUnPack.h index 0b07eabac..33549c7f1 100644 --- a/Source/Lib/Codec/EbPackUnPack.h +++ b/Source/Lib/Codec/EbPackUnPack.h @@ -30,40 +30,40 @@ EB_ENC_Pack2D_TYPE Pack2D_funcPtrArray_16Bit_SRC[2][EB_ASM_TYPE_TOTAL] = // C_DEFAULT EB_ENC_msbPack2D, // AVX2 - EB_ENC_msbPack2D, + EB_ENC_msbPack2D, }, { // C_DEFAULT EB_ENC_msbPack2D, // AVX2 - EB_ENC_msbPack2D_AVX2_INTRIN_AL,//EB_ENC_msbPack2D_AVX2 + EB_ENC_msbPack2D_AVX2_INTRIN_AL,//EB_ENC_msbPack2D_AVX2 } }; EB_ENC_Pack2D_TYPE CompressedPack_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - CompressedPackmsb, - // AVX2 - CompressedPackmsb_AVX2_INTRIN, + // C_DEFAULT + CompressedPackmsb, + // AVX2 + CompressedPackmsb_AVX2_INTRIN, }; typedef void(*COMPPack_TYPE)( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); COMPPack_TYPE Convert_Unpack_CPack_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - CPack_C, - // AVX2 - CPack_AVX2_INTRIN, + // C_DEFAULT + CPack_C, + // AVX2 + CPack_AVX2_INTRIN, }; @@ -81,13 +81,13 @@ EB_ENC_UnPack2D_TYPE UnPack2D_funcPtrArray_16Bit[2][EB_ASM_TYPE_TOTAL] = { { // C_DEFAULT - EB_ENC_msbUnPack2D, + EB_ENC_msbUnPack2D, // AVX2 - EB_ENC_msbUnPack2D, + EB_ENC_msbUnPack2D, }, { // C_DEFAULT - EB_ENC_msbUnPack2D, + EB_ENC_msbUnPack2D, // AVX512 #ifndef NON_AVX512_SUPPORT EB_ENC_msbUnPack2D_AVX512_INTRIN, @@ -104,16 +104,16 @@ typedef void(*EB_ENC_UnpackAvg_TYPE)( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, EB_U32 height ); EB_ENC_UnpackAvg_TYPE UnPackAvg_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT - UnpackAvg, + UnpackAvg, // AVX2 - UnpackAvg_AVX2_INTRIN,//UnpackAvg_SSE2_INTRIN, - + UnpackAvg_AVX2_INTRIN,//UnpackAvg_SSE2_INTRIN, + }; typedef void(*EB_ENC_UnpackAvgSub_TYPE)( EB_U16 *ref16L0, @@ -121,16 +121,16 @@ typedef void(*EB_ENC_UnpackAvgSub_TYPE)( EB_U16 *ref16L1, EB_U32 refL1Stride, EB_U8 *dstPtr, - EB_U32 dstStride, + EB_U32 dstStride, EB_U32 width, - EB_U32 height ); + EB_U32 height ); EB_ENC_UnpackAvgSub_TYPE UnPackAvgSafeSub_funcPtrArray[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT - UnpackAvgSafeSub, + UnpackAvgSafeSub, // AVX2 SafeSub - UnpackAvgSafeSub_AVX2_INTRIN - + UnpackAvgSafeSub_AVX2_INTRIN + }; typedef void(*EB_ENC_UnPack8BitData_TYPE)( @@ -150,7 +150,7 @@ EB_ENC_UnPack8BitData_TYPE UnPack8BIT_funcPtrArray_16Bit[2][EB_ASM_TYPE_TOTAL] = // C_DEFAULT UnPack8BitData, // AVX2 - EB_ENC_UnPack8BitData_SSE2_INTRIN, + EB_ENC_UnPack8BitData_SSE2_INTRIN, } }; typedef void(*EB_ENC_UnPack8BitDataSUB_TYPE)( @@ -163,10 +163,10 @@ typedef void(*EB_ENC_UnPack8BitDataSUB_TYPE)( ); EB_ENC_UnPack8BitDataSUB_TYPE UnPack8BITSafeSub_funcPtrArray_16Bit[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - UnPack8BitDataSafeSub, + // C_DEFAULT + UnPack8BitDataSafeSub, // SSE2 - EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN + EB_ENC_UnPack8BitDataSafeSub_SSE2_INTRIN }; #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPacketizationProcess.c b/Source/Lib/Codec/EbPacketizationProcess.c index 1c49099ea..e49ce92d3 100644 --- a/Source/Lib/Codec/EbPacketizationProcess.c +++ b/Source/Lib/Codec/EbPacketizationProcess.c @@ -111,7 +111,7 @@ EB_ERRORTYPE PacketizationContextCtor( EB_MALLOC(EbPPSConfig_t*, contextPtr->ppsConfig, sizeof(EbPPSConfig_t), EB_N_PTR); - return EB_ErrorNone; + return EB_ErrorNone; } void* PacketizationKernel(void *inputPtr) @@ -137,7 +137,7 @@ void* PacketizationKernel(void *inputPtr) EbObjectWrapper_t *rateControlTasksWrapperPtr; RateControlTasks_t *rateControlTasksPtr; EbObjectWrapper_t *pictureManagerResultsWrapperPtr; - PictureDemuxResults_t *pictureManagerResultPtr; + PictureDemuxResults_t *pictureManagerResultPtr; // Bitstream copy to output buffer Bitstream_t bitstream; @@ -347,7 +347,7 @@ void* PacketizationKernel(void *inputPtr) (EB_U32*) &(outputStreamPtr->nFilledLen), (EB_U32*) &(outputStreamPtr->nAllocLen), encodeContextPtr, - NAL_UNIT_INVALID); + NAL_UNIT_INVALID); } @@ -357,7 +357,7 @@ void* PacketizationKernel(void *inputPtr) EB_U32 lcuTotalCount; LargestCodingUnit_t *lcuPtr; EB_U32 lcuCodingOrder; - EB_S32 qpIndex; + EB_S32 qpIndex; lcuTotalCount = pictureControlSetPtr->lcuTotalCount; @@ -368,7 +368,7 @@ void* PacketizationKernel(void *inputPtr) sequenceControlSetPtr->encodeContextPtr->rateControlTablesArrayUpdated = EB_TRUE; - for(lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + for(lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuCodingOrder]; @@ -386,7 +386,7 @@ void* PacketizationKernel(void *inputPtr) intraSadIntervalIndex = pictureControlSetPtr->ParentPcsPtr->intraSadIntervalIndex[lcuCodingOrder]; - sadBits[intraSadIntervalIndex] += lcuPtr->totalBits; + sadBits[intraSadIntervalIndex] += lcuPtr->totalBits; count[intraSadIntervalIndex] ++; } @@ -397,8 +397,8 @@ void* PacketizationKernel(void *inputPtr) count[sadIntervalIndex] ++; } - } - } + } + } { EB_U32 blkSize = BLKSIZE; EbBlockOnMutex(sequenceControlSetPtr->encodeContextPtr->rateTableUpdateMutex); @@ -571,7 +571,7 @@ void* PacketizationKernel(void *inputPtr) EbReleaseMutex(sequenceControlSetPtr->encodeContextPtr->rateTableUpdateMutex); } - } + } } // Reset the bitstream @@ -618,7 +618,7 @@ void* PacketizationKernel(void *inputPtr) (EB_U32*) &(outputStreamPtr->nFilledLen), (EB_U32*) &(outputStreamPtr->nAllocLen), encodeContextPtr, - NAL_UNIT_INVALID); + NAL_UNIT_INVALID); queueEntryPtr->startSplicing = outputStreamPtr->nFilledLen; if (sequenceControlSetPtr->staticConfig.pictureTimingSEI) { if (sequenceControlSetPtr->staticConfig.hrdFlag == 1) @@ -700,8 +700,8 @@ void* PacketizationKernel(void *inputPtr) &outputStreamPtr->pBuffer, (EB_U32*) &(outputStreamPtr->nFilledLen), (EB_U32*) &(outputStreamPtr->nAllocLen), - encodeContextPtr, - NAL_UNIT_INVALID); + encodeContextPtr, + NAL_UNIT_INVALID); bufferRate = encodeContextPtr->vbvMaxrate / (sequenceControlSetPtr->staticConfig.frameRate >> 16); queueEntryPtr->fillerBitsSent = 0; @@ -769,7 +769,7 @@ void* PacketizationKernel(void *inputPtr) (EB_U32*) &(outputStreamPtr->nFilledLen), (EB_U32*) &(outputStreamPtr->nAllocLen), ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr, - NAL_UNIT_INVALID); + NAL_UNIT_INVALID); } //Store the buffer in the Queue @@ -868,7 +868,7 @@ void* PacketizationKernel(void *inputPtr) (EB_U32*) &(queueEntryPtr->startSplicing), (EB_U32*) &(outputStreamPtr->nAllocLen), sequenceControlSetPtr->encodeContextPtr, - NAL_UNIT_INVALID); + NAL_UNIT_INVALID); outputStreamPtr->nFilledLen += bufferWrittenBytesCount; } diff --git a/Source/Lib/Codec/EbPacketizationProcess.h b/Source/Lib/Codec/EbPacketizationProcess.h index ced44a311..059aa3134 100644 --- a/Source/Lib/Codec/EbPacketizationProcess.h +++ b/Source/Lib/Codec/EbPacketizationProcess.h @@ -19,7 +19,7 @@ typedef struct EbPPSConfig_s { EB_U8 ppsId; EB_U8 constrainedFlag; - + } EbPPSConfig_t; /************************************** @@ -31,7 +31,7 @@ typedef struct PacketizationContext_s EbFifo_t *rateControlTasksOutputFifoPtr; EbPPSConfig_t *ppsConfig; EbFifo_t *pictureManagerOutputFifoPtr; // to picture-manager - + } PacketizationContext_t; /************************************** @@ -43,8 +43,8 @@ extern EB_ERRORTYPE PacketizationContextCtor( EbFifo_t *rateControlTasksOutputFifoPtr, EbFifo_t *pictureManagerOutputFifoPtr ); - - + + extern void* PacketizationKernel(void *inputPtr); #ifdef __cplusplus } diff --git a/Source/Lib/Codec/EbPacketizationReorderQueue.h b/Source/Lib/Codec/EbPacketizationReorderQueue.h index a92001a86..f1b9a0d5f 100644 --- a/Source/Lib/Codec/EbPacketizationReorderQueue.h +++ b/Source/Lib/Codec/EbPacketizationReorderQueue.h @@ -24,7 +24,7 @@ extern "C" { } PicTimingEntry_t; typedef struct PacketizationReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *outputStreamWrapperPtr; EB_U64 startTimeSeconds; @@ -37,13 +37,13 @@ typedef struct PacketizationReorderEntry_s { EB_U64 fillerBitsSent; EB_U64 fillerBitsFinal; EB_BOOL isUsedAsReferenceFlag; -} PacketizationReorderEntry_t; +} PacketizationReorderEntry_t; -extern EB_ERRORTYPE PacketizationReorderEntryCtor( +extern EB_ERRORTYPE PacketizationReorderEntryCtor( PacketizationReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); - + #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbPictureAnalysisProcess.c b/Source/Lib/Codec/EbPictureAnalysisProcess.c index 0b24a23d6..1dc76ba9b 100644 --- a/Source/Lib/Codec/EbPictureAnalysisProcess.c +++ b/Source/Lib/Codec/EbPictureAnalysisProcess.c @@ -25,17 +25,17 @@ #include "EbComputeMean_SSE2.h" #include "EbCombinedAveragingSAD_Intrinsic_AVX2.h" -#define VARIANCE_PRECISION 16 +#define VARIANCE_PRECISION 16 #define LCU_LOW_VAR_TH 5 #define PIC_LOW_VAR_PERCENTAGE_TH 60 -#define FLAT_MAX_VAR 50 -#define FLAT_MAX_VAR_DECIM (50-00) -#define NOISE_MIN_LEVEL_0 70000//120000 +#define FLAT_MAX_VAR 50 +#define FLAT_MAX_VAR_DECIM (50-00) +#define NOISE_MIN_LEVEL_0 70000//120000 #define NOISE_MIN_LEVEL_DECIM_0 (70000+000000)//(120000+000000) -#define NOISE_MIN_LEVEL_1 120000 -#define NOISE_MIN_LEVEL_DECIM_1 (120000+000000) -#define DENOISER_QP_TH 29 -#define DENOISER_BITRATE_TH 14000000 +#define NOISE_MIN_LEVEL_1 120000 +#define NOISE_MIN_LEVEL_DECIM_1 (120000+000000) +#define DENOISER_QP_TH 29 +#define DENOISER_BITRATE_TH 14000000 #define SAMPLE_THRESHOLD_PRECENT_BORDER_LINE 15 #define SAMPLE_THRESHOLD_PRECENT_TWO_BORDER_LINES 10 @@ -43,60 +43,60 @@ * Picture Analysis Context Constructor ************************************************/ EB_ERRORTYPE PictureAnalysisContextCtor( - EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, - EB_BOOL denoiseFlag, + EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, + EB_BOOL denoiseFlag, PictureAnalysisContext_t **contextDblPtr, EbFifo_t *resourceCoordinationResultsInputFifoPtr, EbFifo_t *pictureAnalysisResultsOutputFifoPtr, - EB_U16 lcuTotalCount) + EB_U16 lcuTotalCount) { - PictureAnalysisContext_t *contextPtr; - EB_MALLOC(PictureAnalysisContext_t*, contextPtr, sizeof(PictureAnalysisContext_t), EB_N_PTR); - *contextDblPtr = contextPtr; + PictureAnalysisContext_t *contextPtr; + EB_MALLOC(PictureAnalysisContext_t*, contextPtr, sizeof(PictureAnalysisContext_t), EB_N_PTR); + *contextDblPtr = contextPtr; - contextPtr->resourceCoordinationResultsInputFifoPtr = resourceCoordinationResultsInputFifoPtr; - contextPtr->pictureAnalysisResultsOutputFifoPtr = pictureAnalysisResultsOutputFifoPtr; + contextPtr->resourceCoordinationResultsInputFifoPtr = resourceCoordinationResultsInputFifoPtr; + contextPtr->pictureAnalysisResultsOutputFifoPtr = pictureAnalysisResultsOutputFifoPtr; - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - if (denoiseFlag == EB_TRUE){ + if (denoiseFlag == EB_TRUE){ - //denoised + //denoised // If 420/422, re-use luma for chroma // If 444, re-use luma for Cr if (inputPictureBufferDescInitData->colorFormat != EB_YUV444) { - inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; + inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; } else { - inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG | PICTURE_BUFFER_DESC_Cb_FLAG; + inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG | PICTURE_BUFFER_DESC_Cb_FLAG; } - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(contextPtr->denoisedPicturePtr), - (EB_PTR)inputPictureBufferDescInitData); + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(contextPtr->denoisedPicturePtr), + (EB_PTR)inputPictureBufferDescInitData); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } if (inputPictureBufferDescInitData->colorFormat != EB_YUV444) { - contextPtr->denoisedPicturePtr->bufferCb = contextPtr->denoisedPicturePtr->bufferY; - contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY + contextPtr->denoisedPicturePtr->chromaSize; + contextPtr->denoisedPicturePtr->bufferCb = contextPtr->denoisedPicturePtr->bufferY; + contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY + contextPtr->denoisedPicturePtr->chromaSize; } else { - contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY; + contextPtr->denoisedPicturePtr->bufferCr = contextPtr->denoisedPicturePtr->bufferY; } - // noise - inputPictureBufferDescInitData->maxHeight = MAX_LCU_SIZE; - inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; + // noise + inputPictureBufferDescInitData->maxHeight = MAX_LCU_SIZE; + inputPictureBufferDescInitData->bufferEnableMask = PICTURE_BUFFER_DESC_Y_FLAG; - return_error = EbPictureBufferDescCtor( - (EB_PTR*)&(contextPtr->noisePicturePtr), - (EB_PTR)inputPictureBufferDescInitData); + return_error = EbPictureBufferDescCtor( + (EB_PTR*)&(contextPtr->noisePicturePtr), + (EB_PTR)inputPictureBufferDescInitData); - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } + } EB_MALLOC(EB_U16**, contextPtr->grad, sizeof(EB_U16*) * lcuTotalCount, EB_N_PTR); for (EB_U16 lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { @@ -104,67 +104,67 @@ EB_ERRORTYPE PictureAnalysisContextCtor( } - return EB_ErrorNone; + return EB_ErrorNone; } static void DownSampleChroma(EbPictureBufferDesc_t* inputPicturePtr, EbPictureBufferDesc_t* outputPicturePtr) { - EB_U32 inputColorFormat = inputPicturePtr->colorFormat; - EB_U16 inputSubWidthCMinus1 = (inputColorFormat == EB_YUV444 ? 1 : 2) - 1; - EB_U16 inputSubHeightCMinus1 = (inputColorFormat >= EB_YUV422 ? 1 : 2) - 1; + EB_U32 inputColorFormat = inputPicturePtr->colorFormat; + EB_U16 inputSubWidthCMinus1 = (inputColorFormat == EB_YUV444 ? 1 : 2) - 1; + EB_U16 inputSubHeightCMinus1 = (inputColorFormat >= EB_YUV422 ? 1 : 2) - 1; - EB_U32 outputColorFormat = outputPicturePtr->colorFormat; - EB_U16 outputSubWidthCMinus1 = (outputColorFormat == EB_YUV444 ? 1 : 2) - 1; - EB_U16 outputSubHeightCMinus1 = (outputColorFormat >= EB_YUV422 ? 1 : 2) - 1; + EB_U32 outputColorFormat = outputPicturePtr->colorFormat; + EB_U16 outputSubWidthCMinus1 = (outputColorFormat == EB_YUV444 ? 1 : 2) - 1; + EB_U16 outputSubHeightCMinus1 = (outputColorFormat >= EB_YUV422 ? 1 : 2) - 1; - EB_U32 strideIn, strideOut; - EB_U32 inputOriginIndex, outputOriginIndex; + EB_U32 strideIn, strideOut; + EB_U32 inputOriginIndex, outputOriginIndex; - EB_U8 *ptrIn; - EB_U8 *ptrOut; + EB_U8 *ptrIn; + EB_U8 *ptrOut; - EB_U32 ii, jj; + EB_U32 ii, jj; - //Cb - { - strideIn = inputPicturePtr->strideCb; - inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + + //Cb + { + strideIn = inputPicturePtr->strideCb; + inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + (inputPicturePtr->originY >> inputSubHeightCMinus1) * inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); - strideOut = outputPicturePtr->strideCb; - outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + + strideOut = outputPicturePtr->strideCb; + outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + (outputPicturePtr->originY >> outputSubHeightCMinus1) * outputPicturePtr->strideCb; - ptrOut = &(outputPicturePtr->bufferCb[outputOriginIndex]); + ptrOut = &(outputPicturePtr->bufferCb[outputOriginIndex]); - for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { - for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { - ptrOut[ii + jj * strideOut] = + for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { + for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { + ptrOut[ii + jj * strideOut] = ptrIn[(ii << (1 - inputSubWidthCMinus1)) + (jj << (1 - inputSubHeightCMinus1)) * strideIn]; - } - } + } + } - } + } - //Cr - { - strideIn = inputPicturePtr->strideCr; - inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + (inputPicturePtr->originY >> inputSubHeightCMinus1) * inputPicturePtr->strideCr; - ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); + //Cr + { + strideIn = inputPicturePtr->strideCr; + inputOriginIndex = (inputPicturePtr->originX >> inputSubWidthCMinus1) + (inputPicturePtr->originY >> inputSubHeightCMinus1) * inputPicturePtr->strideCr; + ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); - strideOut = outputPicturePtr->strideCr; - outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + (outputPicturePtr->originY >> outputSubHeightCMinus1) * outputPicturePtr->strideCr; - ptrOut = &(outputPicturePtr->bufferCr[outputOriginIndex]); + strideOut = outputPicturePtr->strideCr; + outputOriginIndex = (outputPicturePtr->originX >> outputSubWidthCMinus1) + (outputPicturePtr->originY >> outputSubHeightCMinus1) * outputPicturePtr->strideCr; + ptrOut = &(outputPicturePtr->bufferCr[outputOriginIndex]); - for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { - for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { - ptrOut[ii + jj * strideOut] = + for (jj = 0; jj < (EB_U32)(outputPicturePtr->height >> outputSubHeightCMinus1); jj++) { + for (ii = 0; ii < (EB_U32)(outputPicturePtr->width >> outputSubWidthCMinus1); ii++) { + ptrOut[ii + jj * strideOut] = ptrIn[(ii << (1 - inputSubWidthCMinus1)) + (jj << (1 - inputSubHeightCMinus1)) * strideIn]; - } - } - } + } + } + } } /************************************************ @@ -176,30 +176,30 @@ static void DownSampleChroma(EbPictureBufferDesc_t* inputPicturePtr, EbPictureBu * decimates the input ********************************************/ void Decimation2D( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputStride, // input parameter, input stride - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight, // input parameter, input area height - EB_U8 * decimSamples, // output parameter, decimated samples Ptr - EB_U32 decimStride, // input parameter, output stride - EB_U32 decimStep) // input parameter, area height + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputStride, // input parameter, input stride + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight, // input parameter, input area height + EB_U8 * decimSamples, // output parameter, decimated samples Ptr + EB_U32 decimStride, // input parameter, output stride + EB_U32 decimStep) // input parameter, area height { - EB_U32 horizontalIndex; - EB_U32 verticalIndex; + EB_U32 horizontalIndex; + EB_U32 verticalIndex; - for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { - for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { + for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { + for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { - decimSamples[(horizontalIndex >> (decimStep >> 1))] = inputSamples[horizontalIndex]; + decimSamples[(horizontalIndex >> (decimStep >> 1))] = inputSamples[horizontalIndex]; - } - inputSamples += (inputStride << (decimStep >> 1)); - decimSamples += decimStride; - } + } + inputSamples += (inputStride << (decimStep >> 1)); + decimSamples += decimStride; + } - return; + return; } /******************************************** @@ -207,223 +207,223 @@ void Decimation2D( * creates n-bins histogram for the input ********************************************/ static void CalculateHistogram( - EB_U8 * inputSamples, // input parameter, input samples Ptr - EB_U32 inputAreaWidth, // input parameter, input area width - EB_U32 inputAreaHeight, // input parameter, input area height - EB_U32 stride, // input parameter, input stride + EB_U8 * inputSamples, // input parameter, input samples Ptr + EB_U32 inputAreaWidth, // input parameter, input area width + EB_U32 inputAreaHeight, // input parameter, input area height + EB_U32 stride, // input parameter, input stride EB_U8 decimStep, // input parameter, area height - EB_U32 *histogram, // output parameter, output histogram - EB_U64 *sum) + EB_U32 *histogram, // output parameter, output histogram + EB_U64 *sum) { - EB_U32 horizontalIndex; - EB_U32 verticalIndex; - *sum = 0; + EB_U32 horizontalIndex; + EB_U32 verticalIndex; + *sum = 0; - for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { - for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { - ++(histogram[inputSamples[horizontalIndex]]); - *sum += inputSamples[horizontalIndex]; - } + for (verticalIndex = 0; verticalIndex < inputAreaHeight; verticalIndex += decimStep) { + for (horizontalIndex = 0; horizontalIndex < inputAreaWidth; horizontalIndex += decimStep) { + ++(histogram[inputSamples[horizontalIndex]]); + *sum += inputSamples[horizontalIndex]; + } inputSamples += (stride << (decimStep >> 1)); - } + } - return; + return; } static EB_U64 ComputeVariance32x32( - EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U64 *variance8x8) + EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture + EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U64 *variance8x8) { - EB_U32 blockIndex; - - EB_U64 meanOf8x8Blocks[16]; - EB_U64 meanOf8x8SquaredValuesBlocks[16]; - - EB_U64 meanOf16x16Blocks[4]; - EB_U64 meanOf16x16SquaredValuesBlocks[4]; + EB_U32 blockIndex; - EB_U64 meanOf32x32Blocks; - EB_U64 meanOf32x32SquaredValuesBlocks; - ///////////////////////////////////////////// - // (0,0) - blockIndex = inputLumaOriginIndex; + EB_U64 meanOf8x8Blocks[16]; + EB_U64 meanOf8x8SquaredValuesBlocks[16]; - meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + EB_U64 meanOf16x16Blocks[4]; + EB_U64 meanOf16x16SquaredValuesBlocks[4]; - // (0,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + EB_U64 meanOf32x32Blocks; + EB_U64 meanOf32x32SquaredValuesBlocks; + ///////////////////////////////////////////// + // (0,0) + blockIndex = inputLumaOriginIndex; - // (0,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (0,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + + // (0,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (0,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (0,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); - meanOf8x8Blocks[4] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[4] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); + meanOf8x8Blocks[4] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[4] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[5] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[5] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[5] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[5] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[6] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[6] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[6] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[6] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[7] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[7] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[7] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[7] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (2,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 4); - meanOf8x8Blocks[8] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[8] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (2,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 4); + meanOf8x8Blocks[8] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[8] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (2,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[9] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[9] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (2,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[9] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[9] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (2,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[10] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[10] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (2,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[10] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[10] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (2,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[11] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[11] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (2,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[11] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[11] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (3,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3) + (inputPaddedPicturePtr->strideY << 4); - meanOf8x8Blocks[12] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[12] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (3,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3) + (inputPaddedPicturePtr->strideY << 4); + meanOf8x8Blocks[12] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[12] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (3,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[13] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[13] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (3,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[13] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[13] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (3,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[14] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[14] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (3,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[14] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[14] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (3,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[15] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[15] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (3,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[15] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[15] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - ///////////////////////////////////////////// + ///////////////////////////////////////////// - variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); - variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); - variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); - variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); - variance8x8[4] = meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4]); - variance8x8[5] = meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5]); - variance8x8[6] = meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6]); - variance8x8[7] = meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7]); - variance8x8[8] = meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8]); - variance8x8[9] = meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9]); - variance8x8[10] = meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10]); - variance8x8[11] = meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11]); - variance8x8[12] = meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12]); - variance8x8[13] = meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13]); - variance8x8[14] = meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14]); - variance8x8[15] = meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15]); + variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); + variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); + variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); + variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); + variance8x8[4] = meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4]); + variance8x8[5] = meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5]); + variance8x8[6] = meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6]); + variance8x8[7] = meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7]); + variance8x8[8] = meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8]); + variance8x8[9] = meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9]); + variance8x8[10] = meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10]); + variance8x8[11] = meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11]); + variance8x8[12] = meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12]); + variance8x8[13] = meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13]); + variance8x8[14] = meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14]); + variance8x8[15] = meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15]); - // 16x16 - meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; - meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; - meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; - meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; + // 16x16 + meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; + meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; + meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; + meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; - meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; - meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; - meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; - meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; + meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; + meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; + meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; + meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; - // 32x32 - meanOf32x32Blocks = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[2] + meanOf16x16Blocks[3]) >> 2; + // 32x32 + meanOf32x32Blocks = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[2] + meanOf16x16Blocks[3]) >> 2; - meanOf32x32SquaredValuesBlocks = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3]) >> 2; + meanOf32x32SquaredValuesBlocks = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3]) >> 2; - return (meanOf32x32SquaredValuesBlocks - (meanOf32x32Blocks * meanOf32x32Blocks)); + return (meanOf32x32SquaredValuesBlocks - (meanOf32x32Blocks * meanOf32x32Blocks)); } static EB_U64 ComputeVariance16x16( - EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U64 *variance8x8) + EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture + EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U64 *variance8x8) { - EB_U32 blockIndex; + EB_U32 blockIndex; - EB_U64 meanOf8x8Blocks[4]; - EB_U64 meanOf8x8SquaredValuesBlocks[4]; + EB_U64 meanOf8x8Blocks[4]; + EB_U64 meanOf8x8SquaredValuesBlocks[4]; - EB_U64 meanOf16x16Blocks; - EB_U64 meanOf16x16SquaredValuesBlocks; + EB_U64 meanOf16x16Blocks; + EB_U64 meanOf16x16SquaredValuesBlocks; - // (0,0) - blockIndex = inputLumaOriginIndex; + // (0,0) + blockIndex = inputLumaOriginIndex; - meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8Blocks[0] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[0] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (0,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (0,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[1] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[1] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,0) - blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); - meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,0) + blockIndex = inputLumaOriginIndex + (inputPaddedPicturePtr->strideY << 3); + meanOf8x8Blocks[2] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[2] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - // (1,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + // (1,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[3] = ComputeMeanFunc[0][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); + meanOf8x8SquaredValuesBlocks[3] = ComputeMeanFunc[1][!!(ASM_TYPES & AVX2_MASK)](&(inputPaddedPicturePtr->bufferY[blockIndex]), inputPaddedPicturePtr->strideY, 8, 8); - variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); - variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); - variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); - variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); + variance8x8[0] = meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0]); + variance8x8[1] = meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1]); + variance8x8[2] = meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2]); + variance8x8[3] = meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3]); - // 16x16 - meanOf16x16Blocks = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[2] + meanOf8x8Blocks[3]) >> 2; - meanOf16x16SquaredValuesBlocks = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3]) >> 2; + // 16x16 + meanOf16x16Blocks = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[2] + meanOf8x8Blocks[3]) >> 2; + meanOf16x16SquaredValuesBlocks = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3]) >> 2; - return (meanOf16x16SquaredValuesBlocks - (meanOf16x16Blocks * meanOf16x16Blocks)); + return (meanOf16x16SquaredValuesBlocks - (meanOf16x16Blocks * meanOf16x16Blocks)); } /******************************************* @@ -435,28 +435,28 @@ just returns the 64x64 data point *******************************************/ static EB_U64 ComputeVariance64x64( EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U64 *variance32x32) + EB_U32 inputLumaOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U64 *variance32x32) { - EB_U32 blockIndex; + EB_U32 blockIndex; - EB_U64 meanOf8x8Blocks[64]; - EB_U64 meanOf8x8SquaredValuesBlocks[64]; + EB_U64 meanOf8x8Blocks[64]; + EB_U64 meanOf8x8SquaredValuesBlocks[64]; - EB_U64 meanOf16x16Blocks[16]; - EB_U64 meanOf16x16SquaredValuesBlocks[16]; + EB_U64 meanOf16x16Blocks[16]; + EB_U64 meanOf16x16SquaredValuesBlocks[16]; - EB_U64 meanOf32x32Blocks[4]; - EB_U64 meanOf32x32SquaredValuesBlocks[4]; + EB_U64 meanOf32x32Blocks[4]; + EB_U64 meanOf32x32SquaredValuesBlocks[4]; - EB_U64 meanOf64x64Blocks; - EB_U64 meanOf64x64SquaredValuesBlocks; + EB_U64 meanOf64x64Blocks; + EB_U64 meanOf64x64SquaredValuesBlocks; - // (0,0) - blockIndex = inputLumaOriginIndex; - const EB_U16 strideY = inputPaddedPicturePtr->strideY; + // (0,0) + blockIndex = inputLumaOriginIndex; + const EB_U16 strideY = inputPaddedPicturePtr->strideY; if (!!(ASM_TYPES & AVX2_MASK)) { @@ -561,460 +561,460 @@ static EB_U64 ComputeVariance64x64( } else{ meanOf8x8Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[0] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[1] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[2] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[3] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[4] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[5] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[6] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (0,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[7] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,0) - blockIndex = inputLumaOriginIndex + (strideY << 3); - meanOf8x8Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[8] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[9] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[10] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[11] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[12] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[13] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[14] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (1,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[15] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,0) - blockIndex = inputLumaOriginIndex + (strideY << 4); - meanOf8x8Blocks[16] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[16] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[17] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[17] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[18] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[18] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[19] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[19] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - /// (2,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[20] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[20] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[21] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[21] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[22] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[22] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (2,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[23] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[23] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,0) - blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4); - meanOf8x8Blocks[24] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[24] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[25] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[25] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[26] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[26] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[27] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[27] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[28] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[28] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[29] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[29] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[30] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[30] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (3,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[31] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[31] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,0) - blockIndex = inputLumaOriginIndex + (strideY << 5); - meanOf8x8Blocks[32] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[32] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[33] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[33] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[34] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[34] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[35] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[35] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[36] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[36] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[37] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[37] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[38] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[38] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (4,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[39] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[39] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,0) - blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 5); - meanOf8x8Blocks[40] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[40] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[41] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[41] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[42] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[42] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[43] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[43] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[44] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[44] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[45] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[45] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[46] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[46] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (5,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[47] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[47] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,0) - blockIndex = inputLumaOriginIndex + (strideY << 4) + (strideY << 5); - meanOf8x8Blocks[48] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[48] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[49] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[49] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[50] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[50] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[51] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[51] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[52] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[52] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[53] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[53] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[54] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[54] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (6,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[55] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[55] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,0) - blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4) + (strideY << 5); - meanOf8x8Blocks[56] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[56] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,1) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[57] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[57] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,2) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[58] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[58] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,3) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[59] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[59] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,4) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[60] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[60] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,5) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[61] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[61] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,6) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[62] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[62] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - - // (7,7) - blockIndex = blockIndex + 8; - meanOf8x8Blocks[63] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); - meanOf8x8SquaredValuesBlocks[63] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[0] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[1] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[2] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[3] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[4] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[5] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[6] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (0,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[7] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,0) + blockIndex = inputLumaOriginIndex + (strideY << 3); + meanOf8x8Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[8] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[9] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[10] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[11] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[12] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[13] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[14] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (1,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[15] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,0) + blockIndex = inputLumaOriginIndex + (strideY << 4); + meanOf8x8Blocks[16] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[16] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[17] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[17] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[18] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[18] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[19] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[19] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + /// (2,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[20] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[20] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[21] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[21] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[22] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[22] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (2,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[23] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[23] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,0) + blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4); + meanOf8x8Blocks[24] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[24] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[25] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[25] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[26] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[26] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[27] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[27] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[28] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[28] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[29] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[29] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[30] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[30] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (3,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[31] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[31] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,0) + blockIndex = inputLumaOriginIndex + (strideY << 5); + meanOf8x8Blocks[32] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[32] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[33] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[33] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[34] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[34] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[35] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[35] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[36] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[36] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[37] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[37] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[38] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[38] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (4,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[39] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[39] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,0) + blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 5); + meanOf8x8Blocks[40] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[40] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[41] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[41] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[42] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[42] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[43] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[43] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[44] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[44] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[45] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[45] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[46] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[46] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (5,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[47] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[47] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,0) + blockIndex = inputLumaOriginIndex + (strideY << 4) + (strideY << 5); + meanOf8x8Blocks[48] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[48] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[49] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[49] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[50] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[50] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[51] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[51] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[52] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[52] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[53] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[53] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[54] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[54] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (6,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[55] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[55] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,0) + blockIndex = inputLumaOriginIndex + (strideY << 3) + (strideY << 4) + (strideY << 5); + meanOf8x8Blocks[56] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[56] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,1) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[57] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[57] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,2) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[58] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[58] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,3) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[59] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[59] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,4) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[60] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[60] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,5) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[61] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[61] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,6) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[62] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[62] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + + // (7,7) + blockIndex = blockIndex + 8; + meanOf8x8Blocks[63] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); + meanOf8x8SquaredValuesBlocks[63] = ComputeSubdMeanOfSquaredValues8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferY[blockIndex]), strideY); } - // 16x16 - meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; - meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; - meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; - meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; + // 16x16 + meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; + meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; + meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; + meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; - meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; - meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; - meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; - meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; + meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; + meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; + meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; + meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; - meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; - meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; - meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; - meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; + meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; + meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; + meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; + meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; - meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; - meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; - meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; - meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; + meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; + meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; + meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; + meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; - meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; - meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; - meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; - meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; + meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; + meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; + meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; + meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; - meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; - meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; - meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; - meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; + meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; + meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; + meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; + meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; - meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; - meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; - meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; - meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; + meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; + meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; + meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; + meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; - meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; - meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; - meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; - meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; + meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; + meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; + meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; + meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; - // 32x32 - meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; - meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; - meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; - meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; + // 32x32 + meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; + meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; + meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; + meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; - meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; - meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; - meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; - meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; + meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; + meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; + meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; + meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; - variance32x32[0] = meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0]); - variance32x32[1] = meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1]); - variance32x32[2] = meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2]); - variance32x32[3] = meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3]); + variance32x32[0] = meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0]); + variance32x32[1] = meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1]); + variance32x32[2] = meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2]); + variance32x32[3] = meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3]); - // 64x64 - meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; - meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; + // 64x64 + meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; + meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; - return (meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)); + return (meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)); } static EB_U8 getFilteredTypes(EB_U8 *ptr, - EB_U32 stride, - EB_U8 EbHevcFilterType) + EB_U32 stride, + EB_U8 EbHevcFilterType) { - EB_U8 *p = ptr - 1 - stride; + EB_U8 *p = ptr - 1 - stride; - EB_U32 a = 0; + EB_U32 a = 0; - if (EbHevcFilterType == 0){ + if (EbHevcFilterType == 0){ - //Luma - a = (p[1] + - p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + - p[1 + 2 * stride]) / 8; + //Luma + a = (p[1] + + p[0 + stride] + 4 * p[1 + stride] + p[2 + stride] + + p[1 + 2 * stride]) / 8; - } - else if (EbHevcFilterType == 1){ + } + else if (EbHevcFilterType == 1){ a = ( 2 * p[1] + - 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - 2 * p[1 + 2 * stride] ); + 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + 2 * p[1 + 2 * stride] ); a = (( (EB_U32)((a *2730) >> 14) + 1) >> 1) & 0xFFFF; //fixed point version of a=a/12 to mimic x86 instruction _mm256_mulhrs_epi16; //a= (a*2730)>>15; - } - else if (EbHevcFilterType == 2){ + } + else if (EbHevcFilterType == 2){ - a = (4 * p[1] + - 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + - 4 * p[1 + 2 * stride]) / 20; - } - else if (EbHevcFilterType == 3){ + a = (4 * p[1] + + 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + + 4 * p[1 + 2 * stride]) / 20; + } + else if (EbHevcFilterType == 3){ - a = (1 * p[0] + 1 * p[1] + 1 * p[2] + - 1 * p[0 + stride] + 4 * p[1 + stride] + 1 * p[2 + stride] + - 1 * p[0 + 2 * stride] + 1 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 12; + a = (1 * p[0] + 1 * p[1] + 1 * p[2] + + 1 * p[0 + stride] + 4 * p[1 + stride] + 1 * p[2 + stride] + + 1 * p[0 + 2 * stride] + 1 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 12; - } - else if (EbHevcFilterType == 4){ + } + else if (EbHevcFilterType == 4){ - //gaussian matrix(Chroma) - a = (1 * p[0] + 2 * p[1] + 1 * p[2] + - 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; + //gaussian matrix(Chroma) + a = (1 * p[0] + 2 * p[1] + 1 * p[2] + + 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + 1 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 1 * p[2 + 2 * stride]) / 16; - } - else if (EbHevcFilterType == 5){ + } + else if (EbHevcFilterType == 5){ - a = (2 * p[0] + 2 * p[1] + 2 * p[2] + - 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + - 2 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 2 * p[2 + 2 * stride]) / 20; + a = (2 * p[0] + 2 * p[1] + 2 * p[2] + + 2 * p[0 + stride] + 4 * p[1 + stride] + 2 * p[2 + stride] + + 2 * p[0 + 2 * stride] + 2 * p[1 + 2 * stride] + 2 * p[2 + 2 * stride]) / 20; - } - else if (EbHevcFilterType == 6){ + } + else if (EbHevcFilterType == 6){ - a = (4 * p[0] + 4 * p[1] + 4 * p[2] + - 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + - 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; + a = (4 * p[0] + 4 * p[1] + 4 * p[2] + + 4 * p[0 + stride] + 4 * p[1 + stride] + 4 * p[2 + stride] + + 4 * p[0 + 2 * stride] + 4 * p[1 + 2 * stride] + 4 * p[2 + 2 * stride]) / 36; - } + } - return (EB_U8)CLIP3EQ(0, 255, a); + return (EB_U8)CLIP3EQ(0, 255, a); } @@ -1023,55 +1023,55 @@ static EB_U8 getFilteredTypes(EB_U8 *ptr, * strong filter Luma. *******************************************/ void noiseExtractLumaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 strideOut; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY)* inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + } - } - } - } + } + } + } } @@ -1080,88 +1080,88 @@ void noiseExtractLumaStrong( * strong filter chroma. *******************************************/ void noiseExtractChromaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 strideOut; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - //Cb - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + //Cb + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCb; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + strideIn = inputPicturePtr->strideCb; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCb; + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCb; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } - //Cr - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + //Cr + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCr; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; - ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); + strideIn = inputPicturePtr->strideCr; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * inputPicturePtr->strideCr; + ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; - strideOut = denoisedPicturePtr->strideCr; - ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY) * denoisedPicturePtr->strideCr; + strideOut = denoisedPicturePtr->strideCr; + ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 6); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } } /******************************************* @@ -1169,90 +1169,90 @@ void noiseExtractChromaStrong( * weak filter chroma. *******************************************/ void noiseExtractChromaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U32 strideOut; + EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - //Cb - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; + //Cb + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCb; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCb; - ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); + strideIn = inputPicturePtr->strideCb; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCb; + ptrIn = &(inputPicturePtr->bufferCb[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCb; - strideOut = denoisedPicturePtr->strideCb; - ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCb; + strideOut = denoisedPicturePtr->strideCb; + ptrDenoised = &(denoisedPicturePtr->bufferCb[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } - //Cr - { - picHeight = inputPicturePtr->height >> subHeightCMinus1; - picWidth = inputPicturePtr->width >> subWidthCMinus1; - lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); + //Cr + { + picHeight = inputPicturePtr->height >> subHeightCMinus1; + picWidth = inputPicturePtr->width >> subWidthCMinus1; + lcuHeight = MIN(MAX_LCU_SIZE >> subHeightCMinus1, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideCr; - inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCr; - ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); + strideIn = inputPicturePtr->strideCr; + inputOriginIndex = (inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* inputPicturePtr->strideCr; + ptrIn = &(inputPicturePtr->bufferCr[inputOriginIndex]); - inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCr; - strideOut = denoisedPicturePtr->strideCr; - ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); + inputOriginIndexPad = (denoisedPicturePtr->originX >> subWidthCMinus1) + ((denoisedPicturePtr->originY >> subHeightCMinus1) + lcuOriginY)* denoisedPicturePtr->strideCr; + strideOut = denoisedPicturePtr->strideCr; + ptrDenoised = &(denoisedPicturePtr->bufferCr[inputOriginIndexPad]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - } + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || (lcuOriginY + lcuHeight) < picHeight) && ii > 0 && ii < picWidth - 1){ + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 4); + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + } - } - } - } + } + } + } } @@ -1261,188 +1261,188 @@ void noiseExtractChromaWeak( * weak filter Luma and store noise. *******************************************/ void noiseExtractLumaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U8 *ptrNoise; - EB_U32 strideOut; + EB_U8 *ptrNoise; + EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + inputOriginIndexPad = denoisedPicturePtr->originX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + noiseOriginIndex = noisePicturePtr->originX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < picWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < picWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && ii>0 && ii < picWidth - 1){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); - ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); + ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } - } - } - } + } + } + } } void noiseExtractLumaWeakLcu( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY - , EB_U32 lcuOriginX - ) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY + , EB_U32 lcuOriginX + ) { - EB_U32 ii, jj; - EB_U32 picHeight, lcuHeight; - EB_U32 picWidth, lcuWidth; - EB_U32 inputOriginIndex; - EB_U32 inputOriginIndexPad; - EB_U32 noiseOriginIndex; + EB_U32 ii, jj; + EB_U32 picHeight, lcuHeight; + EB_U32 picWidth, lcuWidth; + EB_U32 inputOriginIndex; + EB_U32 inputOriginIndexPad; + EB_U32 noiseOriginIndex; - EB_U8 *ptrIn; - EB_U32 strideIn; - EB_U8 *ptrDenoised; + EB_U8 *ptrIn; + EB_U32 strideIn; + EB_U8 *ptrDenoised; - EB_U8 *ptrNoise; - EB_U32 strideOut; + EB_U8 *ptrNoise; + EB_U32 strideOut; - EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; + EB_U32 idx = (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) ? lcuOriginX : 0; - //Luma - { - picHeight = inputPicturePtr->height; - picWidth = inputPicturePtr->width; - lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); - lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); + //Luma + { + picHeight = inputPicturePtr->height; + picWidth = inputPicturePtr->width; + lcuHeight = MIN(MAX_LCU_SIZE, picHeight - lcuOriginY); + lcuWidth = MIN(MAX_LCU_SIZE, picWidth - lcuOriginX); - strideIn = inputPicturePtr->strideY; - inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); + strideIn = inputPicturePtr->strideY; + inputOriginIndex = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + ptrIn = &(inputPicturePtr->bufferY[inputOriginIndex]); - inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - strideOut = denoisedPicturePtr->strideY; - ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); + inputOriginIndexPad = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + strideOut = denoisedPicturePtr->strideY; + ptrDenoised = &(denoisedPicturePtr->bufferY[inputOriginIndexPad]); - noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; - ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); + noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; + ptrNoise = &(noisePicturePtr->bufferY[noiseOriginIndex]); - for (jj = 0; jj < lcuHeight; jj++){ - for (ii = idx; ii < lcuWidth; ii++){ + for (jj = 0; jj < lcuHeight; jj++){ + for (ii = idx; ii < lcuWidth; ii++){ - if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && (ii>0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1/* & ii < lcuWidth - 1*/){ + if ((jj>0 || lcuOriginY > 0) && (jj < lcuHeight - 1 || lcuOriginY + lcuHeight < picHeight) && (ii>0 || lcuOriginX>0) && (ii + lcuOriginX) < picWidth - 1/* & ii < lcuWidth - 1*/){ - ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); - ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); + ptrDenoised[ii + jj*strideOut] = getFilteredTypes(&ptrIn[ii + jj*strideIn], strideIn, 0); + ptrNoise[ii + jj*strideOut] = CLIP3EQ(0, 255, ptrIn[ii + jj*strideIn] - ptrDenoised[ii + jj*strideOut]); - } - else{ - ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; - ptrNoise[ii + jj*strideOut] = 0; - } + } + else{ + ptrDenoised[ii + jj*strideOut] = ptrIn[ii + jj*strideIn]; + ptrNoise[ii + jj*strideOut] = 0; + } - } - } - } + } + } + } } static EB_ERRORTYPE ZeroOutChromaBlockMean( - PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr - EB_U32 lcuCodingOrder // input parameter, LCU address - ) + PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr + EB_U32 lcuCodingOrder // input parameter, LCU address + ) { - EB_ERRORTYPE return_error = EB_ErrorNone; - // 16x16 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; - - // 32x32 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; - - // 64x64 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + // 16x16 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = 0; + + // 32x32 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = 0; + + // 64x64 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = 0; + + return return_error; } @@ -1451,196 +1451,196 @@ static EB_ERRORTYPE ZeroOutChromaBlockMean( * computes the chroma block mean for 64x64, 32x32 and 16x16 CUs inside the tree block *******************************************/ static EB_ERRORTYPE ComputeChromaBlockMean( - PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr - EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture - EB_U32 lcuCodingOrder, // input parameter, LCU address - EB_U32 inputCbOriginIndex, // input parameter, LCU index, used to point to source/reference samples - EB_U32 inputCrOriginIndex) // input parameter, LCU index, used to point to source/reference samples + PictureParentControlSet_t *pictureControlSetPtr, // input parameter, Picture Control Set Ptr + EbPictureBufferDesc_t *inputPaddedPicturePtr, // input parameter, Input Padded Picture + EB_U32 lcuCodingOrder, // input parameter, LCU address + EB_U32 inputCbOriginIndex, // input parameter, LCU index, used to point to source/reference samples + EB_U32 inputCrOriginIndex) // input parameter, LCU index, used to point to source/reference samples { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 cbBlockIndex, crBlockIndex; - - EB_U64 cbMeanOf16x16Blocks[16]; - EB_U64 crMeanOf16x16Blocks[16]; - - EB_U64 cbMeanOf32x32Blocks[4]; - EB_U64 crMeanOf32x32Blocks[4]; - - EB_U64 cbMeanOf64x64Blocks; - EB_U64 crMeanOf64x64Blocks; - - - // (0,0) 16x16 block - cbBlockIndex = inputCbOriginIndex; - crBlockIndex = inputCrOriginIndex; - - const EB_U16 strideCb = inputPaddedPicturePtr->strideCb; - const EB_U16 strideCr = inputPaddedPicturePtr->strideCr; - - cbMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (0,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (0,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (0,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,0) - cbBlockIndex = inputCbOriginIndex + (strideCb << 3); - crBlockIndex = inputCrOriginIndex + (strideCr << 3); - cbMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (1,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,0) - cbBlockIndex = inputCbOriginIndex + (strideCb << 4); - crBlockIndex = inputCrOriginIndex + (strideCr << 4); - cbMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (2,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,0) - cbBlockIndex = inputCbOriginIndex + (strideCb * 24); - crBlockIndex = inputCrOriginIndex + (strideCr * 24); - cbMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,1) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,2) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - // (3,3) - cbBlockIndex = cbBlockIndex + 8; - crBlockIndex = crBlockIndex + 8; - cbMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); - crMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); - - - // 32x32 - cbMeanOf32x32Blocks[0] = (cbMeanOf16x16Blocks[0] + cbMeanOf16x16Blocks[1] + cbMeanOf16x16Blocks[4] + cbMeanOf16x16Blocks[5]) >> 2; - crMeanOf32x32Blocks[0] = (crMeanOf16x16Blocks[0] + crMeanOf16x16Blocks[1] + crMeanOf16x16Blocks[4] + crMeanOf16x16Blocks[5]) >> 2; - - cbMeanOf32x32Blocks[1] = (cbMeanOf16x16Blocks[2] + cbMeanOf16x16Blocks[3] + cbMeanOf16x16Blocks[6] + cbMeanOf16x16Blocks[7]) >> 2; - crMeanOf32x32Blocks[1] = (crMeanOf16x16Blocks[2] + crMeanOf16x16Blocks[3] + crMeanOf16x16Blocks[6] + crMeanOf16x16Blocks[7]) >> 2; - - - cbMeanOf32x32Blocks[2] = (cbMeanOf16x16Blocks[8] + cbMeanOf16x16Blocks[9] + cbMeanOf16x16Blocks[12] + cbMeanOf16x16Blocks[13]) >> 2; - crMeanOf32x32Blocks[2] = (crMeanOf16x16Blocks[8] + crMeanOf16x16Blocks[9] + crMeanOf16x16Blocks[12] + crMeanOf16x16Blocks[13]) >> 2; - - cbMeanOf32x32Blocks[3] = (cbMeanOf16x16Blocks[10] + cbMeanOf16x16Blocks[11] + cbMeanOf16x16Blocks[14] + cbMeanOf16x16Blocks[15]) >> 2; - crMeanOf32x32Blocks[3] = (crMeanOf16x16Blocks[10] + crMeanOf16x16Blocks[11] + crMeanOf16x16Blocks[14] + crMeanOf16x16Blocks[15]) >> 2; - - // 64x64 - cbMeanOf64x64Blocks = (cbMeanOf32x32Blocks[0] + cbMeanOf32x32Blocks[1] + cbMeanOf32x32Blocks[3] + cbMeanOf32x32Blocks[3]) >> 2; - crMeanOf64x64Blocks = (crMeanOf32x32Blocks[0] + crMeanOf32x32Blocks[1] + crMeanOf32x32Blocks[3] + crMeanOf32x32Blocks[3]) >> 2; - // 16x16 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (cbMeanOf16x16Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (cbMeanOf16x16Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (cbMeanOf16x16Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (cbMeanOf16x16Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (cbMeanOf16x16Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (cbMeanOf16x16Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (cbMeanOf16x16Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (cbMeanOf16x16Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (cbMeanOf16x16Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (cbMeanOf16x16Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (cbMeanOf16x16Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (cbMeanOf16x16Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (cbMeanOf16x16Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (cbMeanOf16x16Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (cbMeanOf16x16Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (cbMeanOf16x16Blocks[15] >> MEAN_PRECISION); - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (crMeanOf16x16Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (crMeanOf16x16Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (crMeanOf16x16Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (crMeanOf16x16Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (crMeanOf16x16Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (crMeanOf16x16Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (crMeanOf16x16Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (crMeanOf16x16Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (crMeanOf16x16Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (crMeanOf16x16Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (crMeanOf16x16Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (crMeanOf16x16Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (crMeanOf16x16Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (crMeanOf16x16Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (crMeanOf16x16Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (crMeanOf16x16Blocks[15] >> MEAN_PRECISION); - - // 32x32 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8) (cbMeanOf32x32Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8) (cbMeanOf32x32Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8) (cbMeanOf32x32Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8) (cbMeanOf32x32Blocks[3] >> MEAN_PRECISION); - - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(crMeanOf32x32Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(crMeanOf32x32Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(crMeanOf32x32Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(crMeanOf32x32Blocks[3] >> MEAN_PRECISION); - - // 64x64 mean - pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (cbMeanOf64x64Blocks >> MEAN_PRECISION); - pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (crMeanOf64x64Blocks >> MEAN_PRECISION); - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 cbBlockIndex, crBlockIndex; + + EB_U64 cbMeanOf16x16Blocks[16]; + EB_U64 crMeanOf16x16Blocks[16]; + + EB_U64 cbMeanOf32x32Blocks[4]; + EB_U64 crMeanOf32x32Blocks[4]; + + EB_U64 cbMeanOf64x64Blocks; + EB_U64 crMeanOf64x64Blocks; + + + // (0,0) 16x16 block + cbBlockIndex = inputCbOriginIndex; + crBlockIndex = inputCrOriginIndex; + + const EB_U16 strideCb = inputPaddedPicturePtr->strideCb; + const EB_U16 strideCr = inputPaddedPicturePtr->strideCr; + + cbMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[0] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (0,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[1] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (0,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[2] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (0,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[3] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,0) + cbBlockIndex = inputCbOriginIndex + (strideCb << 3); + crBlockIndex = inputCrOriginIndex + (strideCr << 3); + cbMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[4] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[5] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[6] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (1,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[7] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,0) + cbBlockIndex = inputCbOriginIndex + (strideCb << 4); + crBlockIndex = inputCrOriginIndex + (strideCr << 4); + cbMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[8] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[9] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[10] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (2,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[11] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,0) + cbBlockIndex = inputCbOriginIndex + (strideCb * 24); + crBlockIndex = inputCrOriginIndex + (strideCr * 24); + cbMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[12] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,1) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[13] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,2) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[14] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + // (3,3) + cbBlockIndex = cbBlockIndex + 8; + crBlockIndex = crBlockIndex + 8; + cbMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCb[cbBlockIndex]), strideCb); + crMeanOf16x16Blocks[15] = ComputeSubMean8x8_SSE2_INTRIN(&(inputPaddedPicturePtr->bufferCr[crBlockIndex]), strideCr); + + + // 32x32 + cbMeanOf32x32Blocks[0] = (cbMeanOf16x16Blocks[0] + cbMeanOf16x16Blocks[1] + cbMeanOf16x16Blocks[4] + cbMeanOf16x16Blocks[5]) >> 2; + crMeanOf32x32Blocks[0] = (crMeanOf16x16Blocks[0] + crMeanOf16x16Blocks[1] + crMeanOf16x16Blocks[4] + crMeanOf16x16Blocks[5]) >> 2; + + cbMeanOf32x32Blocks[1] = (cbMeanOf16x16Blocks[2] + cbMeanOf16x16Blocks[3] + cbMeanOf16x16Blocks[6] + cbMeanOf16x16Blocks[7]) >> 2; + crMeanOf32x32Blocks[1] = (crMeanOf16x16Blocks[2] + crMeanOf16x16Blocks[3] + crMeanOf16x16Blocks[6] + crMeanOf16x16Blocks[7]) >> 2; + + + cbMeanOf32x32Blocks[2] = (cbMeanOf16x16Blocks[8] + cbMeanOf16x16Blocks[9] + cbMeanOf16x16Blocks[12] + cbMeanOf16x16Blocks[13]) >> 2; + crMeanOf32x32Blocks[2] = (crMeanOf16x16Blocks[8] + crMeanOf16x16Blocks[9] + crMeanOf16x16Blocks[12] + crMeanOf16x16Blocks[13]) >> 2; + + cbMeanOf32x32Blocks[3] = (cbMeanOf16x16Blocks[10] + cbMeanOf16x16Blocks[11] + cbMeanOf16x16Blocks[14] + cbMeanOf16x16Blocks[15]) >> 2; + crMeanOf32x32Blocks[3] = (crMeanOf16x16Blocks[10] + crMeanOf16x16Blocks[11] + crMeanOf16x16Blocks[14] + crMeanOf16x16Blocks[15]) >> 2; + + // 64x64 + cbMeanOf64x64Blocks = (cbMeanOf32x32Blocks[0] + cbMeanOf32x32Blocks[1] + cbMeanOf32x32Blocks[3] + cbMeanOf32x32Blocks[3]) >> 2; + crMeanOf64x64Blocks = (crMeanOf32x32Blocks[0] + crMeanOf32x32Blocks[1] + crMeanOf32x32Blocks[3] + crMeanOf32x32Blocks[3]) >> 2; + // 16x16 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (cbMeanOf16x16Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (cbMeanOf16x16Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (cbMeanOf16x16Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (cbMeanOf16x16Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (cbMeanOf16x16Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (cbMeanOf16x16Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (cbMeanOf16x16Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (cbMeanOf16x16Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (cbMeanOf16x16Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (cbMeanOf16x16Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (cbMeanOf16x16Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (cbMeanOf16x16Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (cbMeanOf16x16Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (cbMeanOf16x16Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (cbMeanOf16x16Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (cbMeanOf16x16Blocks[15] >> MEAN_PRECISION); + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_0] = (EB_U8) (crMeanOf16x16Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_1] = (EB_U8) (crMeanOf16x16Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_2] = (EB_U8) (crMeanOf16x16Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_3] = (EB_U8) (crMeanOf16x16Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_4] = (EB_U8) (crMeanOf16x16Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_5] = (EB_U8) (crMeanOf16x16Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_6] = (EB_U8) (crMeanOf16x16Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_7] = (EB_U8) (crMeanOf16x16Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_8] = (EB_U8) (crMeanOf16x16Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_9] = (EB_U8) (crMeanOf16x16Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_10] = (EB_U8) (crMeanOf16x16Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_11] = (EB_U8) (crMeanOf16x16Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_12] = (EB_U8) (crMeanOf16x16Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_13] = (EB_U8) (crMeanOf16x16Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_14] = (EB_U8) (crMeanOf16x16Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_16x16_15] = (EB_U8) (crMeanOf16x16Blocks[15] >> MEAN_PRECISION); + + // 32x32 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8) (cbMeanOf32x32Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8) (cbMeanOf32x32Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8) (cbMeanOf32x32Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8) (cbMeanOf32x32Blocks[3] >> MEAN_PRECISION); + + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(crMeanOf32x32Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(crMeanOf32x32Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(crMeanOf32x32Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(crMeanOf32x32Blocks[3] >> MEAN_PRECISION); + + // 64x64 mean + pictureControlSetPtr->cbMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (cbMeanOf64x64Blocks >> MEAN_PRECISION); + pictureControlSetPtr->crMean[lcuCodingOrder][ME_TIER_ZERO_PU_64x64] = (EB_U8) (crMeanOf64x64Blocks >> MEAN_PRECISION); + + return return_error; } @@ -1671,15 +1671,15 @@ static EB_ERRORTYPE ComputeBlockMeanComputeVariance( EB_U64 meanOf64x64Blocks; EB_U64 meanOf64x64SquaredValuesBlocks; - if (pictureControlSetPtr->disableVarianceFlag) { - memset16bit(pictureControlSetPtr->variance[lcuIndex], 125, MAX_ME_PU_COUNT); - EB_MEMSET(pictureControlSetPtr->yMean[lcuIndex], 125, sizeof(EB_U8) * MAX_ME_PU_COUNT); + if (pictureControlSetPtr->disableVarianceFlag) { + memset16bit(pictureControlSetPtr->variance[lcuIndex], 125, MAX_ME_PU_COUNT); + EB_MEMSET(pictureControlSetPtr->yMean[lcuIndex], 125, sizeof(EB_U8) * MAX_ME_PU_COUNT); - } - else { + } + else { - // (0,0) - blockIndex = inputLumaOriginIndex; + // (0,0) + blockIndex = inputLumaOriginIndex; const EB_U16 strideY = inputPaddedPicturePtr->strideY; @@ -2110,276 +2110,276 @@ static EB_ERRORTYPE ComputeBlockMeanComputeVariance( } - // 16x16 - meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; - meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; - meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; - meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; - - meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; - meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; - meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; - meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; - - meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; - meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; - meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; - meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; - - meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; - meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; - meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; - meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; - - meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; - meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; - meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; - meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; - - meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; - meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; - meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; - meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; - - meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; - meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; - meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; - meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; - - meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; - meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; - meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; - meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; - - // 32x32 - meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; - meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; - meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; - meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; - - meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; - meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; - meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; - meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; - - // 64x64 - meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; - meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; - - // 8x8 means - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U8)(meanOf8x8Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U8)(meanOf8x8Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U8)(meanOf8x8Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U8)(meanOf8x8Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U8)(meanOf8x8Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U8)(meanOf8x8Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U8)(meanOf8x8Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U8)(meanOf8x8Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U8)(meanOf8x8Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U8)(meanOf8x8Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U8)(meanOf8x8Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U8)(meanOf8x8Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U8)(meanOf8x8Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U8)(meanOf8x8Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U8)(meanOf8x8Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U8)(meanOf8x8Blocks[15] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U8)(meanOf8x8Blocks[16] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U8)(meanOf8x8Blocks[17] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U8)(meanOf8x8Blocks[18] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U8)(meanOf8x8Blocks[19] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U8)(meanOf8x8Blocks[20] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U8)(meanOf8x8Blocks[21] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U8)(meanOf8x8Blocks[22] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U8)(meanOf8x8Blocks[23] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U8)(meanOf8x8Blocks[24] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U8)(meanOf8x8Blocks[25] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U8)(meanOf8x8Blocks[26] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U8)(meanOf8x8Blocks[27] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U8)(meanOf8x8Blocks[28] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U8)(meanOf8x8Blocks[29] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U8)(meanOf8x8Blocks[30] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U8)(meanOf8x8Blocks[31] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U8)(meanOf8x8Blocks[32] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U8)(meanOf8x8Blocks[33] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U8)(meanOf8x8Blocks[34] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U8)(meanOf8x8Blocks[35] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U8)(meanOf8x8Blocks[36] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U8)(meanOf8x8Blocks[37] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U8)(meanOf8x8Blocks[38] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U8)(meanOf8x8Blocks[39] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U8)(meanOf8x8Blocks[40] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U8)(meanOf8x8Blocks[41] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U8)(meanOf8x8Blocks[42] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U8)(meanOf8x8Blocks[43] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U8)(meanOf8x8Blocks[44] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U8)(meanOf8x8Blocks[45] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U8)(meanOf8x8Blocks[46] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U8)(meanOf8x8Blocks[47] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U8)(meanOf8x8Blocks[48] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U8)(meanOf8x8Blocks[49] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U8)(meanOf8x8Blocks[50] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U8)(meanOf8x8Blocks[51] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U8)(meanOf8x8Blocks[52] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U8)(meanOf8x8Blocks[53] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U8)(meanOf8x8Blocks[54] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U8)(meanOf8x8Blocks[55] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U8)(meanOf8x8Blocks[56] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U8)(meanOf8x8Blocks[57] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U8)(meanOf8x8Blocks[58] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U8)(meanOf8x8Blocks[59] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U8)(meanOf8x8Blocks[60] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U8)(meanOf8x8Blocks[61] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U8)(meanOf8x8Blocks[62] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U8)(meanOf8x8Blocks[63] >> MEAN_PRECISION); - - // 16x16 mean - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U8)(meanOf16x16Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U8)(meanOf16x16Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U8)(meanOf16x16Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U8)(meanOf16x16Blocks[3] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U8)(meanOf16x16Blocks[4] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U8)(meanOf16x16Blocks[5] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U8)(meanOf16x16Blocks[6] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U8)(meanOf16x16Blocks[7] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U8)(meanOf16x16Blocks[8] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U8)(meanOf16x16Blocks[9] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U8)(meanOf16x16Blocks[10] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U8)(meanOf16x16Blocks[11] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U8)(meanOf16x16Blocks[12] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U8)(meanOf16x16Blocks[13] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U8)(meanOf16x16Blocks[14] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U8)(meanOf16x16Blocks[15] >> MEAN_PRECISION); - - // 32x32 mean - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(meanOf32x32Blocks[0] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(meanOf32x32Blocks[1] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(meanOf32x32Blocks[2] >> MEAN_PRECISION); - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(meanOf32x32Blocks[3] >> MEAN_PRECISION); - - // 64x64 mean - pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U8)(meanOf64x64Blocks >> MEAN_PRECISION); - - // 8x8 variances - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U16)((meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U16)((meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U16)((meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U16)((meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U16)((meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U16)((meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U16)((meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U16)((meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U16)((meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U16)((meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U16)((meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U16)((meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U16)((meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U16)((meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U16)((meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U16)((meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U16)((meanOf8x8SquaredValuesBlocks[16] - (meanOf8x8Blocks[16] * meanOf8x8Blocks[16])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U16)((meanOf8x8SquaredValuesBlocks[17] - (meanOf8x8Blocks[17] * meanOf8x8Blocks[17])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U16)((meanOf8x8SquaredValuesBlocks[18] - (meanOf8x8Blocks[18] * meanOf8x8Blocks[18])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U16)((meanOf8x8SquaredValuesBlocks[19] - (meanOf8x8Blocks[19] * meanOf8x8Blocks[19])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U16)((meanOf8x8SquaredValuesBlocks[20] - (meanOf8x8Blocks[20] * meanOf8x8Blocks[20])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U16)((meanOf8x8SquaredValuesBlocks[21] - (meanOf8x8Blocks[21] * meanOf8x8Blocks[21])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U16)((meanOf8x8SquaredValuesBlocks[22] - (meanOf8x8Blocks[22] * meanOf8x8Blocks[22])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U16)((meanOf8x8SquaredValuesBlocks[23] - (meanOf8x8Blocks[23] * meanOf8x8Blocks[23])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U16)((meanOf8x8SquaredValuesBlocks[24] - (meanOf8x8Blocks[24] * meanOf8x8Blocks[24])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U16)((meanOf8x8SquaredValuesBlocks[25] - (meanOf8x8Blocks[25] * meanOf8x8Blocks[25])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U16)((meanOf8x8SquaredValuesBlocks[26] - (meanOf8x8Blocks[26] * meanOf8x8Blocks[26])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U16)((meanOf8x8SquaredValuesBlocks[27] - (meanOf8x8Blocks[27] * meanOf8x8Blocks[27])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U16)((meanOf8x8SquaredValuesBlocks[28] - (meanOf8x8Blocks[28] * meanOf8x8Blocks[28])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U16)((meanOf8x8SquaredValuesBlocks[29] - (meanOf8x8Blocks[29] * meanOf8x8Blocks[29])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U16)((meanOf8x8SquaredValuesBlocks[30] - (meanOf8x8Blocks[30] * meanOf8x8Blocks[30])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U16)((meanOf8x8SquaredValuesBlocks[31] - (meanOf8x8Blocks[31] * meanOf8x8Blocks[31])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U16)((meanOf8x8SquaredValuesBlocks[32] - (meanOf8x8Blocks[32] * meanOf8x8Blocks[32])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U16)((meanOf8x8SquaredValuesBlocks[33] - (meanOf8x8Blocks[33] * meanOf8x8Blocks[33])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U16)((meanOf8x8SquaredValuesBlocks[34] - (meanOf8x8Blocks[34] * meanOf8x8Blocks[34])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U16)((meanOf8x8SquaredValuesBlocks[35] - (meanOf8x8Blocks[35] * meanOf8x8Blocks[35])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U16)((meanOf8x8SquaredValuesBlocks[36] - (meanOf8x8Blocks[36] * meanOf8x8Blocks[36])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U16)((meanOf8x8SquaredValuesBlocks[37] - (meanOf8x8Blocks[37] * meanOf8x8Blocks[37])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U16)((meanOf8x8SquaredValuesBlocks[38] - (meanOf8x8Blocks[38] * meanOf8x8Blocks[38])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U16)((meanOf8x8SquaredValuesBlocks[39] - (meanOf8x8Blocks[39] * meanOf8x8Blocks[39])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U16)((meanOf8x8SquaredValuesBlocks[40] - (meanOf8x8Blocks[40] * meanOf8x8Blocks[40])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U16)((meanOf8x8SquaredValuesBlocks[41] - (meanOf8x8Blocks[41] * meanOf8x8Blocks[41])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U16)((meanOf8x8SquaredValuesBlocks[42] - (meanOf8x8Blocks[42] * meanOf8x8Blocks[42])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U16)((meanOf8x8SquaredValuesBlocks[43] - (meanOf8x8Blocks[43] * meanOf8x8Blocks[43])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U16)((meanOf8x8SquaredValuesBlocks[44] - (meanOf8x8Blocks[44] * meanOf8x8Blocks[44])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U16)((meanOf8x8SquaredValuesBlocks[45] - (meanOf8x8Blocks[45] * meanOf8x8Blocks[45])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U16)((meanOf8x8SquaredValuesBlocks[46] - (meanOf8x8Blocks[46] * meanOf8x8Blocks[46])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U16)((meanOf8x8SquaredValuesBlocks[47] - (meanOf8x8Blocks[47] * meanOf8x8Blocks[47])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U16)((meanOf8x8SquaredValuesBlocks[48] - (meanOf8x8Blocks[48] * meanOf8x8Blocks[48])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U16)((meanOf8x8SquaredValuesBlocks[49] - (meanOf8x8Blocks[49] * meanOf8x8Blocks[49])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U16)((meanOf8x8SquaredValuesBlocks[50] - (meanOf8x8Blocks[50] * meanOf8x8Blocks[50])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U16)((meanOf8x8SquaredValuesBlocks[51] - (meanOf8x8Blocks[51] * meanOf8x8Blocks[51])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U16)((meanOf8x8SquaredValuesBlocks[52] - (meanOf8x8Blocks[52] * meanOf8x8Blocks[52])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U16)((meanOf8x8SquaredValuesBlocks[53] - (meanOf8x8Blocks[53] * meanOf8x8Blocks[53])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U16)((meanOf8x8SquaredValuesBlocks[54] - (meanOf8x8Blocks[54] * meanOf8x8Blocks[54])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U16)((meanOf8x8SquaredValuesBlocks[55] - (meanOf8x8Blocks[55] * meanOf8x8Blocks[55])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U16)((meanOf8x8SquaredValuesBlocks[56] - (meanOf8x8Blocks[56] * meanOf8x8Blocks[56])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U16)((meanOf8x8SquaredValuesBlocks[57] - (meanOf8x8Blocks[57] * meanOf8x8Blocks[57])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U16)((meanOf8x8SquaredValuesBlocks[58] - (meanOf8x8Blocks[58] * meanOf8x8Blocks[58])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U16)((meanOf8x8SquaredValuesBlocks[59] - (meanOf8x8Blocks[59] * meanOf8x8Blocks[59])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U16)((meanOf8x8SquaredValuesBlocks[60] - (meanOf8x8Blocks[60] * meanOf8x8Blocks[60])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U16)((meanOf8x8SquaredValuesBlocks[61] - (meanOf8x8Blocks[61] * meanOf8x8Blocks[61])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U16)((meanOf8x8SquaredValuesBlocks[62] - (meanOf8x8Blocks[62] * meanOf8x8Blocks[62])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U16)((meanOf8x8SquaredValuesBlocks[63] - (meanOf8x8Blocks[63] * meanOf8x8Blocks[63])) >> VARIANCE_PRECISION); - - // 16x16 variances - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U16)((meanOf16x16SquaredValuesBlocks[0] - (meanOf16x16Blocks[0] * meanOf16x16Blocks[0])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U16)((meanOf16x16SquaredValuesBlocks[1] - (meanOf16x16Blocks[1] * meanOf16x16Blocks[1])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U16)((meanOf16x16SquaredValuesBlocks[2] - (meanOf16x16Blocks[2] * meanOf16x16Blocks[2])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U16)((meanOf16x16SquaredValuesBlocks[3] - (meanOf16x16Blocks[3] * meanOf16x16Blocks[3])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U16)((meanOf16x16SquaredValuesBlocks[4] - (meanOf16x16Blocks[4] * meanOf16x16Blocks[4])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U16)((meanOf16x16SquaredValuesBlocks[5] - (meanOf16x16Blocks[5] * meanOf16x16Blocks[5])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U16)((meanOf16x16SquaredValuesBlocks[6] - (meanOf16x16Blocks[6] * meanOf16x16Blocks[6])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U16)((meanOf16x16SquaredValuesBlocks[7] - (meanOf16x16Blocks[7] * meanOf16x16Blocks[7])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U16)((meanOf16x16SquaredValuesBlocks[8] - (meanOf16x16Blocks[8] * meanOf16x16Blocks[8])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U16)((meanOf16x16SquaredValuesBlocks[9] - (meanOf16x16Blocks[9] * meanOf16x16Blocks[9])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U16)((meanOf16x16SquaredValuesBlocks[10] - (meanOf16x16Blocks[10] * meanOf16x16Blocks[10])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U16)((meanOf16x16SquaredValuesBlocks[11] - (meanOf16x16Blocks[11] * meanOf16x16Blocks[11])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U16)((meanOf16x16SquaredValuesBlocks[12] - (meanOf16x16Blocks[12] * meanOf16x16Blocks[12])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U16)((meanOf16x16SquaredValuesBlocks[13] - (meanOf16x16Blocks[13] * meanOf16x16Blocks[13])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U16)((meanOf16x16SquaredValuesBlocks[14] - (meanOf16x16Blocks[14] * meanOf16x16Blocks[14])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U16)((meanOf16x16SquaredValuesBlocks[15] - (meanOf16x16Blocks[15] * meanOf16x16Blocks[15])) >> VARIANCE_PRECISION); - - // 32x32 variances - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U16)((meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U16)((meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U16)((meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2])) >> VARIANCE_PRECISION); - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U16)((meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3])) >> VARIANCE_PRECISION); - - // 64x64 variance - pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U16)((meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)) >> VARIANCE_PRECISION); + // 16x16 + meanOf16x16Blocks[0] = (meanOf8x8Blocks[0] + meanOf8x8Blocks[1] + meanOf8x8Blocks[8] + meanOf8x8Blocks[9]) >> 2; + meanOf16x16Blocks[1] = (meanOf8x8Blocks[2] + meanOf8x8Blocks[3] + meanOf8x8Blocks[10] + meanOf8x8Blocks[11]) >> 2; + meanOf16x16Blocks[2] = (meanOf8x8Blocks[4] + meanOf8x8Blocks[5] + meanOf8x8Blocks[12] + meanOf8x8Blocks[13]) >> 2; + meanOf16x16Blocks[3] = (meanOf8x8Blocks[6] + meanOf8x8Blocks[7] + meanOf8x8Blocks[14] + meanOf8x8Blocks[15]) >> 2; + + meanOf16x16Blocks[4] = (meanOf8x8Blocks[16] + meanOf8x8Blocks[17] + meanOf8x8Blocks[24] + meanOf8x8Blocks[25]) >> 2; + meanOf16x16Blocks[5] = (meanOf8x8Blocks[18] + meanOf8x8Blocks[19] + meanOf8x8Blocks[26] + meanOf8x8Blocks[27]) >> 2; + meanOf16x16Blocks[6] = (meanOf8x8Blocks[20] + meanOf8x8Blocks[21] + meanOf8x8Blocks[28] + meanOf8x8Blocks[29]) >> 2; + meanOf16x16Blocks[7] = (meanOf8x8Blocks[22] + meanOf8x8Blocks[23] + meanOf8x8Blocks[30] + meanOf8x8Blocks[31]) >> 2; + + meanOf16x16Blocks[8] = (meanOf8x8Blocks[32] + meanOf8x8Blocks[33] + meanOf8x8Blocks[40] + meanOf8x8Blocks[41]) >> 2; + meanOf16x16Blocks[9] = (meanOf8x8Blocks[34] + meanOf8x8Blocks[35] + meanOf8x8Blocks[42] + meanOf8x8Blocks[43]) >> 2; + meanOf16x16Blocks[10] = (meanOf8x8Blocks[36] + meanOf8x8Blocks[37] + meanOf8x8Blocks[44] + meanOf8x8Blocks[45]) >> 2; + meanOf16x16Blocks[11] = (meanOf8x8Blocks[38] + meanOf8x8Blocks[39] + meanOf8x8Blocks[46] + meanOf8x8Blocks[47]) >> 2; + + meanOf16x16Blocks[12] = (meanOf8x8Blocks[48] + meanOf8x8Blocks[49] + meanOf8x8Blocks[56] + meanOf8x8Blocks[57]) >> 2; + meanOf16x16Blocks[13] = (meanOf8x8Blocks[50] + meanOf8x8Blocks[51] + meanOf8x8Blocks[58] + meanOf8x8Blocks[59]) >> 2; + meanOf16x16Blocks[14] = (meanOf8x8Blocks[52] + meanOf8x8Blocks[53] + meanOf8x8Blocks[60] + meanOf8x8Blocks[61]) >> 2; + meanOf16x16Blocks[15] = (meanOf8x8Blocks[54] + meanOf8x8Blocks[55] + meanOf8x8Blocks[62] + meanOf8x8Blocks[63]) >> 2; + + meanOf16x16SquaredValuesBlocks[0] = (meanOf8x8SquaredValuesBlocks[0] + meanOf8x8SquaredValuesBlocks[1] + meanOf8x8SquaredValuesBlocks[8] + meanOf8x8SquaredValuesBlocks[9]) >> 2; + meanOf16x16SquaredValuesBlocks[1] = (meanOf8x8SquaredValuesBlocks[2] + meanOf8x8SquaredValuesBlocks[3] + meanOf8x8SquaredValuesBlocks[10] + meanOf8x8SquaredValuesBlocks[11]) >> 2; + meanOf16x16SquaredValuesBlocks[2] = (meanOf8x8SquaredValuesBlocks[4] + meanOf8x8SquaredValuesBlocks[5] + meanOf8x8SquaredValuesBlocks[12] + meanOf8x8SquaredValuesBlocks[13]) >> 2; + meanOf16x16SquaredValuesBlocks[3] = (meanOf8x8SquaredValuesBlocks[6] + meanOf8x8SquaredValuesBlocks[7] + meanOf8x8SquaredValuesBlocks[14] + meanOf8x8SquaredValuesBlocks[15]) >> 2; + + meanOf16x16SquaredValuesBlocks[4] = (meanOf8x8SquaredValuesBlocks[16] + meanOf8x8SquaredValuesBlocks[17] + meanOf8x8SquaredValuesBlocks[24] + meanOf8x8SquaredValuesBlocks[25]) >> 2; + meanOf16x16SquaredValuesBlocks[5] = (meanOf8x8SquaredValuesBlocks[18] + meanOf8x8SquaredValuesBlocks[19] + meanOf8x8SquaredValuesBlocks[26] + meanOf8x8SquaredValuesBlocks[27]) >> 2; + meanOf16x16SquaredValuesBlocks[6] = (meanOf8x8SquaredValuesBlocks[20] + meanOf8x8SquaredValuesBlocks[21] + meanOf8x8SquaredValuesBlocks[28] + meanOf8x8SquaredValuesBlocks[29]) >> 2; + meanOf16x16SquaredValuesBlocks[7] = (meanOf8x8SquaredValuesBlocks[22] + meanOf8x8SquaredValuesBlocks[23] + meanOf8x8SquaredValuesBlocks[30] + meanOf8x8SquaredValuesBlocks[31]) >> 2; + + meanOf16x16SquaredValuesBlocks[8] = (meanOf8x8SquaredValuesBlocks[32] + meanOf8x8SquaredValuesBlocks[33] + meanOf8x8SquaredValuesBlocks[40] + meanOf8x8SquaredValuesBlocks[41]) >> 2; + meanOf16x16SquaredValuesBlocks[9] = (meanOf8x8SquaredValuesBlocks[34] + meanOf8x8SquaredValuesBlocks[35] + meanOf8x8SquaredValuesBlocks[42] + meanOf8x8SquaredValuesBlocks[43]) >> 2; + meanOf16x16SquaredValuesBlocks[10] = (meanOf8x8SquaredValuesBlocks[36] + meanOf8x8SquaredValuesBlocks[37] + meanOf8x8SquaredValuesBlocks[44] + meanOf8x8SquaredValuesBlocks[45]) >> 2; + meanOf16x16SquaredValuesBlocks[11] = (meanOf8x8SquaredValuesBlocks[38] + meanOf8x8SquaredValuesBlocks[39] + meanOf8x8SquaredValuesBlocks[46] + meanOf8x8SquaredValuesBlocks[47]) >> 2; + + meanOf16x16SquaredValuesBlocks[12] = (meanOf8x8SquaredValuesBlocks[48] + meanOf8x8SquaredValuesBlocks[49] + meanOf8x8SquaredValuesBlocks[56] + meanOf8x8SquaredValuesBlocks[57]) >> 2; + meanOf16x16SquaredValuesBlocks[13] = (meanOf8x8SquaredValuesBlocks[50] + meanOf8x8SquaredValuesBlocks[51] + meanOf8x8SquaredValuesBlocks[58] + meanOf8x8SquaredValuesBlocks[59]) >> 2; + meanOf16x16SquaredValuesBlocks[14] = (meanOf8x8SquaredValuesBlocks[52] + meanOf8x8SquaredValuesBlocks[53] + meanOf8x8SquaredValuesBlocks[60] + meanOf8x8SquaredValuesBlocks[61]) >> 2; + meanOf16x16SquaredValuesBlocks[15] = (meanOf8x8SquaredValuesBlocks[54] + meanOf8x8SquaredValuesBlocks[55] + meanOf8x8SquaredValuesBlocks[62] + meanOf8x8SquaredValuesBlocks[63]) >> 2; + + // 32x32 + meanOf32x32Blocks[0] = (meanOf16x16Blocks[0] + meanOf16x16Blocks[1] + meanOf16x16Blocks[4] + meanOf16x16Blocks[5]) >> 2; + meanOf32x32Blocks[1] = (meanOf16x16Blocks[2] + meanOf16x16Blocks[3] + meanOf16x16Blocks[6] + meanOf16x16Blocks[7]) >> 2; + meanOf32x32Blocks[2] = (meanOf16x16Blocks[8] + meanOf16x16Blocks[9] + meanOf16x16Blocks[12] + meanOf16x16Blocks[13]) >> 2; + meanOf32x32Blocks[3] = (meanOf16x16Blocks[10] + meanOf16x16Blocks[11] + meanOf16x16Blocks[14] + meanOf16x16Blocks[15]) >> 2; + + meanOf32x32SquaredValuesBlocks[0] = (meanOf16x16SquaredValuesBlocks[0] + meanOf16x16SquaredValuesBlocks[1] + meanOf16x16SquaredValuesBlocks[4] + meanOf16x16SquaredValuesBlocks[5]) >> 2; + meanOf32x32SquaredValuesBlocks[1] = (meanOf16x16SquaredValuesBlocks[2] + meanOf16x16SquaredValuesBlocks[3] + meanOf16x16SquaredValuesBlocks[6] + meanOf16x16SquaredValuesBlocks[7]) >> 2; + meanOf32x32SquaredValuesBlocks[2] = (meanOf16x16SquaredValuesBlocks[8] + meanOf16x16SquaredValuesBlocks[9] + meanOf16x16SquaredValuesBlocks[12] + meanOf16x16SquaredValuesBlocks[13]) >> 2; + meanOf32x32SquaredValuesBlocks[3] = (meanOf16x16SquaredValuesBlocks[10] + meanOf16x16SquaredValuesBlocks[11] + meanOf16x16SquaredValuesBlocks[14] + meanOf16x16SquaredValuesBlocks[15]) >> 2; + + // 64x64 + meanOf64x64Blocks = (meanOf32x32Blocks[0] + meanOf32x32Blocks[1] + meanOf32x32Blocks[2] + meanOf32x32Blocks[3]) >> 2; + meanOf64x64SquaredValuesBlocks = (meanOf32x32SquaredValuesBlocks[0] + meanOf32x32SquaredValuesBlocks[1] + meanOf32x32SquaredValuesBlocks[2] + meanOf32x32SquaredValuesBlocks[3]) >> 2; + + // 8x8 means + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U8)(meanOf8x8Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U8)(meanOf8x8Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U8)(meanOf8x8Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U8)(meanOf8x8Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U8)(meanOf8x8Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U8)(meanOf8x8Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U8)(meanOf8x8Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U8)(meanOf8x8Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U8)(meanOf8x8Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U8)(meanOf8x8Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U8)(meanOf8x8Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U8)(meanOf8x8Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U8)(meanOf8x8Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U8)(meanOf8x8Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U8)(meanOf8x8Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U8)(meanOf8x8Blocks[15] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U8)(meanOf8x8Blocks[16] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U8)(meanOf8x8Blocks[17] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U8)(meanOf8x8Blocks[18] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U8)(meanOf8x8Blocks[19] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U8)(meanOf8x8Blocks[20] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U8)(meanOf8x8Blocks[21] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U8)(meanOf8x8Blocks[22] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U8)(meanOf8x8Blocks[23] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U8)(meanOf8x8Blocks[24] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U8)(meanOf8x8Blocks[25] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U8)(meanOf8x8Blocks[26] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U8)(meanOf8x8Blocks[27] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U8)(meanOf8x8Blocks[28] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U8)(meanOf8x8Blocks[29] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U8)(meanOf8x8Blocks[30] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U8)(meanOf8x8Blocks[31] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U8)(meanOf8x8Blocks[32] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U8)(meanOf8x8Blocks[33] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U8)(meanOf8x8Blocks[34] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U8)(meanOf8x8Blocks[35] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U8)(meanOf8x8Blocks[36] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U8)(meanOf8x8Blocks[37] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U8)(meanOf8x8Blocks[38] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U8)(meanOf8x8Blocks[39] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U8)(meanOf8x8Blocks[40] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U8)(meanOf8x8Blocks[41] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U8)(meanOf8x8Blocks[42] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U8)(meanOf8x8Blocks[43] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U8)(meanOf8x8Blocks[44] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U8)(meanOf8x8Blocks[45] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U8)(meanOf8x8Blocks[46] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U8)(meanOf8x8Blocks[47] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U8)(meanOf8x8Blocks[48] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U8)(meanOf8x8Blocks[49] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U8)(meanOf8x8Blocks[50] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U8)(meanOf8x8Blocks[51] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U8)(meanOf8x8Blocks[52] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U8)(meanOf8x8Blocks[53] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U8)(meanOf8x8Blocks[54] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U8)(meanOf8x8Blocks[55] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U8)(meanOf8x8Blocks[56] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U8)(meanOf8x8Blocks[57] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U8)(meanOf8x8Blocks[58] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U8)(meanOf8x8Blocks[59] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U8)(meanOf8x8Blocks[60] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U8)(meanOf8x8Blocks[61] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U8)(meanOf8x8Blocks[62] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U8)(meanOf8x8Blocks[63] >> MEAN_PRECISION); + + // 16x16 mean + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U8)(meanOf16x16Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U8)(meanOf16x16Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U8)(meanOf16x16Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U8)(meanOf16x16Blocks[3] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U8)(meanOf16x16Blocks[4] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U8)(meanOf16x16Blocks[5] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U8)(meanOf16x16Blocks[6] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U8)(meanOf16x16Blocks[7] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U8)(meanOf16x16Blocks[8] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U8)(meanOf16x16Blocks[9] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U8)(meanOf16x16Blocks[10] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U8)(meanOf16x16Blocks[11] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U8)(meanOf16x16Blocks[12] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U8)(meanOf16x16Blocks[13] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U8)(meanOf16x16Blocks[14] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U8)(meanOf16x16Blocks[15] >> MEAN_PRECISION); + + // 32x32 mean + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U8)(meanOf32x32Blocks[0] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U8)(meanOf32x32Blocks[1] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U8)(meanOf32x32Blocks[2] >> MEAN_PRECISION); + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U8)(meanOf32x32Blocks[3] >> MEAN_PRECISION); + + // 64x64 mean + pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U8)(meanOf64x64Blocks >> MEAN_PRECISION); + + // 8x8 variances + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_0] = (EB_U16)((meanOf8x8SquaredValuesBlocks[0] - (meanOf8x8Blocks[0] * meanOf8x8Blocks[0])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_1] = (EB_U16)((meanOf8x8SquaredValuesBlocks[1] - (meanOf8x8Blocks[1] * meanOf8x8Blocks[1])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_2] = (EB_U16)((meanOf8x8SquaredValuesBlocks[2] - (meanOf8x8Blocks[2] * meanOf8x8Blocks[2])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_3] = (EB_U16)((meanOf8x8SquaredValuesBlocks[3] - (meanOf8x8Blocks[3] * meanOf8x8Blocks[3])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_4] = (EB_U16)((meanOf8x8SquaredValuesBlocks[4] - (meanOf8x8Blocks[4] * meanOf8x8Blocks[4])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_5] = (EB_U16)((meanOf8x8SquaredValuesBlocks[5] - (meanOf8x8Blocks[5] * meanOf8x8Blocks[5])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_6] = (EB_U16)((meanOf8x8SquaredValuesBlocks[6] - (meanOf8x8Blocks[6] * meanOf8x8Blocks[6])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_7] = (EB_U16)((meanOf8x8SquaredValuesBlocks[7] - (meanOf8x8Blocks[7] * meanOf8x8Blocks[7])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_8] = (EB_U16)((meanOf8x8SquaredValuesBlocks[8] - (meanOf8x8Blocks[8] * meanOf8x8Blocks[8])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_9] = (EB_U16)((meanOf8x8SquaredValuesBlocks[9] - (meanOf8x8Blocks[9] * meanOf8x8Blocks[9])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_10] = (EB_U16)((meanOf8x8SquaredValuesBlocks[10] - (meanOf8x8Blocks[10] * meanOf8x8Blocks[10])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_11] = (EB_U16)((meanOf8x8SquaredValuesBlocks[11] - (meanOf8x8Blocks[11] * meanOf8x8Blocks[11])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_12] = (EB_U16)((meanOf8x8SquaredValuesBlocks[12] - (meanOf8x8Blocks[12] * meanOf8x8Blocks[12])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_13] = (EB_U16)((meanOf8x8SquaredValuesBlocks[13] - (meanOf8x8Blocks[13] * meanOf8x8Blocks[13])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_14] = (EB_U16)((meanOf8x8SquaredValuesBlocks[14] - (meanOf8x8Blocks[14] * meanOf8x8Blocks[14])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_15] = (EB_U16)((meanOf8x8SquaredValuesBlocks[15] - (meanOf8x8Blocks[15] * meanOf8x8Blocks[15])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_16] = (EB_U16)((meanOf8x8SquaredValuesBlocks[16] - (meanOf8x8Blocks[16] * meanOf8x8Blocks[16])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_17] = (EB_U16)((meanOf8x8SquaredValuesBlocks[17] - (meanOf8x8Blocks[17] * meanOf8x8Blocks[17])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_18] = (EB_U16)((meanOf8x8SquaredValuesBlocks[18] - (meanOf8x8Blocks[18] * meanOf8x8Blocks[18])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_19] = (EB_U16)((meanOf8x8SquaredValuesBlocks[19] - (meanOf8x8Blocks[19] * meanOf8x8Blocks[19])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_20] = (EB_U16)((meanOf8x8SquaredValuesBlocks[20] - (meanOf8x8Blocks[20] * meanOf8x8Blocks[20])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_21] = (EB_U16)((meanOf8x8SquaredValuesBlocks[21] - (meanOf8x8Blocks[21] * meanOf8x8Blocks[21])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_22] = (EB_U16)((meanOf8x8SquaredValuesBlocks[22] - (meanOf8x8Blocks[22] * meanOf8x8Blocks[22])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_23] = (EB_U16)((meanOf8x8SquaredValuesBlocks[23] - (meanOf8x8Blocks[23] * meanOf8x8Blocks[23])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_24] = (EB_U16)((meanOf8x8SquaredValuesBlocks[24] - (meanOf8x8Blocks[24] * meanOf8x8Blocks[24])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_25] = (EB_U16)((meanOf8x8SquaredValuesBlocks[25] - (meanOf8x8Blocks[25] * meanOf8x8Blocks[25])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_26] = (EB_U16)((meanOf8x8SquaredValuesBlocks[26] - (meanOf8x8Blocks[26] * meanOf8x8Blocks[26])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_27] = (EB_U16)((meanOf8x8SquaredValuesBlocks[27] - (meanOf8x8Blocks[27] * meanOf8x8Blocks[27])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_28] = (EB_U16)((meanOf8x8SquaredValuesBlocks[28] - (meanOf8x8Blocks[28] * meanOf8x8Blocks[28])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_29] = (EB_U16)((meanOf8x8SquaredValuesBlocks[29] - (meanOf8x8Blocks[29] * meanOf8x8Blocks[29])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_30] = (EB_U16)((meanOf8x8SquaredValuesBlocks[30] - (meanOf8x8Blocks[30] * meanOf8x8Blocks[30])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_31] = (EB_U16)((meanOf8x8SquaredValuesBlocks[31] - (meanOf8x8Blocks[31] * meanOf8x8Blocks[31])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_32] = (EB_U16)((meanOf8x8SquaredValuesBlocks[32] - (meanOf8x8Blocks[32] * meanOf8x8Blocks[32])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_33] = (EB_U16)((meanOf8x8SquaredValuesBlocks[33] - (meanOf8x8Blocks[33] * meanOf8x8Blocks[33])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_34] = (EB_U16)((meanOf8x8SquaredValuesBlocks[34] - (meanOf8x8Blocks[34] * meanOf8x8Blocks[34])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_35] = (EB_U16)((meanOf8x8SquaredValuesBlocks[35] - (meanOf8x8Blocks[35] * meanOf8x8Blocks[35])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_36] = (EB_U16)((meanOf8x8SquaredValuesBlocks[36] - (meanOf8x8Blocks[36] * meanOf8x8Blocks[36])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_37] = (EB_U16)((meanOf8x8SquaredValuesBlocks[37] - (meanOf8x8Blocks[37] * meanOf8x8Blocks[37])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_38] = (EB_U16)((meanOf8x8SquaredValuesBlocks[38] - (meanOf8x8Blocks[38] * meanOf8x8Blocks[38])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_39] = (EB_U16)((meanOf8x8SquaredValuesBlocks[39] - (meanOf8x8Blocks[39] * meanOf8x8Blocks[39])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_40] = (EB_U16)((meanOf8x8SquaredValuesBlocks[40] - (meanOf8x8Blocks[40] * meanOf8x8Blocks[40])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_41] = (EB_U16)((meanOf8x8SquaredValuesBlocks[41] - (meanOf8x8Blocks[41] * meanOf8x8Blocks[41])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_42] = (EB_U16)((meanOf8x8SquaredValuesBlocks[42] - (meanOf8x8Blocks[42] * meanOf8x8Blocks[42])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_43] = (EB_U16)((meanOf8x8SquaredValuesBlocks[43] - (meanOf8x8Blocks[43] * meanOf8x8Blocks[43])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_44] = (EB_U16)((meanOf8x8SquaredValuesBlocks[44] - (meanOf8x8Blocks[44] * meanOf8x8Blocks[44])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_45] = (EB_U16)((meanOf8x8SquaredValuesBlocks[45] - (meanOf8x8Blocks[45] * meanOf8x8Blocks[45])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_46] = (EB_U16)((meanOf8x8SquaredValuesBlocks[46] - (meanOf8x8Blocks[46] * meanOf8x8Blocks[46])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_47] = (EB_U16)((meanOf8x8SquaredValuesBlocks[47] - (meanOf8x8Blocks[47] * meanOf8x8Blocks[47])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_48] = (EB_U16)((meanOf8x8SquaredValuesBlocks[48] - (meanOf8x8Blocks[48] * meanOf8x8Blocks[48])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_49] = (EB_U16)((meanOf8x8SquaredValuesBlocks[49] - (meanOf8x8Blocks[49] * meanOf8x8Blocks[49])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_50] = (EB_U16)((meanOf8x8SquaredValuesBlocks[50] - (meanOf8x8Blocks[50] * meanOf8x8Blocks[50])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_51] = (EB_U16)((meanOf8x8SquaredValuesBlocks[51] - (meanOf8x8Blocks[51] * meanOf8x8Blocks[51])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_52] = (EB_U16)((meanOf8x8SquaredValuesBlocks[52] - (meanOf8x8Blocks[52] * meanOf8x8Blocks[52])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_53] = (EB_U16)((meanOf8x8SquaredValuesBlocks[53] - (meanOf8x8Blocks[53] * meanOf8x8Blocks[53])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_54] = (EB_U16)((meanOf8x8SquaredValuesBlocks[54] - (meanOf8x8Blocks[54] * meanOf8x8Blocks[54])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_55] = (EB_U16)((meanOf8x8SquaredValuesBlocks[55] - (meanOf8x8Blocks[55] * meanOf8x8Blocks[55])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_56] = (EB_U16)((meanOf8x8SquaredValuesBlocks[56] - (meanOf8x8Blocks[56] * meanOf8x8Blocks[56])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_57] = (EB_U16)((meanOf8x8SquaredValuesBlocks[57] - (meanOf8x8Blocks[57] * meanOf8x8Blocks[57])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_58] = (EB_U16)((meanOf8x8SquaredValuesBlocks[58] - (meanOf8x8Blocks[58] * meanOf8x8Blocks[58])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_59] = (EB_U16)((meanOf8x8SquaredValuesBlocks[59] - (meanOf8x8Blocks[59] * meanOf8x8Blocks[59])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_60] = (EB_U16)((meanOf8x8SquaredValuesBlocks[60] - (meanOf8x8Blocks[60] * meanOf8x8Blocks[60])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_61] = (EB_U16)((meanOf8x8SquaredValuesBlocks[61] - (meanOf8x8Blocks[61] * meanOf8x8Blocks[61])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_62] = (EB_U16)((meanOf8x8SquaredValuesBlocks[62] - (meanOf8x8Blocks[62] * meanOf8x8Blocks[62])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_8x8_63] = (EB_U16)((meanOf8x8SquaredValuesBlocks[63] - (meanOf8x8Blocks[63] * meanOf8x8Blocks[63])) >> VARIANCE_PRECISION); + + // 16x16 variances + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_0] = (EB_U16)((meanOf16x16SquaredValuesBlocks[0] - (meanOf16x16Blocks[0] * meanOf16x16Blocks[0])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_1] = (EB_U16)((meanOf16x16SquaredValuesBlocks[1] - (meanOf16x16Blocks[1] * meanOf16x16Blocks[1])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_2] = (EB_U16)((meanOf16x16SquaredValuesBlocks[2] - (meanOf16x16Blocks[2] * meanOf16x16Blocks[2])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_3] = (EB_U16)((meanOf16x16SquaredValuesBlocks[3] - (meanOf16x16Blocks[3] * meanOf16x16Blocks[3])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_4] = (EB_U16)((meanOf16x16SquaredValuesBlocks[4] - (meanOf16x16Blocks[4] * meanOf16x16Blocks[4])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_5] = (EB_U16)((meanOf16x16SquaredValuesBlocks[5] - (meanOf16x16Blocks[5] * meanOf16x16Blocks[5])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_6] = (EB_U16)((meanOf16x16SquaredValuesBlocks[6] - (meanOf16x16Blocks[6] * meanOf16x16Blocks[6])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_7] = (EB_U16)((meanOf16x16SquaredValuesBlocks[7] - (meanOf16x16Blocks[7] * meanOf16x16Blocks[7])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_8] = (EB_U16)((meanOf16x16SquaredValuesBlocks[8] - (meanOf16x16Blocks[8] * meanOf16x16Blocks[8])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_9] = (EB_U16)((meanOf16x16SquaredValuesBlocks[9] - (meanOf16x16Blocks[9] * meanOf16x16Blocks[9])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_10] = (EB_U16)((meanOf16x16SquaredValuesBlocks[10] - (meanOf16x16Blocks[10] * meanOf16x16Blocks[10])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_11] = (EB_U16)((meanOf16x16SquaredValuesBlocks[11] - (meanOf16x16Blocks[11] * meanOf16x16Blocks[11])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_12] = (EB_U16)((meanOf16x16SquaredValuesBlocks[12] - (meanOf16x16Blocks[12] * meanOf16x16Blocks[12])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_13] = (EB_U16)((meanOf16x16SquaredValuesBlocks[13] - (meanOf16x16Blocks[13] * meanOf16x16Blocks[13])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_14] = (EB_U16)((meanOf16x16SquaredValuesBlocks[14] - (meanOf16x16Blocks[14] * meanOf16x16Blocks[14])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_16x16_15] = (EB_U16)((meanOf16x16SquaredValuesBlocks[15] - (meanOf16x16Blocks[15] * meanOf16x16Blocks[15])) >> VARIANCE_PRECISION); + + // 32x32 variances + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_0] = (EB_U16)((meanOf32x32SquaredValuesBlocks[0] - (meanOf32x32Blocks[0] * meanOf32x32Blocks[0])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_1] = (EB_U16)((meanOf32x32SquaredValuesBlocks[1] - (meanOf32x32Blocks[1] * meanOf32x32Blocks[1])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_2] = (EB_U16)((meanOf32x32SquaredValuesBlocks[2] - (meanOf32x32Blocks[2] * meanOf32x32Blocks[2])) >> VARIANCE_PRECISION); + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_32x32_3] = (EB_U16)((meanOf32x32SquaredValuesBlocks[3] - (meanOf32x32Blocks[3] * meanOf32x32Blocks[3])) >> VARIANCE_PRECISION); + + // 64x64 variance + pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64] = (EB_U16)((meanOf64x64SquaredValuesBlocks - (meanOf64x64Blocks * meanOf64x64Blocks)) >> VARIANCE_PRECISION); } - return return_error; + return return_error; } static EB_ERRORTYPE DenoiseInputPicture( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 lcuIndex; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U16 verticalIdx; - EB_U32 colorFormat = inputPicturePtr->colorFormat; - EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; - EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - //use denoised input if the source is extremly noisy - if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ - - EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 lcuIndex; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U16 verticalIdx; + EB_U32 colorFormat = inputPicturePtr->colorFormat; + EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; + EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; + //use denoised input if the source is extremly noisy + if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4){ + + EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; EB_U32 inChromaOffSet = (inputPicturePtr->originX >> subWidthCMinus1) + (inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; EB_U32 denChromaOffSet = (denoisedPicturePtr->originX >> subWidthCMinus1) + (denoisedPicturePtr->originY >> subHeightCMinus1) * denoisedPicturePtr->strideCb; - //filter Luma + //filter Luma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2388,32 +2388,32 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - StrongLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY, - lcuOriginX); - - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaStrong( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY, - lcuOriginX); - } - - } - - //copy Luma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * inputPicturePtr->width); - } - - //copy chroma + if (lcuOriginX == 0) + StrongLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaStrong( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY, + lcuOriginX); + } + + } + + //copy Luma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * inputPicturePtr->width); + } + + //copy chroma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2421,52 +2421,52 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - StrongChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); + if (lcuOriginX == 0) + StrongChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractChromaStrong( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); - } + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractChromaStrong( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); + } - } + } - //copy chroma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { + //copy chroma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, - denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, + denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, - denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - } + EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, + denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + } - } - else if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1){ + } + else if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_3_1){ - EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; EB_U32 inChromaOffSet = (inputPicturePtr->originX >> subWidthCMinus1) + (inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; EB_U32 denChromaOffSet = (denoisedPicturePtr->originX >> subWidthCMinus1) + (denoisedPicturePtr->originY >> subHeightCMinus1) * denoisedPicturePtr->strideCb; - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * inputPicturePtr->width); - } + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * inputPicturePtr->width); + } - //copy chroma + //copy chroma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2474,42 +2474,42 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); + if (lcuOriginX == 0) + WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractChromaWeak( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); - } + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractChromaWeak( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); + } - } + } - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, - denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, + denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, - denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - } + EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, + denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + } - } + } else if (contextPtr->picNoiseVarianceFloat >= 1.0 && sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - //Luma : use filtered only for flatNoise LCUs + //Luma : use filtered only for flatNoise LCUs for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2517,118 +2517,118 @@ static EB_ERRORTYPE DenoiseInputPicture( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); - EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); + EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); + EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); - EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ + if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ - for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { + for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * lcuWidth); + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * lcuWidth); - } - } - } - } + } + } + } + } - return return_error; + return return_error; } static EB_ERRORTYPE DetectInputPictureNoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuIndex; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 lcuIndex; - EB_U64 picNoiseVariance; + EB_U64 picNoiseVariance; - EB_U32 totLcuCount, noiseTh; + EB_U32 totLcuCount, noiseTh; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U32 inputLumaOriginIndex; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U32 inputLumaOriginIndex; - picNoiseVariance = 0; - totLcuCount = 0; + picNoiseVariance = 0; + totLcuCount = 0; - //Variance calc for noise picture + //Variance calc for noise picture for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - inputLumaOriginIndex = (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY + - noisePicturePtr->originX + lcuOriginX; - - - EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; - - if (lcuOriginX == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaWeak( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - } - - //do it only for complete 64x64 blocks + inputLumaOriginIndex = (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY + + noisePicturePtr->originX + lcuOriginX; + + + EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + noisePicturePtr->originY * noisePicturePtr->strideY; + + if (lcuOriginX == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaWeak( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + } + + //do it only for complete 64x64 blocks if (lcuParams->isCompleteLcu) - { + { - EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; + EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; - EB_U64 noiseBlkVar = ComputeVariance64x64( + EB_U64 noiseBlkVar = ComputeVariance64x64( noisePicturePtr, - noiseOriginIndex, - noiseBlkVar32x32); + noiseOriginIndex, + noiseBlkVar32x32); EB_U64 noiseBlkVarTh ; EB_U64 denBlkVarTh = FLAT_MAX_VAR; - if (pictureControlSetPtr->noiseDetectionTh == 1) - noiseBlkVarTh = NOISE_MIN_LEVEL_0; - else - noiseBlkVarTh = NOISE_MIN_LEVEL_1; + if (pictureControlSetPtr->noiseDetectionTh == 1) + noiseBlkVarTh = NOISE_MIN_LEVEL_0; + else + noiseBlkVarTh = NOISE_MIN_LEVEL_1; - picNoiseVariance += (noiseBlkVar >> 16); + picNoiseVariance += (noiseBlkVar >> 16); - EB_U64 denBlkVar = ComputeVariance64x64( + EB_U64 denBlkVar = ComputeVariance64x64( denoisedPicturePtr, - inputLumaOriginIndex, - denoiseBlkVar32x32) >> 16; + inputLumaOriginIndex, + denoiseBlkVar32x32) >> 16; - if (denBlkVar < denBlkVarTh && noiseBlkVar > noiseBlkVarTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; - } + if (denBlkVar < denBlkVarTh && noiseBlkVar > noiseBlkVarTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; + } - totLcuCount++; - } + totLcuCount++; + } - } + } if (totLcuCount > 0) { contextPtr->picNoiseVarianceFloat = (double)picNoiseVariance / (double)totLcuCount; @@ -2636,60 +2636,60 @@ static EB_ERRORTYPE DetectInputPictureNoise( picNoiseVariance = picNoiseVariance / totLcuCount; } - //the variance of a 64x64 noise area tends to be bigger for small resolutions. - if (sequenceControlSetPtr->lumaHeight <= 720) - noiseTh = 25; - else - noiseTh = 0; - - if (picNoiseVariance >= 80 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_10; - else if (picNoiseVariance >= 70 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_9; - else if (picNoiseVariance >= 60 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_8; - else if (picNoiseVariance >= 50 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_7; - else if (picNoiseVariance >= 40 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_6; - else if (picNoiseVariance >= 30 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_5; - else if (picNoiseVariance >= 20 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_4; - else if (picNoiseVariance >= 17 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; - else if (picNoiseVariance >= 10 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; - else if (picNoiseVariance >= 5 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; - else - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; - - if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; - - return return_error; + //the variance of a 64x64 noise area tends to be bigger for small resolutions. + if (sequenceControlSetPtr->lumaHeight <= 720) + noiseTh = 25; + else + noiseTh = 0; + + if (picNoiseVariance >= 80 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_10; + else if (picNoiseVariance >= 70 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_9; + else if (picNoiseVariance >= 60 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_8; + else if (picNoiseVariance >= 50 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_7; + else if (picNoiseVariance >= 40 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_6; + else if (picNoiseVariance >= 30 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_5; + else if (picNoiseVariance >= 20 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_4; + else if (picNoiseVariance >= 17 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; + else if (picNoiseVariance >= 10 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; + else if (picNoiseVariance >= 5 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; + else + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; + + if (pictureControlSetPtr->picNoiseClass >= PIC_NOISE_CLASS_4) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; + + return return_error; } static EB_ERRORTYPE FullSampleDenoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuTotalCount, - EB_BOOL denoiseFlag) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuTotalCount, + EB_BOOL denoiseFlag) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuCodingOrder; - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; + EB_U32 lcuCodingOrder; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; - //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes - for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; + //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes + for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; } pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY @@ -2717,31 +2717,31 @@ static EB_ERRORTYPE FullSampleDenoise( } static EB_ERRORTYPE SubSampleFilterNoise( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuIndex; - EB_U32 lcuOriginX; - EB_U32 lcuOriginY; - EB_U16 verticalIdx; + EB_U32 lcuIndex; + EB_U32 lcuOriginX; + EB_U32 lcuOriginY; + EB_U16 verticalIdx; EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) { + if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) { - EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY; EB_U32 inChromaOffSet = (inputPicturePtr->originX >> subWidthCMinus1) + (inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + denoisedPicturePtr->originY * denoisedPicturePtr->strideY; EB_U32 denChromaOffSet = (denoisedPicturePtr->originX >> subWidthCMinus1) + (denoisedPicturePtr->originY >> subHeightCMinus1) * denoisedPicturePtr->strideCb; - //filter Luma + //filter Luma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2749,33 +2749,33 @@ static EB_ERRORTYPE SubSampleFilterNoise( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaWeak( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - } - } - - //copy luma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * inputPicturePtr->width); - } - - //filter chroma + if (lcuOriginX == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaWeak( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + } + } + + //copy luma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height; ++verticalIdx) { + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * inputPicturePtr->width); + } + + //filter chroma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; @@ -2783,95 +2783,95 @@ static EB_ERRORTYPE SubSampleFilterNoise( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX == 0) - WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); + if (lcuOriginX == 0) + WeakChromaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractChromaWeak( - inputPicturePtr, - denoisedPicturePtr, - lcuOriginY >> subHeightCMinus1, - lcuOriginX >> subWidthCMinus1); - } + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractChromaWeak( + inputPicturePtr, + denoisedPicturePtr, + lcuOriginY >> subHeightCMinus1, + lcuOriginX >> subWidthCMinus1); + } - } + } - //copy chroma - for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { + //copy chroma + for (verticalIdx = 0; verticalIdx < inputPicturePtr->height >> subHeightCMinus1; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, - denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + EB_MEMCPY(inputPicturePtr->bufferCb + inChromaOffSet + verticalIdx * inputPicturePtr->strideCb, + denoisedPicturePtr->bufferCb + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCb, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, - denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, - sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); - } + EB_MEMCPY(inputPicturePtr->bufferCr + inChromaOffSet + verticalIdx * inputPicturePtr->strideCr, + denoisedPicturePtr->bufferCr + denChromaOffSet + verticalIdx * denoisedPicturePtr->strideCr, + sizeof(EB_U8) * inputPicturePtr->width >> subWidthCMinus1); + } - } else if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2){ + } else if (pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2){ - EB_U32 newTotFN = 0; + EB_U32 newTotFN = 0; - //for each LCU ,re check the FN information for only the FNdecim ones + //for each LCU ,re check the FN information for only the FNdecim ones for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - EB_U32 inputLumaOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY; - EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY * noisePicturePtr->strideY); - - if (lcuParams->isCompleteLcu && pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1) - { - - WeakLumaFilterLcu_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - - if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) - { - noiseExtractLumaWeakLcu( - inputPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - lcuOriginY, - lcuOriginX); - } - - EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; - EB_U64 noiseBlkVar = ComputeVariance64x64( + EB_U32 inputLumaOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY + lcuOriginY) * noisePicturePtr->strideY; + EB_U32 noiseOriginIndex = noisePicturePtr->originX + lcuOriginX + (noisePicturePtr->originY * noisePicturePtr->strideY); + + if (lcuParams->isCompleteLcu && pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1) + { + + WeakLumaFilterLcu_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + + if (lcuOriginX + MAX_LCU_SIZE > inputPicturePtr->width) + { + noiseExtractLumaWeakLcu( + inputPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + lcuOriginY, + lcuOriginX); + } + + EB_U64 noiseBlkVar32x32[4], denoiseBlkVar32x32[4]; + EB_U64 noiseBlkVar = ComputeVariance64x64( noisePicturePtr, noiseOriginIndex, noiseBlkVar32x32); - EB_U64 denBlkVar = ComputeVariance64x64( + EB_U64 denBlkVar = ComputeVariance64x64( denoisedPicturePtr, inputLumaOriginIndex, denoiseBlkVar32x32) >> 16; EB_U64 noiseBlkVarTh ; EB_U64 denBlkVarTh = FLAT_MAX_VAR; - if (pictureControlSetPtr->noiseDetectionTh == 1) - noiseBlkVarTh = NOISE_MIN_LEVEL_0; - else - noiseBlkVarTh = NOISE_MIN_LEVEL_1; + if (pictureControlSetPtr->noiseDetectionTh == 1) + noiseBlkVarTh = NOISE_MIN_LEVEL_0; + else + noiseBlkVarTh = NOISE_MIN_LEVEL_1; - if (denBlkVar noiseBlkVarTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; - //SVT_LOG("POC %i (%i,%i) denBlkVar: %i noiseBlkVar :%i\n", pictureControlSetPtr->pictureNumber,lcuOriginX,lcuOriginY, denBlkVar, noiseBlkVar); - newTotFN++; + if (denBlkVar noiseBlkVarTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 1; + //SVT_LOG("POC %i (%i,%i) denBlkVar: %i noiseBlkVar :%i\n", pictureControlSetPtr->pictureNumber,lcuOriginX,lcuOriginY, denBlkVar, noiseBlkVar); + newTotFN++; - } - else{ - pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 0; - } - } - } + } + else{ + pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] = 0; + } + } + } //filter Luma for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { @@ -2881,126 +2881,126 @@ static EB_ERRORTYPE SubSampleFilterNoise( lcuOriginX = lcuParams->originX; lcuOriginY = lcuParams->originY; - if (lcuOriginX + 64 <= inputPicturePtr->width && lcuOriginY + 64 <= inputPicturePtr->height) - { + if (lcuOriginX + 64 <= inputPicturePtr->width && lcuOriginY + 64 <= inputPicturePtr->height) + { - //use the denoised for FN LCUs - if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ + //use the denoised for FN LCUs + if (pictureControlSetPtr->lcuFlatNoiseArray[lcuIndex] == 1){ - EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); - EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); + EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, inputPicturePtr->height - lcuOriginY); + EB_U32 lcuWidth = MIN(MAX_LCU_SIZE, inputPicturePtr->width - lcuOriginX); - EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; - EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; + EB_U32 inLumaOffSet = inputPicturePtr->originX + lcuOriginX + (inputPicturePtr->originY + lcuOriginY) * inputPicturePtr->strideY; + EB_U32 denLumaOffSet = denoisedPicturePtr->originX + lcuOriginX + (denoisedPicturePtr->originY + lcuOriginY) * denoisedPicturePtr->strideY; - for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { + for (verticalIdx = 0; verticalIdx < lcuHeight; ++verticalIdx) { - EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, - denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, - sizeof(EB_U8) * lcuWidth); + EB_MEMCPY(inputPicturePtr->bufferY + inLumaOffSet + verticalIdx * inputPicturePtr->strideY, + denoisedPicturePtr->bufferY + denLumaOffSet + verticalIdx * denoisedPicturePtr->strideY, + sizeof(EB_U8) * lcuWidth); - } - } + } + } - } + } - } + } - } - return return_error; + } + return return_error; } static EB_ERRORTYPE QuarterSampleDetectNoise( - PictureAnalysisContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U64 picNoiseVariance; + EB_U64 picNoiseVariance; - EB_U32 totLcuCount, noiseTh; + EB_U32 totLcuCount, noiseTh; - EB_U32 blockIndex; + EB_U32 blockIndex; - picNoiseVariance = 0; - totLcuCount = 0; + picNoiseVariance = 0; + totLcuCount = 0; - EB_U16 vert64x64Index; - EB_U16 horz64x64Index; - EB_U32 block64x64X; - EB_U32 block64x64Y; - EB_U32 vert32x32Index; - EB_U32 horz32x32Index; - EB_U32 block32x32X; - EB_U32 block32x32Y; - EB_U32 noiseOriginIndex; - EB_U32 lcuCodingOrder; + EB_U16 vert64x64Index; + EB_U16 horz64x64Index; + EB_U32 block64x64X; + EB_U32 block64x64Y; + EB_U32 vert32x32Index; + EB_U32 horz32x32Index; + EB_U32 block32x32X; + EB_U32 block32x32Y; + EB_U32 noiseOriginIndex; + EB_U32 lcuCodingOrder; - // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) - for (vert64x64Index = 0; vert64x64Index < (quarterDecimatedPicturePtr->height / 64); vert64x64Index++){ - for (horz64x64Index = 0; horz64x64Index < (quarterDecimatedPicturePtr->width / 64); horz64x64Index++){ + // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) + for (vert64x64Index = 0; vert64x64Index < (quarterDecimatedPicturePtr->height / 64); vert64x64Index++){ + for (horz64x64Index = 0; horz64x64Index < (quarterDecimatedPicturePtr->width / 64); horz64x64Index++){ - block64x64X = horz64x64Index * 64; - block64x64Y = vert64x64Index * 64; + block64x64X = horz64x64Index * 64; + block64x64Y = vert64x64Index * 64; - if (block64x64X == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - quarterDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); + if (block64x64X == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + quarterDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); - if (block64x64Y + MAX_LCU_SIZE > quarterDecimatedPicturePtr->width) - { - noiseExtractLumaWeak( - quarterDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); - } + if (block64x64Y + MAX_LCU_SIZE > quarterDecimatedPicturePtr->width) + { + noiseExtractLumaWeak( + quarterDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); + } - // Loop over 32x32 blocks (i.e, 64x64 blocks in full resolution) - for (vert32x32Index = 0; vert32x32Index < 2; vert32x32Index++){ - for (horz32x32Index = 0; horz32x32Index < 2; horz32x32Index++){ + // Loop over 32x32 blocks (i.e, 64x64 blocks in full resolution) + for (vert32x32Index = 0; vert32x32Index < 2; vert32x32Index++){ + for (horz32x32Index = 0; horz32x32Index < 2; horz32x32Index++){ - block32x32X = block64x64X + horz32x32Index * 32; - block32x32Y = block64x64Y + vert32x32Index * 32; + block32x32X = block64x64X + horz32x32Index * 32; + block32x32Y = block64x64Y + vert32x32Index * 32; - //do it only for complete 32x32 blocks (i.e, complete 64x64 blocks in full resolution) - if ((block32x32X + 32 <= quarterDecimatedPicturePtr->width) && (block32x32Y + 32 <= quarterDecimatedPicturePtr->height)) - { + //do it only for complete 32x32 blocks (i.e, complete 64x64 blocks in full resolution) + if ((block32x32X + 32 <= quarterDecimatedPicturePtr->width) && (block32x32Y + 32 <= quarterDecimatedPicturePtr->height)) + { - lcuCodingOrder = ((vert64x64Index * 2) + vert32x32Index) * pictureWidthInLcu + ((horz64x64Index * 2) + horz32x32Index); + lcuCodingOrder = ((vert64x64Index * 2) + vert32x32Index) * pictureWidthInLcu + ((horz64x64Index * 2) + horz32x32Index); - EB_U64 noiseBlkVar8x8[16], denoiseBlkVar8x8[16]; + EB_U64 noiseBlkVar8x8[16], denoiseBlkVar8x8[16]; - noiseOriginIndex = noisePicturePtr->originX + block32x32X + noisePicturePtr->originY * noisePicturePtr->strideY; + noiseOriginIndex = noisePicturePtr->originX + block32x32X + noisePicturePtr->originY * noisePicturePtr->strideY; - EB_U64 noiseBlkVar = ComputeVariance32x32( - noisePicturePtr, - noiseOriginIndex, - noiseBlkVar8x8); + EB_U64 noiseBlkVar = ComputeVariance32x32( + noisePicturePtr, + noiseOriginIndex, + noiseBlkVar8x8); - picNoiseVariance += (noiseBlkVar >> 16); + picNoiseVariance += (noiseBlkVar >> 16); - blockIndex = (noisePicturePtr->originY + block32x32Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block32x32X; + blockIndex = (noisePicturePtr->originY + block32x32Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block32x32X; - EB_U64 denBlkVar = ComputeVariance32x32( - denoisedPicturePtr, - blockIndex, - denoiseBlkVar8x8) >> 16; + EB_U64 denBlkVar = ComputeVariance32x32( + denoisedPicturePtr, + blockIndex, + denoiseBlkVar8x8) >> 16; EB_U64 denBlkVarDecTh; @@ -3011,16 +3011,16 @@ static EB_ERRORTYPE QuarterSampleDetectNoise( denBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_0; } - if (denBlkVar < FLAT_MAX_VAR_DECIM && noiseBlkVar> denBlkVarDecTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; - } + if (denBlkVar < FLAT_MAX_VAR_DECIM && noiseBlkVar> denBlkVarDecTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; + } - totLcuCount++; - } - } - } - } - } + totLcuCount++; + } + } + } + } + } if (totLcuCount > 0) { contextPtr->picNoiseVarianceFloat = (double)picNoiseVariance / (double)totLcuCount; @@ -3028,143 +3028,143 @@ static EB_ERRORTYPE QuarterSampleDetectNoise( picNoiseVariance = picNoiseVariance / totLcuCount; } - //the variance of a 64x64 noise area tends to be bigger for small resolutions. - //if (sequenceControlSetPtr->lumaHeight <= 720) - // noiseTh = 25; - //else if (sequenceControlSetPtr->lumaHeight <= 1080) - // noiseTh = 10; - //else - noiseTh = 0; + //the variance of a 64x64 noise area tends to be bigger for small resolutions. + //if (sequenceControlSetPtr->lumaHeight <= 720) + // noiseTh = 25; + //else if (sequenceControlSetPtr->lumaHeight <= 1080) + // noiseTh = 10; + //else + noiseTh = 0; - //look for extreme noise or big enough flat noisy area to be denoised. - if (picNoiseVariance > 60) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) - else if (picNoiseVariance >= 10 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) - else if (picNoiseVariance >= 5 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) - else - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) + //look for extreme noise or big enough flat noisy area to be denoised. + if (picNoiseVariance > 60) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) + else if (picNoiseVariance >= 10 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) + else if (picNoiseVariance >= 5 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) + else + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) - return return_error; + return return_error; } static EB_ERRORTYPE SubSampleDetectNoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U64 picNoiseVariance; + EB_U64 picNoiseVariance; - EB_U32 totLcuCount, noiseTh; + EB_U32 totLcuCount, noiseTh; - EB_U32 blockIndex; + EB_U32 blockIndex; - picNoiseVariance = 0; - totLcuCount = 0; + picNoiseVariance = 0; + totLcuCount = 0; - EB_U16 vert64x64Index; - EB_U16 horz64x64Index; - EB_U32 block64x64X; - EB_U32 block64x64Y; - EB_U32 vert16x16Index; - EB_U32 horz16x16Index; - EB_U32 block16x16X; - EB_U32 block16x16Y; - EB_U32 noiseOriginIndex; - EB_U32 lcuCodingOrder; + EB_U16 vert64x64Index; + EB_U16 horz64x64Index; + EB_U32 block64x64X; + EB_U32 block64x64Y; + EB_U32 vert16x16Index; + EB_U32 horz16x16Index; + EB_U32 block16x16X; + EB_U32 block16x16Y; + EB_U32 noiseOriginIndex; + EB_U32 lcuCodingOrder; - // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) - for (vert64x64Index = 0; vert64x64Index < (sixteenthDecimatedPicturePtr->height / 64); vert64x64Index++){ - for (horz64x64Index = 0; horz64x64Index < (sixteenthDecimatedPicturePtr->width / 64); horz64x64Index++){ + // Loop over 64x64 blocks on the downsampled domain (each block would contain 16 LCUs on the full sampled domain) + for (vert64x64Index = 0; vert64x64Index < (sixteenthDecimatedPicturePtr->height / 64); vert64x64Index++){ + for (horz64x64Index = 0; horz64x64Index < (sixteenthDecimatedPicturePtr->width / 64); horz64x64Index++){ - block64x64X = horz64x64Index * 64; - block64x64Y = vert64x64Index * 64; + block64x64X = horz64x64Index * 64; + block64x64Y = vert64x64Index * 64; - if (block64x64X == 0) - WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - sixteenthDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); + if (block64x64X == 0) + WeakLumaFilter_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + sixteenthDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); - if (block64x64Y + MAX_LCU_SIZE > sixteenthDecimatedPicturePtr->width) - { - noiseExtractLumaWeak( - sixteenthDecimatedPicturePtr, - denoisedPicturePtr, - noisePicturePtr, - block64x64Y, - block64x64X); - } + if (block64x64Y + MAX_LCU_SIZE > sixteenthDecimatedPicturePtr->width) + { + noiseExtractLumaWeak( + sixteenthDecimatedPicturePtr, + denoisedPicturePtr, + noisePicturePtr, + block64x64Y, + block64x64X); + } - // Loop over 16x16 blocks (i.e, 64x64 blocks in full resolution) - for (vert16x16Index = 0; vert16x16Index < 4; vert16x16Index++){ - for (horz16x16Index = 0; horz16x16Index < 4; horz16x16Index++){ + // Loop over 16x16 blocks (i.e, 64x64 blocks in full resolution) + for (vert16x16Index = 0; vert16x16Index < 4; vert16x16Index++){ + for (horz16x16Index = 0; horz16x16Index < 4; horz16x16Index++){ - block16x16X = block64x64X + horz16x16Index * 16; - block16x16Y = block64x64Y + vert16x16Index * 16; + block16x16X = block64x64X + horz16x16Index * 16; + block16x16Y = block64x64Y + vert16x16Index * 16; - //do it only for complete 16x16 blocks (i.e, complete 64x64 blocks in full resolution) - if (block16x16X + 16 <= sixteenthDecimatedPicturePtr->width && block16x16Y + 16 <= sixteenthDecimatedPicturePtr->height) - { + //do it only for complete 16x16 blocks (i.e, complete 64x64 blocks in full resolution) + if (block16x16X + 16 <= sixteenthDecimatedPicturePtr->width && block16x16Y + 16 <= sixteenthDecimatedPicturePtr->height) + { - lcuCodingOrder = ((vert64x64Index * 4) + vert16x16Index) * pictureWidthInLcu + ((horz64x64Index * 4) + horz16x16Index); + lcuCodingOrder = ((vert64x64Index * 4) + vert16x16Index) * pictureWidthInLcu + ((horz64x64Index * 4) + horz16x16Index); - EB_U64 noiseBlkVar8x8[4], denoiseBlkVar8x8[4]; + EB_U64 noiseBlkVar8x8[4], denoiseBlkVar8x8[4]; - noiseOriginIndex = noisePicturePtr->originX + block16x16X + noisePicturePtr->originY * noisePicturePtr->strideY; + noiseOriginIndex = noisePicturePtr->originX + block16x16X + noisePicturePtr->originY * noisePicturePtr->strideY; - EB_U64 noiseBlkVar = ComputeVariance16x16( - noisePicturePtr, - noiseOriginIndex, - noiseBlkVar8x8); + EB_U64 noiseBlkVar = ComputeVariance16x16( + noisePicturePtr, + noiseOriginIndex, + noiseBlkVar8x8); - picNoiseVariance += (noiseBlkVar >> 16); + picNoiseVariance += (noiseBlkVar >> 16); - blockIndex = (noisePicturePtr->originY + block16x16Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block16x16X; + blockIndex = (noisePicturePtr->originY + block16x16Y) * noisePicturePtr->strideY + noisePicturePtr->originX + block16x16X; - EB_U64 denBlkVar = ComputeVariance16x16( - denoisedPicturePtr, - blockIndex, - denoiseBlkVar8x8) >> 16; + EB_U64 denBlkVar = ComputeVariance16x16( + denoisedPicturePtr, + blockIndex, + denoiseBlkVar8x8) >> 16; EB_U64 noiseBlkVarDecTh ; EB_U64 denBlkVarDecTh = FLAT_MAX_VAR_DECIM; - if (pictureControlSetPtr->noiseDetectionTh == 1) { - noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_0; - } - else { - noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_1; - } - - if (denBlkVar < denBlkVarDecTh && noiseBlkVar> noiseBlkVarDecTh) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; - } - totLcuCount++; - } - } - } - } - } + if (pictureControlSetPtr->noiseDetectionTh == 1) { + noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_0; + } + else { + noiseBlkVarDecTh = NOISE_MIN_LEVEL_DECIM_1; + } + + if (denBlkVar < denBlkVarDecTh && noiseBlkVar> noiseBlkVarDecTh) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 1; + } + totLcuCount++; + } + } + } + } + } if (totLcuCount > 0) { contextPtr->picNoiseVarianceFloat = (double)picNoiseVariance / (double)totLcuCount; @@ -3172,51 +3172,51 @@ static EB_ERRORTYPE SubSampleDetectNoise( picNoiseVariance = picNoiseVariance / totLcuCount; } - //the variance of a 64x64 noise area tends to be bigger for small resolutions. - if (sequenceControlSetPtr->lumaHeight <= 720) - noiseTh = 25; - else if (sequenceControlSetPtr->lumaHeight <= 1080) - noiseTh = 10; - else - noiseTh = 0; - - //look for extreme noise or big enough flat noisy area to be denoised. - if (picNoiseVariance >= 55 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) - else if (picNoiseVariance >= 10 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) - else if (picNoiseVariance >= 5 + noiseTh) - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) - else - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) - - return return_error; + //the variance of a 64x64 noise area tends to be bigger for small resolutions. + if (sequenceControlSetPtr->lumaHeight <= 720) + noiseTh = 25; + else if (sequenceControlSetPtr->lumaHeight <= 1080) + noiseTh = 10; + else + noiseTh = 0; + + //look for extreme noise or big enough flat noisy area to be denoised. + if (picNoiseVariance >= 55 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3_1; //Noise+Edge information is too big, so may be this is all noise (action: frame based denoising) + else if (picNoiseVariance >= 10 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_3; //Noise+Edge information is big enough, so there is no big enough flat noisy area (action : no denoising) + else if (picNoiseVariance >= 5 + noiseTh) + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_2; //Noise+Edge information is relatively small, so there might be a big enough flat noisy area(action : denoising only for FN blocks) + else + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_1; //Noise+Edge information is very small, so no noise nor edge area (action : no denoising) + + return return_error; } static EB_ERRORTYPE QuarterSampleDenoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EB_U32 lcuTotalCount, - EB_BOOL denoiseFlag, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EB_U32 lcuTotalCount, + EB_BOOL denoiseFlag, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuCodingOrder; - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; + EB_U32 lcuCodingOrder; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; - //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes - for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; - } + //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes + for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; + } - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY Decimation2D( &inputPicturePtr->bufferY[inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY], @@ -3228,56 +3228,56 @@ static EB_ERRORTYPE QuarterSampleDenoise( 2); - QuarterSampleDetectNoise( - contextPtr, - pictureControlSetPtr, - quarterDecimatedPicturePtr, - noisePicturePtr, - denoisedPicturePtr, - pictureWidthInLcu); + QuarterSampleDetectNoise( + contextPtr, + pictureControlSetPtr, + quarterDecimatedPicturePtr, + noisePicturePtr, + denoisedPicturePtr, + pictureWidthInLcu); - if (denoiseFlag == EB_TRUE) { + if (denoiseFlag == EB_TRUE) { // Turn OFF the de-noiser for Class 2 at QP=29 and lower (for Fixed_QP) and at the target rate of 14Mbps and higher (for RC=ON) - if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { + if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { - SubSampleFilterNoise( - sequenceControlSetPtr, - pictureControlSetPtr, - inputPicturePtr, - noisePicturePtr, - denoisedPicturePtr); - } - } + SubSampleFilterNoise( + sequenceControlSetPtr, + pictureControlSetPtr, + inputPicturePtr, + noisePicturePtr, + denoisedPicturePtr); + } + } - return return_error; + return return_error; } static EB_ERRORTYPE HalfSampleDenoise( - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 lcuTotalCount, - EB_BOOL denoiseFlag, - EB_U32 pictureWidthInLcu) + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 lcuTotalCount, + EB_BOOL denoiseFlag, + EB_U32 pictureWidthInLcu) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lcuCodingOrder; - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; + EB_U32 lcuCodingOrder; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EbPictureBufferDesc_t *denoisedPicturePtr = contextPtr->denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr = contextPtr->noisePicturePtr; - //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes - for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { - pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; - } + //Reset the flat noise flag array to False for both RealTime/HighComplexity Modes + for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + pictureControlSetPtr->lcuFlatNoiseArray[lcuCodingOrder] = 0; + } - pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY + pictureControlSetPtr->picNoiseClass = PIC_NOISE_CLASS_INV; //this init is for both REAL-TIME and BEST-QUALITY Decimation2D( &inputPicturePtr->bufferY[inputPicturePtr->originX + inputPicturePtr->originY * inputPicturePtr->strideY], @@ -3288,30 +3288,30 @@ static EB_ERRORTYPE HalfSampleDenoise( sixteenthDecimatedPicturePtr->strideY, 4); - SubSampleDetectNoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - sixteenthDecimatedPicturePtr, - noisePicturePtr, - denoisedPicturePtr, - pictureWidthInLcu); + SubSampleDetectNoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + sixteenthDecimatedPicturePtr, + noisePicturePtr, + denoisedPicturePtr, + pictureWidthInLcu); - if (denoiseFlag == EB_TRUE) { + if (denoiseFlag == EB_TRUE) { - // Turn OFF the de-noiser for Class 2 at QP=29 and lower (for Fixed_QP) and at the target rate of 14Mbps and higher (for RC=ON) - if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { + // Turn OFF the de-noiser for Class 2 at QP=29 and lower (for Fixed_QP) and at the target rate of 14Mbps and higher (for RC=ON) + if ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_3_1) || ((pictureControlSetPtr->picNoiseClass == PIC_NOISE_CLASS_2) && ((sequenceControlSetPtr->staticConfig.rateControlMode == 0 && sequenceControlSetPtr->qp > DENOISER_QP_TH) || (sequenceControlSetPtr->staticConfig.rateControlMode != 0 && sequenceControlSetPtr->staticConfig.targetBitRate < DENOISER_BITRATE_TH)))) { - SubSampleFilterNoise( - sequenceControlSetPtr, - pictureControlSetPtr, - inputPicturePtr, - noisePicturePtr, - denoisedPicturePtr); - } - } + SubSampleFilterNoise( + sequenceControlSetPtr, + pictureControlSetPtr, + inputPicturePtr, + noisePicturePtr, + denoisedPicturePtr); + } + } - return return_error; + return return_error; } @@ -3322,14 +3322,14 @@ static EB_ERRORTYPE HalfSampleDenoise( ** Setting width and height for subpicture and when picture scan type is 1 ************************************************/ static void SetPictureParametersForStatisticsGathering( - SequenceControlSet_t *sequenceControlSetPtr - ) + SequenceControlSet_t *sequenceControlSetPtr + ) { - sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_WIDTH; - sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_HEIGHT; - sequenceControlSetPtr->pictureActivityRegionTh = HIGHER_THAN_CLASS_1_PICTURE_ACTIVITY_REGIONS_TH; + sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_WIDTH; + sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight = HIGHER_THAN_CLASS_1_REGION_SPLIT_PER_HEIGHT; + sequenceControlSetPtr->pictureActivityRegionTh = HIGHER_THAN_CLASS_1_PICTURE_ACTIVITY_REGIONS_TH; - return; + return; } /************************************************ @@ -3341,44 +3341,44 @@ static void SetPictureParametersForStatisticsGathering( ***** Denoising ************************************************/ static void PicturePreProcessingOperations( - PictureParentControlSet_t *pictureControlSetPtr, - PictureAnalysisContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 lcuTotalCount, - EB_U32 pictureWidthInLcu) + PictureParentControlSet_t *pictureControlSetPtr, + PictureAnalysisContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 lcuTotalCount, + EB_U32 pictureWidthInLcu) { - if (pictureControlSetPtr->noiseDetectionMethod == NOISE_DETECT_HALF_PRECISION) { - - HalfSampleDenoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - sixteenthDecimatedPicturePtr, - lcuTotalCount, - pictureControlSetPtr->enableDenoiseSrcFlag, - pictureWidthInLcu); - } + if (pictureControlSetPtr->noiseDetectionMethod == NOISE_DETECT_HALF_PRECISION) { + + HalfSampleDenoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + sixteenthDecimatedPicturePtr, + lcuTotalCount, + pictureControlSetPtr->enableDenoiseSrcFlag, + pictureWidthInLcu); + } else if (pictureControlSetPtr->noiseDetectionMethod == NOISE_DETECT_QUARTER_PRECISION) { - QuarterSampleDenoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - quarterDecimatedPicturePtr, - lcuTotalCount, - pictureControlSetPtr->enableDenoiseSrcFlag, - pictureWidthInLcu); - } else { - FullSampleDenoise( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - lcuTotalCount, - pictureControlSetPtr->enableDenoiseSrcFlag - ); - } - return; + QuarterSampleDenoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + quarterDecimatedPicturePtr, + lcuTotalCount, + pictureControlSetPtr->enableDenoiseSrcFlag, + pictureWidthInLcu); + } else { + FullSampleDenoise( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + lcuTotalCount, + pictureControlSetPtr->enableDenoiseSrcFlag + ); + } + return; } @@ -3387,59 +3387,59 @@ static void PicturePreProcessingOperations( * Calculation is done on a region based (Set previously, resolution dependent) **************************************************************/ static void SubSampleLumaGeneratePixelIntensityHistogramBins( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, EB_U64 *sumAverageIntensityTotalRegionsLuma){ - EB_U32 regionWidth; - EB_U32 regionHeight; - EB_U32 regionWidthOffset; - EB_U32 regionHeightOffset; - EB_U32 regionInPictureWidthIndex; - EB_U32 regionInPictureHeightIndex; - EB_U32 histogramBin; - EB_U64 sum; + EB_U32 regionWidth; + EB_U32 regionHeight; + EB_U32 regionWidthOffset; + EB_U32 regionHeightOffset; + EB_U32 regionInPictureWidthIndex; + EB_U32 regionInPictureHeightIndex; + EB_U32 histogramBin; + EB_U64 sum; - regionWidth = inputPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; - regionHeight = inputPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; + regionWidth = inputPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; + regionHeight = inputPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; - // Loop over regions inside the picture - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions + // Loop over regions inside the picture + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions - // Initialize bins to 1 - InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0], 64, 0, 1); + // Initialize bins to 1 + InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0], 64, 0, 1); - regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? - inputPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : - 0; + regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? + inputPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : + 0; - regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? - inputPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : - 0; + regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? + inputPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : + 0; - // Y Histogram - CalculateHistogram( - &inputPicturePtr->bufferY[(inputPicturePtr->originX + regionInPictureWidthIndex * regionWidth) + ((inputPicturePtr->originY + regionInPictureHeightIndex * regionHeight) * inputPicturePtr->strideY)], - regionWidth + regionWidthOffset, - regionHeight + regionHeightOffset, - inputPicturePtr->strideY, + // Y Histogram + CalculateHistogram( + &inputPicturePtr->bufferY[(inputPicturePtr->originX + regionInPictureWidthIndex * regionWidth) + ((inputPicturePtr->originY + regionInPictureHeightIndex * regionHeight) * inputPicturePtr->strideY)], + regionWidth + regionWidthOffset, + regionHeight + regionHeightOffset, + inputPicturePtr->strideY, 1, pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0], - &sum); + &sum); - pictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] = (EB_U8)((sum + (((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset)) >> 1)) / ((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset))); + pictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] = (EB_U8)((sum + (((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset)) >> 1)) / ((regionWidth + regionWidthOffset)*(regionHeight + regionHeightOffset))); (*sumAverageIntensityTotalRegionsLuma) += (sum << 4); for (histogramBin = 0; histogramBin < HISTOGRAM_NUMBER_OF_BINS; histogramBin++){ // Loop over the histogram bins - pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] = - pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] << 4; - } - } - } + pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] = + pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][histogramBin] << 4; + } + } + } - return; + return; } static void SubSampleChromaGeneratePixelIntensityHistogramBins( @@ -3469,8 +3469,8 @@ static void SubSampleChromaGeneratePixelIntensityHistogramBins( // Initialize bins to 1 - InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1], 64, 0, 1); - InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2], 64, 0, 1); + InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1], 64, 0, 1); + InitializeBuffer_32bits_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)](pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2], 64, 0, 1); regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? inputPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : @@ -3525,140 +3525,140 @@ static void SubSampleChromaGeneratePixelIntensityHistogramBins( } static void EdgeDetectionMeanLumaChroma16x16( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, PictureAnalysisContext_t *contextPtr, - EB_U32 totalLcuCount) + EB_U32 totalLcuCount) { - EB_U32 lcuIndex; - - - EB_U32 maxGrad = 1; - - // The values are calculated for every 4th frame - if ((pictureControlSetPtr->pictureNumber & 3) == 0){ - for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { - - LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; - - EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu) - - { - EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; - EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; - EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; - - EB_U8 rasterScanCuIndex; - - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { - EB_U8 cuIndex = rasterScanCuIndex - 5; - EB_U8 x = cuIndex & 3; - EB_U8 y = (cuIndex >> 2); - EB_S32 gradx = 0; - EB_S32 grady = 0; - EB_S32 nbcompx = 0; - EB_S32 nbcompy = 0; - if (x != 0) - { - gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 1])); - gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 1])); - gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 1])); - nbcompx++; - } - if (x != 3) - { - gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); - gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); - gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); - nbcompx++; - } - gradx = gradx / nbcompx; - - - if (y != 0) - { - grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 4])); - grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 4])); - grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 4])); - nbcompy++; - } - if (y != 3) - { - grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); - grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); - grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); - - nbcompy++; - } - - grady = grady / nbcompy; + EB_U32 lcuIndex; + + + EB_U32 maxGrad = 1; + + // The values are calculated for every 4th frame + if ((pictureControlSetPtr->pictureNumber & 3) == 0){ + for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { + + LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; + + EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu) + + { + EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; + EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; + EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; + + EB_U8 rasterScanCuIndex; + + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { + EB_U8 cuIndex = rasterScanCuIndex - 5; + EB_U8 x = cuIndex & 3; + EB_U8 y = (cuIndex >> 2); + EB_S32 gradx = 0; + EB_S32 grady = 0; + EB_S32 nbcompx = 0; + EB_S32 nbcompy = 0; + if (x != 0) + { + gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 1])); + gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 1])); + gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 1])); + nbcompx++; + } + if (x != 3) + { + gradx += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); + gradx += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); + gradx += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 1]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); + nbcompx++; + } + gradx = gradx / nbcompx; + + + if (y != 0) + { + grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex]) - (EB_S32)(yMeanPtr[rasterScanCuIndex - 4])); + grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex]) - (EB_S32)(crMeanPtr[rasterScanCuIndex - 4])); + grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex - 4])); + nbcompy++; + } + if (y != 3) + { + grady += ABS((EB_S32)(yMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(yMeanPtr[rasterScanCuIndex])); + grady += ABS((EB_S32)(crMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(crMeanPtr[rasterScanCuIndex])); + grady += ABS((EB_S32)(cbMeanPtr[rasterScanCuIndex + 4]) - (EB_S32)(cbMeanPtr[rasterScanCuIndex])); + + nbcompy++; + } + + grady = grady / nbcompy; contextPtr->grad[lcuIndex][rasterScanCuIndex] = (EB_U16) (ABS(gradx) + ABS(grady)); - if (contextPtr->grad[lcuIndex][rasterScanCuIndex] > maxGrad){ - maxGrad = contextPtr->grad[lcuIndex][rasterScanCuIndex]; - } - } - } - } - - for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu){ - LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; - - EB_U32 rasterScanCuIndex; - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { - lcuStatPtr->cuStatArray[rasterScanCuIndex].edgeCu = (EB_U16)MIN(((contextPtr->grad[lcuIndex][rasterScanCuIndex] * (255*3)) / maxGrad), 255) < 30 ? 0 : 1; - } - } - } - } - else{ - for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { - - LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; - - EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); - } - } + if (contextPtr->grad[lcuIndex][rasterScanCuIndex] > maxGrad){ + maxGrad = contextPtr->grad[lcuIndex][rasterScanCuIndex]; + } + } + } + } + + for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + if (lcuParams->potentialLogoLcu &&lcuParams->isCompleteLcu){ + LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; + + EB_U32 rasterScanCuIndex; + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { + lcuStatPtr->cuStatArray[rasterScanCuIndex].edgeCu = (EB_U16)MIN(((contextPtr->grad[lcuIndex][rasterScanCuIndex] * (255*3)) / maxGrad), 255) < 30 ? 0 : 1; + } + } + } + } + else{ + for (lcuIndex = 0; lcuIndex < totalLcuCount; lcuIndex++) { + + LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; + + EB_MEMSET(lcuStatPtr, 0, sizeof(LcuStat_t)); + } + } } /****************************************************** * Edge map derivation ******************************************************/ static void EdgeDetection( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U16 *variancePtr; - EB_U64 thrsldLevel0 = (pictureControlSetPtr->picAvgVariance * 70) / 100; - EB_U8 *meanPtr; - EB_U32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - EB_U32 pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - EB_U32 neighbourLcuIndex = 0; - EB_U64 similarityCount = 0; - EB_U64 similarityCount0 = 0; - EB_U64 similarityCount1 = 0; - EB_U64 similarityCount2 = 0; - EB_U64 similarityCount3 = 0; - EB_U32 lcu_X = 0; - EB_U32 lcu_Y = 0; - EB_U32 lcuIndex; - EB_BOOL highVarianceLucFlag; - - EB_U32 rasterScanCuIndex = 0; - EB_U32 numberOfEdgeLcu = 0; - EB_BOOL highIntensityLcuFlag; - - EB_U64 neighbourLcuMean; - EB_S32 i, j; - - EB_U8 highIntensityTh = 180; - EB_U8 lowIntensityTh = 120; + EB_U16 *variancePtr; + EB_U64 thrsldLevel0 = (pictureControlSetPtr->picAvgVariance * 70) / 100; + EB_U8 *meanPtr; + EB_U32 pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + EB_U32 pictureHeightInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + EB_U32 neighbourLcuIndex = 0; + EB_U64 similarityCount = 0; + EB_U64 similarityCount0 = 0; + EB_U64 similarityCount1 = 0; + EB_U64 similarityCount2 = 0; + EB_U64 similarityCount3 = 0; + EB_U32 lcu_X = 0; + EB_U32 lcu_Y = 0; + EB_U32 lcuIndex; + EB_BOOL highVarianceLucFlag; + + EB_U32 rasterScanCuIndex = 0; + EB_U32 numberOfEdgeLcu = 0; + EB_BOOL highIntensityLcuFlag; + + EB_U64 neighbourLcuMean; + EB_S32 i, j; + + EB_U8 highIntensityTh = 180; + EB_U8 lowIntensityTh = 120; EB_U8 highIntensityTh1 = 200; EB_U8 veryLowIntensityTh = 20; @@ -3674,16 +3674,16 @@ static void EdgeDetection( pictureControlSetPtr->edgeResultsPtr[lcuIndex].isolatedHighIntensityLcu = 0; pictureControlSetPtr->sharpEdgeLcuFlag[lcuIndex] = 0; - if (lcu_X > 0 && lcu_X < (EB_U32)(pictureWidthInLcu - 1) && lcu_Y > 0 && lcu_Y < (EB_U32)(pictureHeightInLcu - 1)){ + if (lcu_X > 0 && lcu_X < (EB_U32)(pictureWidthInLcu - 1) && lcu_Y > 0 && lcu_Y < (EB_U32)(pictureHeightInLcu - 1)){ - variancePtr = pictureControlSetPtr->variance[lcuIndex]; - meanPtr = pictureControlSetPtr->yMean[lcuIndex]; + variancePtr = pictureControlSetPtr->variance[lcuIndex]; + meanPtr = pictureControlSetPtr->yMean[lcuIndex]; - similarityCount = 0; + similarityCount = 0; - highVarianceLucFlag = - (variancePtr[RASTER_SCAN_CU_INDEX_64x64] > thrsldLevel0) ? EB_TRUE : EB_FALSE; + highVarianceLucFlag = + (variancePtr[RASTER_SCAN_CU_INDEX_64x64] > thrsldLevel0) ? EB_TRUE : EB_FALSE; edgeResultsPtr[lcuIndex].edgeBlockNum = highVarianceLucFlag; if (variancePtr[0] > highIntensityTh1){ EB_U8 sharpEdge = 0; @@ -3698,56 +3698,56 @@ static void EdgeDetection( } - if (lcu_X > 3 && lcu_X < (EB_U32)(pictureWidthInLcu - 4) && lcu_Y > 3 && lcu_Y < (EB_U32)(pictureHeightInLcu - 4)){ + if (lcu_X > 3 && lcu_X < (EB_U32)(pictureWidthInLcu - 4) && lcu_Y > 3 && lcu_Y < (EB_U32)(pictureHeightInLcu - 4)){ - highIntensityLcuFlag = - (meanPtr[RASTER_SCAN_CU_INDEX_64x64] > highIntensityTh) ? EB_TRUE : EB_FALSE; + highIntensityLcuFlag = + (meanPtr[RASTER_SCAN_CU_INDEX_64x64] > highIntensityTh) ? EB_TRUE : EB_FALSE; - if (highIntensityLcuFlag){ + if (highIntensityLcuFlag){ - neighbourLcuIndex = lcuIndex - 1; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + neighbourLcuIndex = lcuIndex - 1; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount0 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + similarityCount0 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - neighbourLcuIndex = lcuIndex + 1; + neighbourLcuIndex = lcuIndex + 1; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount1 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + similarityCount1 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - neighbourLcuIndex = lcuIndex - pictureWidthInLcu; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount2 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + neighbourLcuIndex = lcuIndex - pictureWidthInLcu; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + similarityCount2 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - neighbourLcuIndex = lcuIndex + pictureWidthInLcu; - neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; - similarityCount3 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; + neighbourLcuIndex = lcuIndex + pictureWidthInLcu; + neighbourLcuMean = pictureControlSetPtr->yMean[neighbourLcuIndex][RASTER_SCAN_CU_INDEX_64x64]; + similarityCount3 = (neighbourLcuMean < lowIntensityTh) ? 1 : 0; - similarityCount = similarityCount0 + similarityCount1 + similarityCount2 + similarityCount3; + similarityCount = similarityCount0 + similarityCount1 + similarityCount2 + similarityCount3; - if (similarityCount > 0){ + if (similarityCount > 0){ - for (i = -4; i < 5; i++){ - for (j = -4; j < 5; j++){ - neighbourLcuIndex = lcuIndex + (i * pictureWidthInLcu) + j; + for (i = -4; i < 5; i++){ + for (j = -4; j < 5; j++){ + neighbourLcuIndex = lcuIndex + (i * pictureWidthInLcu) + j; pictureControlSetPtr->edgeResultsPtr[neighbourLcuIndex].isolatedHighIntensityLcu = 1; - } - } - } - } - } + } + } + } + } + } if (highVarianceLucFlag){ numberOfEdgeLcu += edgeResultsPtr[lcuIndex].edgeBlockNum; - } - } - } + } + } + } - pictureControlSetPtr->lcuBlockPercentage = (EB_U8)((numberOfEdgeLcu * 100) / pictureControlSetPtr->lcuTotalCount); + pictureControlSetPtr->lcuBlockPercentage = (EB_U8)((numberOfEdgeLcu * 100) / pictureControlSetPtr->lcuTotalCount); - return; + return; } /****************************************************** @@ -3882,60 +3882,60 @@ static inline void DetermineHomogeneousRegionInPicture( ** Compute Block Mean for all blocks in the picture ************************************************/ static void ComputePictureSpatialStatistics( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, PictureAnalysisContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *inputPaddedPicturePtr, - EB_U32 lcuTotalCount) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *inputPaddedPicturePtr, + EB_U32 lcuTotalCount) { - EB_U32 lcuIndex; - EB_U32 lcuOriginX; // to avoid using child PCS - EB_U32 lcuOriginY; - EB_U32 inputLumaOriginIndex; - EB_U32 inputCbOriginIndex; - EB_U32 inputCrOriginIndex; - EB_U64 picTotVariance; - - // Variance - picTotVariance = 0; - - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + EB_U32 lcuIndex; + EB_U32 lcuOriginX; // to avoid using child PCS + EB_U32 lcuOriginY; + EB_U32 inputLumaOriginIndex; + EB_U32 inputCbOriginIndex; + EB_U32 inputCrOriginIndex; + EB_U64 picTotVariance; + + // Variance + picTotVariance = 0; + + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - lcuOriginX = lcuParams->originX; - lcuOriginY = lcuParams->originY; - inputLumaOriginIndex = (inputPaddedPicturePtr->originY + lcuOriginY) * inputPaddedPicturePtr->strideY + - inputPaddedPicturePtr->originX + lcuOriginX; + lcuOriginX = lcuParams->originX; + lcuOriginY = lcuParams->originY; + inputLumaOriginIndex = (inputPaddedPicturePtr->originY + lcuOriginY) * inputPaddedPicturePtr->strideY + + inputPaddedPicturePtr->originX + lcuOriginX; - inputCbOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCb + ((inputPicturePtr->originX + lcuOriginX) >> 1); - inputCrOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCr + ((inputPicturePtr->originX + lcuOriginX) >> 1); + inputCbOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCb + ((inputPicturePtr->originX + lcuOriginX) >> 1); + inputCrOriginIndex = ((inputPicturePtr->originY + lcuOriginY) >> 1) * inputPicturePtr->strideCr + ((inputPicturePtr->originX + lcuOriginX) >> 1); - ComputeBlockMeanComputeVariance( - pictureControlSetPtr, - inputPaddedPicturePtr, - lcuIndex, - inputLumaOriginIndex); + ComputeBlockMeanComputeVariance( + pictureControlSetPtr, + inputPaddedPicturePtr, + lcuIndex, + inputLumaOriginIndex); if (lcuParams->isCompleteLcu){ - ComputeChromaBlockMean( - pictureControlSetPtr, - inputPicturePtr, - lcuIndex, - inputCbOriginIndex, - inputCrOriginIndex); - } - else{ - ZeroOutChromaBlockMean( - pictureControlSetPtr, - lcuIndex); - } - - picTotVariance += (pictureControlSetPtr->variance[lcuIndex][RASTER_SCAN_CU_INDEX_64x64]); - } - - pictureControlSetPtr->picAvgVariance = (EB_U16) (picTotVariance / lcuTotalCount); + ComputeChromaBlockMean( + pictureControlSetPtr, + inputPicturePtr, + lcuIndex, + inputCbOriginIndex, + inputCrOriginIndex); + } + else{ + ZeroOutChromaBlockMean( + pictureControlSetPtr, + lcuIndex); + } + + picTotVariance += (pictureControlSetPtr->variance[lcuIndex][RASTER_SCAN_CU_INDEX_64x64]); + } + + pictureControlSetPtr->picAvgVariance = (EB_U16) (picTotVariance / lcuTotalCount); // Calculate the variance of variance to determine Homogeneous regions. Note: Variance calculation should be on. DetermineHomogeneousRegionInPicture( sequenceControlSetPtr, @@ -3947,21 +3947,21 @@ static void ComputePictureSpatialStatistics( contextPtr, sequenceControlSetPtr->lcuTotalCount); - EdgeDetection( - sequenceControlSetPtr, - pictureControlSetPtr); + EdgeDetection( + sequenceControlSetPtr, + pictureControlSetPtr); - return; + return; } static void CalculateInputAverageIntensity( SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EB_U64 sumAverageIntensityTotalRegionsLuma, - EB_U64 sumAverageIntensityTotalRegionsCb, - EB_U64 sumAverageIntensityTotalRegionsCr) + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr, + EB_U64 sumAverageIntensityTotalRegionsLuma, + EB_U64 sumAverageIntensityTotalRegionsCb, + EB_U64 sumAverageIntensityTotalRegionsCr) { if (sequenceControlSetPtr->scdMode == SCD_MODE_0){ @@ -3998,20 +3998,20 @@ static void CalculateInputAverageIntensity( ** Computing Picture Variance ************************************************/ static void GatheringPictureStatistics( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, PictureAnalysisContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *inputPaddedPicturePtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, - EB_U32 lcuTotalCount) + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *inputPaddedPicturePtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr, + EB_U32 lcuTotalCount) { - EB_U64 sumAverageIntensityTotalRegionsLuma = 0; - EB_U64 sumAverageIntensityTotalRegionsCb = 0; - EB_U64 sumAverageIntensityTotalRegionsCr = 0; + EB_U64 sumAverageIntensityTotalRegionsLuma = 0; + EB_U64 sumAverageIntensityTotalRegionsCb = 0; + EB_U64 sumAverageIntensityTotalRegionsCr = 0; - // Histogram bins + // Histogram bins // Use 1/16 Luma for Histogram generation // 1/16 input ready SubSampleLumaGeneratePixelIntensityHistogramBins( @@ -4029,7 +4029,7 @@ static void GatheringPictureStatistics( &sumAverageIntensityTotalRegionsCb, &sumAverageIntensityTotalRegionsCr); - // Calculate the LUMA average intensity + // Calculate the LUMA average intensity CalculateInputAverageIntensity( sequenceControlSetPtr, pictureControlSetPtr, @@ -4038,15 +4038,15 @@ static void GatheringPictureStatistics( sumAverageIntensityTotalRegionsCb, sumAverageIntensityTotalRegionsCr); - ComputePictureSpatialStatistics( - sequenceControlSetPtr, - pictureControlSetPtr, + ComputePictureSpatialStatistics( + sequenceControlSetPtr, + pictureControlSetPtr, contextPtr, - inputPicturePtr, - inputPaddedPicturePtr, - lcuTotalCount); + inputPicturePtr, + inputPaddedPicturePtr, + lcuTotalCount); - return; + return; } /************************************************ @@ -4054,34 +4054,34 @@ static void GatheringPictureStatistics( ** To match a multiple of min CU size in width and height ************************************************/ static void PadPictureToMultipleOfMinCuSizeDimensions( - SequenceControlSet_t *sequenceControlSetPtr, - EbPictureBufferDesc_t *inputPicturePtr) + SequenceControlSet_t *sequenceControlSetPtr, + EbPictureBufferDesc_t *inputPicturePtr) { EB_BOOL is16BitInput = (EB_BOOL)(sequenceControlSetPtr->staticConfig.encoderBitDepth > EB_8BIT); EB_U32 colorFormat = inputPicturePtr->colorFormat; EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - // Input Picture Padding - PadInputPicture( - &inputPicturePtr->bufferY[inputPicturePtr->originX + (inputPicturePtr->originY * inputPicturePtr->strideY)], - inputPicturePtr->strideY, - (inputPicturePtr->width - sequenceControlSetPtr->padRight), - (inputPicturePtr->height - sequenceControlSetPtr->padBottom), - sequenceControlSetPtr->padRight, - sequenceControlSetPtr->padBottom); - - PadInputPicture( - &inputPicturePtr->bufferCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb)], - inputPicturePtr->strideCb, + // Input Picture Padding + PadInputPicture( + &inputPicturePtr->bufferY[inputPicturePtr->originX + (inputPicturePtr->originY * inputPicturePtr->strideY)], + inputPicturePtr->strideY, + (inputPicturePtr->width - sequenceControlSetPtr->padRight), + (inputPicturePtr->height - sequenceControlSetPtr->padBottom), + sequenceControlSetPtr->padRight, + sequenceControlSetPtr->padBottom); + + PadInputPicture( + &inputPicturePtr->bufferCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCb)], + inputPicturePtr->strideCb, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, sequenceControlSetPtr->padRight >> subWidthCMinus1, sequenceControlSetPtr->padBottom >> subHeightCMinus1); - PadInputPicture( - &inputPicturePtr->bufferCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCr)], - inputPicturePtr->strideCr, + PadInputPicture( + &inputPicturePtr->bufferCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideCr)], + inputPicturePtr->strideCr, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, sequenceControlSetPtr->padRight >> subWidthCMinus1, @@ -4097,7 +4097,7 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( sequenceControlSetPtr->padBottom); PadInputPicture( - &inputPicturePtr->bufferBitIncCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCb)], + &inputPicturePtr->bufferBitIncCb[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCb)], inputPicturePtr->strideBitIncCb, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, @@ -4105,7 +4105,7 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( sequenceControlSetPtr->padBottom >> subHeightCMinus1); PadInputPicture( - &inputPicturePtr->bufferBitIncCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCr)], + &inputPicturePtr->bufferBitIncCr[(inputPicturePtr->originX >> subWidthCMinus1) + ((inputPicturePtr->originY >> subHeightCMinus1) * inputPicturePtr->strideBitIncCr)], inputPicturePtr->strideBitIncCr, (inputPicturePtr->width - sequenceControlSetPtr->padRight) >> subWidthCMinus1, (inputPicturePtr->height - sequenceControlSetPtr->padBottom) >> subHeightCMinus1, @@ -4114,7 +4114,7 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( } - return; + return; } /************************************************ @@ -4122,20 +4122,20 @@ static void PadPictureToMultipleOfMinCuSizeDimensions( ** To complete border LCU smaller than LCU size ************************************************/ static void PadPictureToMultipleOfLcuDimensions( - EbPictureBufferDesc_t *inputPaddedPicturePtr + EbPictureBufferDesc_t *inputPaddedPicturePtr ) { - // Generate Padding - GeneratePadding( - &inputPaddedPicturePtr->bufferY[0], - inputPaddedPicturePtr->strideY, - inputPaddedPicturePtr->width, - inputPaddedPicturePtr->height, - inputPaddedPicturePtr->originX, - inputPaddedPicturePtr->originY); + // Generate Padding + GeneratePadding( + &inputPaddedPicturePtr->bufferY[0], + inputPaddedPicturePtr->strideY, + inputPaddedPicturePtr->width, + inputPaddedPicturePtr->height, + inputPaddedPicturePtr->originX, + inputPaddedPicturePtr->originY); - return; + return; } /************************************************ @@ -4143,10 +4143,10 @@ static void PadPictureToMultipleOfLcuDimensions( ************************************************/ static void DecimateInputPicture( SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EbPictureBufferDesc_t *inputPaddedPicturePtr, - EbPictureBufferDesc_t *quarterDecimatedPicturePtr, - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr) { + PictureParentControlSet_t *pictureControlSetPtr, + EbPictureBufferDesc_t *inputPaddedPicturePtr, + EbPictureBufferDesc_t *quarterDecimatedPicturePtr, + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr) { // Decimate input picture for HME L1 EB_BOOL preformQuarterPellDecimationFlag; @@ -4164,42 +4164,42 @@ static void DecimateInputPicture( if (preformQuarterPellDecimationFlag) { Decimation2D( - &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], - inputPaddedPicturePtr->strideY, - inputPaddedPicturePtr->width , - inputPaddedPicturePtr->height, - &quarterDecimatedPicturePtr->bufferY[quarterDecimatedPicturePtr->originX+quarterDecimatedPicturePtr->originY*quarterDecimatedPicturePtr->strideY], - quarterDecimatedPicturePtr->strideY, - 2); + &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], + inputPaddedPicturePtr->strideY, + inputPaddedPicturePtr->width , + inputPaddedPicturePtr->height, + &quarterDecimatedPicturePtr->bufferY[quarterDecimatedPicturePtr->originX+quarterDecimatedPicturePtr->originY*quarterDecimatedPicturePtr->strideY], + quarterDecimatedPicturePtr->strideY, + 2); GeneratePadding( - &quarterDecimatedPicturePtr->bufferY[0], - quarterDecimatedPicturePtr->strideY, - quarterDecimatedPicturePtr->width, - quarterDecimatedPicturePtr->height, - quarterDecimatedPicturePtr->originX, - quarterDecimatedPicturePtr->originY); + &quarterDecimatedPicturePtr->bufferY[0], + quarterDecimatedPicturePtr->strideY, + quarterDecimatedPicturePtr->width, + quarterDecimatedPicturePtr->height, + quarterDecimatedPicturePtr->originX, + quarterDecimatedPicturePtr->originY); - } + } // Decimate input picture for HME L0 - // Sixteenth Input Picture Decimation + // Sixteenth Input Picture Decimation Decimation2D( - &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], - inputPaddedPicturePtr->strideY, - inputPaddedPicturePtr->width , - inputPaddedPicturePtr->height , - &sixteenthDecimatedPicturePtr->bufferY[sixteenthDecimatedPicturePtr->originX+sixteenthDecimatedPicturePtr->originY*sixteenthDecimatedPicturePtr->strideY], - sixteenthDecimatedPicturePtr->strideY, - 4); + &inputPaddedPicturePtr->bufferY[inputPaddedPicturePtr->originX + inputPaddedPicturePtr->originY * inputPaddedPicturePtr->strideY], + inputPaddedPicturePtr->strideY, + inputPaddedPicturePtr->width , + inputPaddedPicturePtr->height , + &sixteenthDecimatedPicturePtr->bufferY[sixteenthDecimatedPicturePtr->originX+sixteenthDecimatedPicturePtr->originY*sixteenthDecimatedPicturePtr->strideY], + sixteenthDecimatedPicturePtr->strideY, + 4); GeneratePadding( - &sixteenthDecimatedPicturePtr->bufferY[0], - sixteenthDecimatedPicturePtr->strideY, - sixteenthDecimatedPicturePtr->width, - sixteenthDecimatedPicturePtr->height, - sixteenthDecimatedPicturePtr->originX, - sixteenthDecimatedPicturePtr->originY); + &sixteenthDecimatedPicturePtr->bufferY[0], + sixteenthDecimatedPicturePtr->strideY, + sixteenthDecimatedPicturePtr->width, + sixteenthDecimatedPicturePtr->height, + sixteenthDecimatedPicturePtr->originX, + sixteenthDecimatedPicturePtr->originY); } /************************************************ @@ -4213,50 +4213,50 @@ static void DecimateInputPicture( ************************************************/ void* PictureAnalysisKernel(void *inputPtr) { - PictureAnalysisContext_t *contextPtr = (PictureAnalysisContext_t*)inputPtr; - PictureParentControlSet_t *pictureControlSetPtr; - SequenceControlSet_t *sequenceControlSetPtr; - - EbObjectWrapper_t *inputResultsWrapperPtr; - ResourceCoordinationResults_t *inputResultsPtr; - EbObjectWrapper_t *outputResultsWrapperPtr; - PictureAnalysisResults_t *outputResultsPtr; - EbPaReferenceObject_t *paReferenceObject; - - EbPictureBufferDesc_t *inputPaddedPicturePtr; - EbPictureBufferDesc_t *quarterDecimatedPicturePtr; - EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; - EbPictureBufferDesc_t *inputPicturePtr; - - // Variance - EB_U32 pictureWidthInLcu; - EB_U32 pictureHeighInLcu; - EB_U32 lcuTotalCount; - - for (;;) { - - // Get Input Full Object - EbGetFullObject( - contextPtr->resourceCoordinationResultsInputFifoPtr, - &inputResultsWrapperPtr); + PictureAnalysisContext_t *contextPtr = (PictureAnalysisContext_t*)inputPtr; + PictureParentControlSet_t *pictureControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; + + EbObjectWrapper_t *inputResultsWrapperPtr; + ResourceCoordinationResults_t *inputResultsPtr; + EbObjectWrapper_t *outputResultsWrapperPtr; + PictureAnalysisResults_t *outputResultsPtr; + EbPaReferenceObject_t *paReferenceObject; + + EbPictureBufferDesc_t *inputPaddedPicturePtr; + EbPictureBufferDesc_t *quarterDecimatedPicturePtr; + EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr; + + // Variance + EB_U32 pictureWidthInLcu; + EB_U32 pictureHeighInLcu; + EB_U32 lcuTotalCount; + + for (;;) { + + // Get Input Full Object + EbGetFullObject( + contextPtr->resourceCoordinationResultsInputFifoPtr, + &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - inputResultsPtr = (ResourceCoordinationResults_t*)inputResultsWrapperPtr->objectPtr; - pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + inputResultsPtr = (ResourceCoordinationResults_t*)inputResultsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld PA IN \n", pictureControlSetPtr->pictureNumber); #endif - paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; - inputPaddedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->inputPaddedPicturePtr; - quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; - sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; + paReferenceObject = (EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr; + inputPaddedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->inputPaddedPicturePtr; + quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->quarterDecimatedPicturePtr; + sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)paReferenceObject->sixteenthDecimatedPicturePtr; - // Variance - pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - pictureHeighInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; - lcuTotalCount = pictureWidthInLcu * pictureHeighInLcu; + // Variance + pictureWidthInLcu = (sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + pictureHeighInLcu = (sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize; + lcuTotalCount = pictureWidthInLcu * pictureHeighInLcu; #if PAREF_OUT // Backup the Y component data from input picture into PA reference picture, to work arond the race condition that @@ -4270,15 +4270,15 @@ void* PictureAnalysisKernel(void *inputPtr) #endif // Set picture parameters to account for subpicture, picture scantype, and set regions by resolutions - SetPictureParametersForStatisticsGathering( - sequenceControlSetPtr); + SetPictureParametersForStatisticsGathering( + sequenceControlSetPtr); - // Pad pictures to multiple min cu size - PadPictureToMultipleOfMinCuSizeDimensions( - sequenceControlSetPtr, - inputPicturePtr); + // Pad pictures to multiple min cu size + PadPictureToMultipleOfMinCuSizeDimensions( + sequenceControlSetPtr, + inputPicturePtr); - // Pre processing operations performed on the input picture + // Pre processing operations performed on the input picture PicturePreProcessingOperations( pictureControlSetPtr, contextPtr, @@ -4298,52 +4298,52 @@ void* PictureAnalysisKernel(void *inputPtr) pictureControlSetPtr->chromaDownSamplePicturePtr = inputPicturePtr; } - // Pad input picture to complete border LCUs - PadPictureToMultipleOfLcuDimensions( - inputPaddedPicturePtr + // Pad input picture to complete border LCUs + PadPictureToMultipleOfLcuDimensions( + inputPaddedPicturePtr ); - // 1/4 & 1/16 input picture decimation - DecimateInputPicture( + // 1/4 & 1/16 input picture decimation + DecimateInputPicture( sequenceControlSetPtr, - pictureControlSetPtr, - inputPaddedPicturePtr, - quarterDecimatedPicturePtr, - sixteenthDecimatedPicturePtr); - - // Gathering statistics of input picture, including Variance Calculation, Histogram Bins - GatheringPictureStatistics( - sequenceControlSetPtr, - pictureControlSetPtr, + pictureControlSetPtr, + inputPaddedPicturePtr, + quarterDecimatedPicturePtr, + sixteenthDecimatedPicturePtr); + + // Gathering statistics of input picture, including Variance Calculation, Histogram Bins + GatheringPictureStatistics( + sequenceControlSetPtr, + pictureControlSetPtr, contextPtr, - pictureControlSetPtr->chromaDownSamplePicturePtr, //420 inputPicturePtr - inputPaddedPicturePtr, - sixteenthDecimatedPicturePtr, - lcuTotalCount); + pictureControlSetPtr->chromaDownSamplePicturePtr, //420 inputPicturePtr + inputPaddedPicturePtr, + sixteenthDecimatedPicturePtr, + lcuTotalCount); - // Hold the 64x64 variance and mean in the reference frame - EB_U32 lcuIndex; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex){ - paReferenceObject->variance[lcuIndex] = pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64]; - paReferenceObject->yMean[lcuIndex] = pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64]; + // Hold the 64x64 variance and mean in the reference frame + EB_U32 lcuIndex; + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex){ + paReferenceObject->variance[lcuIndex] = pictureControlSetPtr->variance[lcuIndex][ME_TIER_ZERO_PU_64x64]; + paReferenceObject->yMean[lcuIndex] = pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64]; - } + } - // Get Empty Results Object - EbGetEmptyObject( - contextPtr->pictureAnalysisResultsOutputFifoPtr, - &outputResultsWrapperPtr); + // Get Empty Results Object + EbGetEmptyObject( + contextPtr->pictureAnalysisResultsOutputFifoPtr, + &outputResultsWrapperPtr); - outputResultsPtr = (PictureAnalysisResults_t*)outputResultsWrapperPtr->objectPtr; - outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; + outputResultsPtr = (PictureAnalysisResults_t*)outputResultsWrapperPtr->objectPtr; + outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld PA OUT \n", pictureControlSetPtr->pictureNumber); #endif - // Release the Input Results - EbReleaseObject(inputResultsWrapperPtr); + // Release the Input Results + EbReleaseObject(inputResultsWrapperPtr); #if LATENCY_PROFILE double latency = 0.0; @@ -4363,15 +4363,15 @@ void* PictureAnalysisKernel(void *inputPtr) pictureControlSetPtr->decodeOrder, latency); #endif - // Post the Full Results Object - EbPostFullObject(outputResultsWrapperPtr); + // Post the Full Results Object + EbPostFullObject(outputResultsWrapperPtr); - } - return EB_NULL; + } + return EB_NULL; } void UnusedVariablevoidFunc_PA() { - (void)SadCalculation_8x8_16x16_funcPtrArray; - (void)SadCalculation_32x32_64x64_funcPtrArray; + (void)SadCalculation_8x8_16x16_funcPtrArray; + (void)SadCalculation_32x32_64x64_funcPtrArray; } diff --git a/Source/Lib/Codec/EbPictureAnalysisProcess.h b/Source/Lib/Codec/EbPictureAnalysisProcess.h index b04345886..a05a0dc32 100644 --- a/Source/Lib/Codec/EbPictureAnalysisProcess.h +++ b/Source/Lib/Codec/EbPictureAnalysisProcess.h @@ -17,158 +17,158 @@ extern "C" { * Context **************************************/ typedef struct PictureAnalysisContext_s -{ - EB_ALIGN(64) EB_U8 localCache[64]; +{ + EB_ALIGN(64) EB_U8 localCache[64]; EbFifo_t *resourceCoordinationResultsInputFifoPtr; EbFifo_t *pictureAnalysisResultsOutputFifoPtr; - EbPictureBufferDesc_t *denoisedPicturePtr; - EbPictureBufferDesc_t *noisePicturePtr; - double picNoiseVarianceFloat; - EB_U16 **grad; + EbPictureBufferDesc_t *denoisedPicturePtr; + EbPictureBufferDesc_t *noisePicturePtr; + double picNoiseVarianceFloat; + EB_U16 **grad; } PictureAnalysisContext_t; /*************************************** * Extern Function Declaration ***************************************/ extern EB_ERRORTYPE PictureAnalysisContextCtor( - EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, - EB_BOOL denoiseFlag, + EbPictureBufferDescInitData_t * inputPictureBufferDescInitData, + EB_BOOL denoiseFlag, PictureAnalysisContext_t **contextDblPtr, EbFifo_t *resourceCoordinationResultsInputFifoPtr, EbFifo_t *pictureAnalysisResultsOutputFifoPtr, - EB_U16 lcuTotalCount); - + EB_U16 lcuTotalCount); + extern void* PictureAnalysisKernel(void *inputPtr); void noiseExtractLumaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractLumaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); typedef void(*EB_WEAKLUMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_WEAKLUMAFILTER_TYPE FUNC_TABLE WeakLumaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractLumaWeak, - // AVX2 - noiseExtractLumaWeak_AVX2_INTRIN, + // C_DEFAULT + noiseExtractLumaWeak, + // AVX2 + noiseExtractLumaWeak_AVX2_INTRIN, }; void noiseExtractLumaWeakLcu( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractLumaWeakLcu_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EbPictureBufferDesc_t *noisePicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EbPictureBufferDesc_t *noisePicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_WEAKLUMAFILTER_TYPE FUNC_TABLE WeakLumaFilterLcu_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractLumaWeakLcu, - // AVX2 - noiseExtractLumaWeakLcu_AVX2_INTRIN, + // C_DEFAULT + noiseExtractLumaWeakLcu, + // AVX2 + noiseExtractLumaWeakLcu_AVX2_INTRIN, }; void noiseExtractLumaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractLumaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); typedef void(*EB_STRONGLUMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_STRONGLUMAFILTER_TYPE FUNC_TABLE StrongLumaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractLumaStrong, - // AVX2 - noiseExtractLumaStrong_AVX2_INTRIN, + // C_DEFAULT + noiseExtractLumaStrong, + // AVX2 + noiseExtractLumaStrong_AVX2_INTRIN, }; void noiseExtractChromaStrong( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractChromaStrong_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); typedef void(*EB_STRONGCHROMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_STRONGCHROMAFILTER_TYPE FUNC_TABLE StrongChromaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractChromaStrong, - // AVX2 - noiseExtractChromaStrong_AVX2_INTRIN, + // C_DEFAULT + noiseExtractChromaStrong, + // AVX2 + noiseExtractChromaStrong_AVX2_INTRIN, }; void noiseExtractChromaWeak( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); void noiseExtractChromaWeak_AVX2_INTRIN( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX); typedef void(*EB_WEAKCHROMAFILTER_TYPE)( - EbPictureBufferDesc_t *inputPicturePtr, - EbPictureBufferDesc_t *denoisedPicturePtr, - EB_U32 lcuOriginY, - EB_U32 lcuOriginX - ); + EbPictureBufferDesc_t *inputPicturePtr, + EbPictureBufferDesc_t *denoisedPicturePtr, + EB_U32 lcuOriginY, + EB_U32 lcuOriginX + ); static EB_WEAKCHROMAFILTER_TYPE FUNC_TABLE WeakChromaFilter_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - noiseExtractChromaWeak, - // AVX2 - noiseExtractChromaWeak_AVX2_INTRIN, + // C_DEFAULT + noiseExtractChromaWeak, + // AVX2 + noiseExtractChromaWeak_AVX2_INTRIN, }; diff --git a/Source/Lib/Codec/EbPictureAnalysisResults.c b/Source/Lib/Codec/EbPictureAnalysisResults.c index d747474c3..cf2a10892 100644 --- a/Source/Lib/Codec/EbPictureAnalysisResults.c +++ b/Source/Lib/Codec/EbPictureAnalysisResults.c @@ -8,7 +8,7 @@ #include "EbPictureAnalysisResults.h" EB_ERRORTYPE PictureAnalysisResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureAnalysisResults_t *objectPtr; @@ -17,7 +17,7 @@ EB_ERRORTYPE PictureAnalysisResultCtor( *objectDblPtr = (EB_PTR) objectPtr; objectInitDataPtr = 0; (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureAnalysisResults.h b/Source/Lib/Codec/EbPictureAnalysisResults.h index 4c43fc289..e626798e3 100644 --- a/Source/Lib/Codec/EbPictureAnalysisResults.h +++ b/Source/Lib/Codec/EbPictureAnalysisResults.h @@ -29,10 +29,10 @@ typedef struct PictureAnalysisResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE PictureAnalysisResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbPictureBufferDesc.c b/Source/Lib/Codec/EbPictureBufferDesc.c index ace1e0cce..d2ff345cc 100644 --- a/Source/Lib/Codec/EbPictureBufferDesc.c +++ b/Source/Lib/Codec/EbPictureBufferDesc.c @@ -21,7 +21,7 @@ EB_ERRORTYPE EbPictureBufferDescCtor( EbPictureBufferDescInitData_t *pictureBufferDescInitDataPtr = (EbPictureBufferDescInitData_t*) objectInitDataPtr; EB_U32 bytesPerPixel = (pictureBufferDescInitDataPtr->bitDepth == EB_8BIT) ? 1 : 2; - + EB_MALLOC(EbPictureBufferDesc_t*, pictureBufferDescPtr, sizeof(EbPictureBufferDesc_t), EB_N_PTR); // Allocate the PictureBufferDesc Object @@ -38,13 +38,13 @@ EB_ERRORTYPE EbPictureBufferDescCtor( pictureBufferDescPtr->height = pictureBufferDescInitDataPtr->maxHeight; pictureBufferDescPtr->bitDepth = pictureBufferDescInitDataPtr->bitDepth; pictureBufferDescPtr->colorFormat = pictureBufferDescInitDataPtr->colorFormat; - pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; + pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; pictureBufferDescPtr->strideCb = pictureBufferDescPtr->strideCr = pictureBufferDescPtr->strideY >> subWidthCMinus1; - pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; - pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; + pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; + pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; - pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * - (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); + pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * + (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); pictureBufferDescPtr->chromaSize = pictureBufferDescPtr->lumaSize >> (3 - pictureBufferDescInitDataPtr->colorFormat); pictureBufferDescPtr->packedFlag = EB_FALSE; @@ -134,13 +134,13 @@ EB_ERRORTYPE EbReconPictureBufferDescCtor( pictureBufferDescPtr->height = pictureBufferDescInitDataPtr->maxHeight; pictureBufferDescPtr->bitDepth = pictureBufferDescInitDataPtr->bitDepth; pictureBufferDescPtr->colorFormat = pictureBufferDescInitDataPtr->colorFormat; - pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; + pictureBufferDescPtr->strideY = pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding; pictureBufferDescPtr->strideCb = pictureBufferDescPtr->strideCr = pictureBufferDescPtr->strideY >> subWidthCMinus1; - pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; - pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; + pictureBufferDescPtr->originX = pictureBufferDescInitDataPtr->leftPadding; + pictureBufferDescPtr->originY = pictureBufferDescInitDataPtr->topPadding; - pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * - (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); + pictureBufferDescPtr->lumaSize = (pictureBufferDescInitDataPtr->maxWidth + pictureBufferDescInitDataPtr->leftPadding + pictureBufferDescInitDataPtr->rightPadding) * + (pictureBufferDescInitDataPtr->maxHeight + pictureBufferDescInitDataPtr->topPadding + pictureBufferDescInitDataPtr->botPadding); pictureBufferDescPtr->chromaSize = pictureBufferDescPtr->lumaSize >> (3 - pictureBufferDescInitDataPtr->colorFormat); pictureBufferDescPtr->packedFlag = EB_FALSE; diff --git a/Source/Lib/Codec/EbPictureBufferDesc.h b/Source/Lib/Codec/EbPictureBufferDesc.h index 94674da8b..6d4f8981e 100644 --- a/Source/Lib/Codec/EbPictureBufferDesc.h +++ b/Source/Lib/Codec/EbPictureBufferDesc.h @@ -6,7 +6,7 @@ #ifndef EbPictureBuffer_h #define EbPictureBuffer_h -#include +#include #include "EbDefinitions.h" @@ -22,44 +22,44 @@ extern "C" { #define PICTURE_BUFFER_DESC_FULL_MASK (PICTURE_BUFFER_DESC_Y_FLAG | PICTURE_BUFFER_DESC_Cb_FLAG | PICTURE_BUFFER_DESC_Cr_FLAG) /************************************ - * EbPictureBufferDesc + * EbPictureBufferDesc ************************************/ typedef struct EbPictureBufferDesc_s -{ - // Buffer Ptrs - EB_BYTE bufferY; // Pointer to the Y luma buffer - EB_BYTE bufferCb; // Pointer to the U chroma buffer - EB_BYTE bufferCr; // Pointer to the V chroma buffer - //Bit increment - EB_BYTE bufferBitIncY; // Pointer to the Y luma buffer Bit increment - EB_BYTE bufferBitIncCb; // Pointer to the U chroma buffer Bit increment - EB_BYTE bufferBitIncCr; // Pointer to the V chroma buffer Bit increment - - EB_U16 strideY; // Pointer to the Y luma buffer - EB_U16 strideCb; // Pointer to the U chroma buffer - EB_U16 strideCr; // Pointer to the V chroma buffer - - EB_U16 strideBitIncY; // Pointer to the Y luma buffer Bit increment - EB_U16 strideBitIncCb; // Pointer to the U chroma buffer Bit increment - EB_U16 strideBitIncCr; // Pointer to the V chroma buffer Bit increment - - // Picture Parameters - EB_U16 originX; // Horizontal padding distance - EB_U16 originY; // Vertical padding distance - EB_U16 width; // Luma picture width which excludes the padding - EB_U16 height; // Luma picture height which excludes the padding - EB_U16 maxWidth; // Luma picture width - EB_U16 maxHeight; // Luma picture height - EB_BITDEPTH bitDepth; // Pixel Bit Depth +{ + // Buffer Ptrs + EB_BYTE bufferY; // Pointer to the Y luma buffer + EB_BYTE bufferCb; // Pointer to the U chroma buffer + EB_BYTE bufferCr; // Pointer to the V chroma buffer + //Bit increment + EB_BYTE bufferBitIncY; // Pointer to the Y luma buffer Bit increment + EB_BYTE bufferBitIncCb; // Pointer to the U chroma buffer Bit increment + EB_BYTE bufferBitIncCr; // Pointer to the V chroma buffer Bit increment + + EB_U16 strideY; // Pointer to the Y luma buffer + EB_U16 strideCb; // Pointer to the U chroma buffer + EB_U16 strideCr; // Pointer to the V chroma buffer + + EB_U16 strideBitIncY; // Pointer to the Y luma buffer Bit increment + EB_U16 strideBitIncCb; // Pointer to the U chroma buffer Bit increment + EB_U16 strideBitIncCr; // Pointer to the V chroma buffer Bit increment + + // Picture Parameters + EB_U16 originX; // Horizontal padding distance + EB_U16 originY; // Vertical padding distance + EB_U16 width; // Luma picture width which excludes the padding + EB_U16 height; // Luma picture height which excludes the padding + EB_U16 maxWidth; // Luma picture width + EB_U16 maxHeight; // Luma picture height + EB_BITDEPTH bitDepth; // Pixel Bit Depth EB_COLOR_FORMAT colorFormat; // Chroma subsampling format - // Buffer Parameters - EB_U32 lumaSize; // Size of the luma buffer - EB_U32 chromaSize; // Size of the chroma buffers - EB_BOOL packedFlag; // Indicates if sample buffers are packed or not + // Buffer Parameters + EB_U32 lumaSize; // Size of the luma buffer + EB_U32 chromaSize; // Size of the chroma buffers + EB_BOOL packedFlag; // Indicates if sample buffers are packed or not - EB_SEI_MESSAGE dolbyVisionRpu; - EB_SEI_MESSAGE userSeiMsg; + EB_SEI_MESSAGE dolbyVisionRpu; + EB_SEI_MESSAGE userSeiMsg; } EbPictureBufferDesc_t; @@ -73,23 +73,23 @@ typedef struct EbPictureBufferDescInitData_s EB_BITDEPTH bitDepth; EB_COLOR_FORMAT colorFormat; EB_U32 bufferEnableMask; - EB_U16 leftPadding; - EB_U16 rightPadding; - EB_U16 topPadding; - EB_U16 botPadding; + EB_U16 leftPadding; + EB_U16 rightPadding; + EB_U16 topPadding; + EB_U16 botPadding; EB_BOOL splitMode; //ON: allocate 8bit data separately from nbit data - + } EbPictureBufferDescInitData_t; /************************************** * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EbPictureBufferDescCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); extern EB_ERRORTYPE EbReconPictureBufferDescCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureControlSet.c b/Source/Lib/Codec/EbPictureControlSet.c index 30f2f53be..abb3fff8a 100644 --- a/Source/Lib/Codec/EbPictureControlSet.c +++ b/Source/Lib/Codec/EbPictureControlSet.c @@ -56,14 +56,14 @@ static void ConfigureLcuEdgeInfo(PictureParentControlSet_t *ppcsPtr) } EB_ERRORTYPE PictureControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureControlSet_t *objectPtr; PictureControlSetInitData_t *initDataPtr = (PictureControlSetInitData_t*) objectInitDataPtr; EbPictureBufferDescInitData_t inputPictureBufferDescInitData; - EbPictureBufferDescInitData_t coeffBufferDescInitData; + EbPictureBufferDescInitData_t coeffBufferDescInitData; // Max/Min CU Sizes const EB_U32 maxCuSize = initDataPtr->lcuSize; @@ -78,7 +78,7 @@ EB_ERRORTYPE PictureControlSetCtor( EB_U32 totalTileCount = initDataPtr->tileRowCount * initDataPtr->tileColumnCount; - + // LCUs EB_U16 lcuIndex; EB_U16 lcuOriginX; @@ -90,33 +90,33 @@ EB_ERRORTYPE PictureControlSetCtor( EB_U16 subHeightCMinus1 = (initDataPtr->colorFormat >= EB_YUV422 ? 1 : 2) - 1; EB_MALLOC(PictureControlSet_t*, objectPtr, sizeof(PictureControlSet_t), EB_N_PTR); - + // Init Picture Init data inputPictureBufferDescInitData.maxWidth = initDataPtr->pictureWidth; inputPictureBufferDescInitData.maxHeight = initDataPtr->pictureHeight; inputPictureBufferDescInitData.bitDepth = initDataPtr->bitDepth; inputPictureBufferDescInitData.colorFormat = initDataPtr->colorFormat; inputPictureBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; - inputPictureBufferDescInitData.leftPadding = 0; - inputPictureBufferDescInitData.rightPadding = 0; - inputPictureBufferDescInitData.topPadding = 0; - inputPictureBufferDescInitData.botPadding = 0; + inputPictureBufferDescInitData.leftPadding = 0; + inputPictureBufferDescInitData.rightPadding = 0; + inputPictureBufferDescInitData.topPadding = 0; + inputPictureBufferDescInitData.botPadding = 0; inputPictureBufferDescInitData.splitMode = EB_FALSE; - + coeffBufferDescInitData.maxWidth = initDataPtr->pictureWidth; coeffBufferDescInitData.maxHeight = initDataPtr->pictureHeight; coeffBufferDescInitData.bitDepth = EB_16BIT; coeffBufferDescInitData.colorFormat = initDataPtr->colorFormat; coeffBufferDescInitData.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; - coeffBufferDescInitData.leftPadding = 0; - coeffBufferDescInitData.rightPadding = 0; - coeffBufferDescInitData.topPadding = 0; - coeffBufferDescInitData.botPadding = 0; + coeffBufferDescInitData.leftPadding = 0; + coeffBufferDescInitData.rightPadding = 0; + coeffBufferDescInitData.topPadding = 0; + coeffBufferDescInitData.botPadding = 0; coeffBufferDescInitData.splitMode = EB_FALSE; *objectDblPtr = (EB_PTR) objectPtr; - + objectPtr->sequenceControlSetWrapperPtr = (EbObjectWrapper_t *)EB_NULL; objectPtr->colorFormat = initDataPtr->colorFormat; @@ -136,15 +136,15 @@ EB_ERRORTYPE PictureControlSetCtor( (EB_PTR*) &(objectPtr->reconPicturePtr), (EB_PTR ) &inputPictureBufferDescInitData); } - + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } - - // Cabaccost + + // Cabaccost EB_MALLOC(CabacCost_t*, objectPtr->cabacCost, sizeof(CabacCost_t), EB_N_PTR); - // Packetization process Bitstream + // Packetization process Bitstream return_error = BitstreamCtor( &objectPtr->bitstreamPtr, PACKETIZATION_PROCESS_BUFFER_SIZE); @@ -159,7 +159,7 @@ EB_ERRORTYPE PictureControlSetCtor( if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } - + // GOP objectPtr->pictureNumber = 0; objectPtr->temporalLayerIndex = 0; @@ -169,16 +169,16 @@ EB_ERRORTYPE PictureControlSetCtor( objectPtr->lcuMaxDepth = (EB_U8) initDataPtr->maxDepth; objectPtr->lcuTotalCount = pictureWidthInLcu * pictureHeightInLcu; EB_MALLOC(LargestCodingUnit_t**, objectPtr->lcuPtrArray, sizeof(LargestCodingUnit_t*) * objectPtr->lcuTotalCount, EB_N_PTR); - + lcuOriginX = 0; lcuOriginY = 0; for(lcuIndex=0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { - + return_error = LargestCodingUnitCtor( &(objectPtr->lcuPtrArray[lcuIndex]), (EB_U8)initDataPtr->lcuSize, - initDataPtr->pictureWidth, + initDataPtr->pictureWidth, initDataPtr->pictureHeight, (EB_U16)(lcuOriginX * maxCuSize), (EB_U16)(lcuOriginY * maxCuSize), @@ -197,9 +197,9 @@ EB_ERRORTYPE PictureControlSetCtor( // Mode Decision Control config EB_MALLOC(MdcLcuData_t*, objectPtr->mdcLcuArray, objectPtr->lcuTotalCount * sizeof(MdcLcuData_t), EB_N_PTR); objectPtr->qpArrayStride = (EB_U16)((initDataPtr->pictureWidth + MIN_CU_SIZE - 1) / MIN_CU_SIZE); - objectPtr->qpArraySize = ((initDataPtr->pictureWidth + MIN_CU_SIZE - 1) / MIN_CU_SIZE) * + objectPtr->qpArraySize = ((initDataPtr->pictureWidth + MIN_CU_SIZE - 1) / MIN_CU_SIZE) * ((initDataPtr->pictureHeight + MIN_CU_SIZE - 1) / MIN_CU_SIZE); - + // Allocate memory for vertical edge bS array EB_MALLOC(EB_U8**, objectPtr->verticalEdgeBSArray, sizeof(EB_U8*) * objectPtr->lcuTotalCount, EB_N_PTR); @@ -214,12 +214,12 @@ EB_ERRORTYPE PictureControlSetCtor( EB_MALLOC(EB_U8*, objectPtr->horizontalEdgeBSArray[lcuIndex], sizeof(EB_U8) * HORIZONTAL_EDGE_BS_ARRAY_SIZE, EB_N_PTR); } - // Allocate memory for qp array (used by DLF) + // Allocate memory for qp array (used by DLF) EB_MALLOC(EB_U8*, objectPtr->qpArray, sizeof(EB_U8) * objectPtr->qpArraySize, EB_N_PTR); EB_MALLOC(EB_U8*, objectPtr->entropyQpArray, sizeof(EB_U8) * objectPtr->qpArraySize, EB_N_PTR); - - // Allocate memory for cbf array (used by DLF) + + // Allocate memory for cbf array (used by DLF) EB_MALLOC(EB_U8*, objectPtr->cbfMapArray, sizeof(EB_U8) * ((initDataPtr->pictureWidth >> 2) * (initDataPtr->pictureHeight >> 2)), EB_N_PTR); // Jing: TO enable multi-tile, need to have neighbor per tile for EncodePass @@ -613,9 +613,9 @@ EB_ERRORTYPE PictureControlSetCtor( objectPtr->crQpOffset = 0; objectPtr->sliceLevelChromaQpFlag = EB_TRUE; - // slice level chroma QP offsets - objectPtr->sliceCbQpOffset = 0; - objectPtr->sliceCrQpOffset = 0; + // slice level chroma QP offsets + objectPtr->sliceCbQpOffset = 0; + objectPtr->sliceCrQpOffset = 0; //objectPtr->totalNumBits = 0; @@ -669,25 +669,25 @@ EB_ERRORTYPE PictureControlSetCtor( EB_ERRORTYPE PictureParentControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureParentControlSet_t *objectPtr; PictureControlSetInitData_t *initDataPtr = (PictureControlSetInitData_t*) objectInitDataPtr; - + EB_ERRORTYPE return_error = EB_ErrorNone; const EB_U16 pictureLcuWidth = (EB_U16)((initDataPtr->pictureWidth + initDataPtr->lcuSize - 1) / initDataPtr->lcuSize); const EB_U16 pictureLcuHeight = (EB_U16)((initDataPtr->pictureHeight + initDataPtr->lcuSize - 1) / initDataPtr->lcuSize); EB_U16 lcuIndex; - EB_U32 regionInPictureWidthIndex; - EB_U32 regionInPictureHeightIndex; + EB_U32 regionInPictureWidthIndex; + EB_U32 regionInPictureHeightIndex; EB_CALLOC(PictureParentControlSet_t*, objectPtr, sizeof(PictureParentControlSet_t), 1, EB_N_PTR); *objectDblPtr = (EB_PTR)objectPtr; // Jing: Tiles EB_U32 totalTileCount = initDataPtr->tileRowCount * initDataPtr->tileColumnCount; - EB_MALLOC(TileInfo_t*, objectPtr->tileInfoArray, sizeof(TileInfo_t) * totalTileCount, EB_N_PTR); + EB_MALLOC(TileInfo_t*, objectPtr->tileInfoArray, sizeof(TileInfo_t) * totalTileCount, EB_N_PTR); EB_MALLOC(TileGroupInfo_t*, objectPtr->tileGroupInfoArray, sizeof(TileGroupInfo_t) * totalTileCount, EB_N_PTR); objectPtr->pictureWidthInLcu = (EB_U16)((initDataPtr->pictureWidth + initDataPtr->lcuSize - 1) / initDataPtr->lcuSize); @@ -743,16 +743,16 @@ EB_ERRORTYPE PictureParentControlSetCtor( objectPtr->lastIdrPicture = 0; objectPtr->lcuTotalCount = pictureLcuWidth * pictureLcuHeight; - EB_MALLOC(EB_U16**, objectPtr->variance, sizeof(EB_U16*) * objectPtr->lcuTotalCount, EB_N_PTR); - EB_MALLOC(EB_U8**, objectPtr->yMean, sizeof(EB_U8*) * objectPtr->lcuTotalCount, EB_N_PTR); - EB_MALLOC(EB_U8**, objectPtr->cbMean, sizeof(EB_U8*) * objectPtr->lcuTotalCount, EB_N_PTR); - EB_MALLOC(EB_U8**, objectPtr->crMean, sizeof(EB_U8*) * objectPtr->lcuTotalCount, EB_N_PTR); - for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { - EB_MALLOC(EB_U16*, objectPtr->variance[lcuIndex], sizeof(EB_U16) * MAX_ME_PU_COUNT, EB_N_PTR); - EB_MALLOC(EB_U8*, objectPtr->yMean[lcuIndex], sizeof(EB_U8) * MAX_ME_PU_COUNT, EB_N_PTR); - EB_MALLOC(EB_U8*, objectPtr->cbMean[lcuIndex], sizeof(EB_U8) * 21, EB_N_PTR); - EB_MALLOC(EB_U8*, objectPtr->crMean[lcuIndex], sizeof(EB_U8) * 21, EB_N_PTR); - } + EB_MALLOC(EB_U16**, objectPtr->variance, sizeof(EB_U16*) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_U8**, objectPtr->yMean, sizeof(EB_U8*) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_U8**, objectPtr->cbMean, sizeof(EB_U8*) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_U8**, objectPtr->crMean, sizeof(EB_U8*) * objectPtr->lcuTotalCount, EB_N_PTR); + for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { + EB_MALLOC(EB_U16*, objectPtr->variance[lcuIndex], sizeof(EB_U16) * MAX_ME_PU_COUNT, EB_N_PTR); + EB_MALLOC(EB_U8*, objectPtr->yMean[lcuIndex], sizeof(EB_U8) * MAX_ME_PU_COUNT, EB_N_PTR); + EB_MALLOC(EB_U8*, objectPtr->cbMean[lcuIndex], sizeof(EB_U8) * 21, EB_N_PTR); + EB_MALLOC(EB_U8*, objectPtr->crMean[lcuIndex], sizeof(EB_U8) * 21, EB_N_PTR); + } //LCU edge info EB_MALLOC(LcuEdgeInfo_t*, objectPtr->lcuEdgeInfoArray, sizeof(LcuEdgeInfo_t) * objectPtr->lcuTotalCount, EB_N_PTR); @@ -763,72 +763,72 @@ EB_ERRORTYPE PictureParentControlSetCtor( EB_MALLOC(EB_U32****, objectPtr->pictureHistogram, sizeof(EB_U32***) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; regionInPictureWidthIndex++){ // loop over horizontal regions EB_MALLOC(EB_U32***, objectPtr->pictureHistogram[regionInPictureWidthIndex], sizeof(EB_U32**) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); - } + } - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; regionInPictureHeightIndex++){ // loop over vertical regions + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; regionInPictureHeightIndex++){ // loop over vertical regions EB_MALLOC(EB_U32**, objectPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex], sizeof(EB_U32*) * 3, EB_N_PTR); - } - } + } + } - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; regionInPictureHeightIndex++){ // loop over vertical regions - for (videoComponent = 0; videoComponent < 3; ++videoComponent) { + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; regionInPictureHeightIndex++){ // loop over vertical regions + for (videoComponent = 0; videoComponent < 3; ++videoComponent) { EB_MALLOC(EB_U32*, objectPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][videoComponent], sizeof(EB_U32) * HISTOGRAM_NUMBER_OF_BINS, EB_N_PTR); - } - } - } + } + } + } EB_U32 maxOisCand = MAX(MAX_OIS_0, MAX_OIS_2); - EB_MALLOC(OisCu32Cu16Results_t**, objectPtr->oisCu32Cu16Results, sizeof(OisCu32Cu16Results_t*) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(OisCu32Cu16Results_t**, objectPtr->oisCu32Cu16Results, sizeof(OisCu32Cu16Results_t*) * objectPtr->lcuTotalCount, EB_N_PTR); - for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex){ + for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex){ - EB_MALLOC(OisCu32Cu16Results_t*, objectPtr->oisCu32Cu16Results[lcuIndex], sizeof(OisCu32Cu16Results_t), EB_N_PTR); + EB_MALLOC(OisCu32Cu16Results_t*, objectPtr->oisCu32Cu16Results[lcuIndex], sizeof(OisCu32Cu16Results_t), EB_N_PTR); - OisCandidate_t* contigousCand; - EB_MALLOC(OisCandidate_t*, contigousCand, sizeof(OisCandidate_t) * maxOisCand * 21, EB_N_PTR); + OisCandidate_t* contigousCand; + EB_MALLOC(OisCandidate_t*, contigousCand, sizeof(OisCandidate_t) * maxOisCand * 21, EB_N_PTR); - EB_U32 cuIdx; - for (cuIdx = 0; cuIdx < 21; ++cuIdx){ - objectPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[cuIdx] = &contigousCand[cuIdx*maxOisCand]; - } - } + EB_U32 cuIdx; + for (cuIdx = 0; cuIdx < 21; ++cuIdx){ + objectPtr->oisCu32Cu16Results[lcuIndex]->sortedOisCandidate[cuIdx] = &contigousCand[cuIdx*maxOisCand]; + } + } - EB_MALLOC(OisCu8Results_t**, objectPtr->oisCu8Results, sizeof(OisCu8Results_t*) * objectPtr->lcuTotalCount, EB_N_PTR); - for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex){ + EB_MALLOC(OisCu8Results_t**, objectPtr->oisCu8Results, sizeof(OisCu8Results_t*) * objectPtr->lcuTotalCount, EB_N_PTR); + for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex){ - EB_MALLOC(OisCu8Results_t*, objectPtr->oisCu8Results[lcuIndex], sizeof(OisCu8Results_t), EB_N_PTR); + EB_MALLOC(OisCu8Results_t*, objectPtr->oisCu8Results[lcuIndex], sizeof(OisCu8Results_t), EB_N_PTR); - OisCandidate_t* contigousCand; - EB_MALLOC(OisCandidate_t*, contigousCand, sizeof(OisCandidate_t) * maxOisCand * 64, EB_N_PTR); + OisCandidate_t* contigousCand; + EB_MALLOC(OisCandidate_t*, contigousCand, sizeof(OisCandidate_t) * maxOisCand * 64, EB_N_PTR); - EB_U32 cuIdx; - for (cuIdx = 0; cuIdx < 64; ++cuIdx){ - objectPtr->oisCu8Results[lcuIndex]->sortedOisCandidate[cuIdx] = &contigousCand[cuIdx*maxOisCand]; - } - } + EB_U32 cuIdx; + for (cuIdx = 0; cuIdx < 64; ++cuIdx){ + objectPtr->oisCu8Results[lcuIndex]->sortedOisCandidate[cuIdx] = &contigousCand[cuIdx*maxOisCand]; + } + } // Motion Estimation Results - objectPtr->maxNumberOfPusPerLcu = SQUARE_PU_COUNT; + objectPtr->maxNumberOfPusPerLcu = SQUARE_PU_COUNT; objectPtr->maxNumberOfMeCandidatesPerPU = 3; - - EB_MALLOC(MeCuResults_t**, objectPtr->meResults, sizeof(MeCuResults_t*) * objectPtr->lcuTotalCount, EB_N_PTR); - for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { - EB_MALLOC(MeCuResults_t*, objectPtr->meResults[lcuIndex], sizeof(MeCuResults_t) * 85, EB_N_PTR); - } - EB_MALLOC(EB_U32*, objectPtr->rcMEdistortion, sizeof(EB_U32) * objectPtr->lcuTotalCount, EB_N_PTR); - + EB_MALLOC(MeCuResults_t**, objectPtr->meResults, sizeof(MeCuResults_t*) * objectPtr->lcuTotalCount, EB_N_PTR); + for (lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { + EB_MALLOC(MeCuResults_t*, objectPtr->meResults[lcuIndex], sizeof(MeCuResults_t) * 85, EB_N_PTR); + } + + EB_MALLOC(EB_U32*, objectPtr->rcMEdistortion, sizeof(EB_U32) * objectPtr->lcuTotalCount, EB_N_PTR); - // ME and OIS Distortion Histograms + + // ME and OIS Distortion Histograms EB_MALLOC(EB_U16*, objectPtr->meDistortionHistogram, sizeof(EB_U16) * NUMBER_OF_SAD_INTERVALS, EB_N_PTR); EB_MALLOC(EB_U16*, objectPtr->oisDistortionHistogram, sizeof(EB_U16) * NUMBER_OF_INTRA_SAD_INTERVALS, EB_N_PTR); @@ -836,10 +836,10 @@ EB_ERRORTYPE PictureParentControlSetCtor( EB_MALLOC(EB_U32*, objectPtr->intraSadIntervalIndex, sizeof(EB_U32) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_U32*, objectPtr->interSadIntervalIndex, sizeof(EB_U32) * objectPtr->lcuTotalCount, EB_N_PTR); - // Enhance background for base layer frames: zz SAD array - EB_MALLOC(EB_U8*, objectPtr->zzCostArray, sizeof(EB_U8) * objectPtr->lcuTotalCount * 64, EB_N_PTR); + // Enhance background for base layer frames: zz SAD array + EB_MALLOC(EB_U8*, objectPtr->zzCostArray, sizeof(EB_U8) * objectPtr->lcuTotalCount * 64, EB_N_PTR); - // Non moving index array + // Non moving index array EB_MALLOC(EB_U8*, objectPtr->nonMovingIndexArray, sizeof(EB_U8) * objectPtr->lcuTotalCount, EB_N_PTR); @@ -850,42 +850,42 @@ EB_ERRORTYPE PictureParentControlSetCtor( EB_MALLOC(EB_BOOL*, objectPtr->similarColocatedLcuArrayAllLayers, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); // LCU noise variance array - EB_MALLOC(EB_U8*, objectPtr->lcuFlatNoiseArray, sizeof(EB_U8) * objectPtr->lcuTotalCount, EB_N_PTR); - EB_MALLOC(EB_U64*, objectPtr->lcuVarianceOfVarianceOverTime, sizeof(EB_U64) * objectPtr->lcuTotalCount, EB_N_PTR); - EB_MALLOC(EB_BOOL*, objectPtr->isLcuHomogeneousOverTime, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_U8*, objectPtr->lcuFlatNoiseArray, sizeof(EB_U8) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_U64*, objectPtr->lcuVarianceOfVarianceOverTime, sizeof(EB_U64) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_BOOL*, objectPtr->isLcuHomogeneousOverTime, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EdgeLcuResults_t*, objectPtr->edgeResultsPtr, sizeof(EdgeLcuResults_t) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_U8*, objectPtr->sharpEdgeLcuFlag, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_U8*, objectPtr->failingMotionLcuFlag, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); - EB_MALLOC(EB_BOOL*, objectPtr->uncoveredAreaLcuFlag, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_BOOL*, objectPtr->uncoveredAreaLcuFlag, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_BOOL*, objectPtr->lcuHomogeneousAreaArray, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); - + EB_MALLOC(EB_U64**, objectPtr->varOfVar32x32BasedLcuArray, sizeof(EB_U64*) * objectPtr->lcuTotalCount, EB_N_PTR); - for(lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { + for(lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { EB_MALLOC(EB_U64*, objectPtr->varOfVar32x32BasedLcuArray[lcuIndex], sizeof(EB_U64) * 4, EB_N_PTR); } - EB_MALLOC(EB_U8*, objectPtr->cmplxStatusLcu, sizeof(EB_U8) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(EB_U8*, objectPtr->cmplxStatusLcu, sizeof(EB_U8) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_BOOL*, objectPtr->lcuIsolatedNonHomogeneousAreaArray, sizeof(EB_BOOL) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_U64**, objectPtr->lcuYSrcEnergyCuArray, sizeof(EB_U64*) * objectPtr->lcuTotalCount, EB_N_PTR); - for(lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { + for(lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { EB_MALLOC(EB_U64*, objectPtr->lcuYSrcEnergyCuArray[lcuIndex], sizeof(EB_U64) * 5, EB_N_PTR); } EB_MALLOC(EB_U64**, objectPtr->lcuYSrcMeanCuArray, sizeof(EB_U64*) * objectPtr->lcuTotalCount, EB_N_PTR); - for(lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { + for(lcuIndex = 0; lcuIndex < objectPtr->lcuTotalCount; ++lcuIndex) { EB_MALLOC(EB_U64*, objectPtr->lcuYSrcMeanCuArray[lcuIndex], sizeof(EB_U64) * 5, EB_N_PTR); } EB_MALLOC(EB_U8*, objectPtr->lcuCmplxContrastArray, sizeof(EB_U8) * objectPtr->lcuTotalCount, EB_N_PTR); - EB_MALLOC(LcuStat_t*, objectPtr->lcuStatArray, sizeof(LcuStat_t) * objectPtr->lcuTotalCount, EB_N_PTR); + EB_MALLOC(LcuStat_t*, objectPtr->lcuStatArray, sizeof(LcuStat_t) * objectPtr->lcuTotalCount, EB_N_PTR); EB_MALLOC(EB_LCU_COMPLEXITY_STATUS*, objectPtr->complexLcuArray, sizeof(EB_LCU_COMPLEXITY_STATUS) * objectPtr->lcuTotalCount, EB_N_PTR); EB_CREATEMUTEX(EB_HANDLE, objectPtr->rcDistortionHistogramMutex, sizeof(EB_HANDLE), EB_MUTEX); - + EB_MALLOC(EB_LCU_DEPTH_MODE*, objectPtr->lcuMdModeArray, sizeof(EB_LCU_DEPTH_MODE) * objectPtr->lcuTotalCount, EB_N_PTR); diff --git a/Source/Lib/Codec/EbPictureControlSet.h b/Source/Lib/Codec/EbPictureControlSet.h index afd84aed1..0938c6231 100644 --- a/Source/Lib/Codec/EbPictureControlSet.h +++ b/Source/Lib/Codec/EbPictureControlSet.h @@ -28,9 +28,9 @@ extern "C" { #define SEGMENT_ENTROPY_BUFFER_SIZE 0x989680// Entropy Bitstream Buffer Size #define PACKETIZATION_PROCESS_BUFFER_SIZE 0x001000 // Bitstream used to code SPS, PPS, etc. #define EOS_NAL_BUFFER_SIZE 0x0010 // Bitstream used to code EOS NAL -#define HISTOGRAM_NUMBER_OF_BINS 256 -#define MAX_NUMBER_OF_REGIONS_IN_WIDTH 4 -#define MAX_NUMBER_OF_REGIONS_IN_HEIGHT 4 +#define HISTOGRAM_NUMBER_OF_BINS 256 +#define MAX_NUMBER_OF_REGIONS_IN_WIDTH 4 +#define MAX_NUMBER_OF_REGIONS_IN_HEIGHT 4 #define MAX_REF_QP_NUM 52 @@ -38,7 +38,7 @@ extern "C" { #define SEGMENT_MAX_COUNT 64 #define SEGMENT_COMPLETION_MASK_SET(mask, index) MULTI_LINE_MACRO_BEGIN (mask) |= (((EB_U64) 1) << (index)); MULTI_LINE_MACRO_END #define SEGMENT_COMPLETION_MASK_TEST(mask, totalCount) ((mask) == ((((EB_U64) 1) << (totalCount)) - 1)) -#define SEGMENT_ROW_COMPLETION_TEST(mask, rowIndex, width) ((((mask) >> ((rowIndex) * (width))) & ((1ull << (width))-1)) == ((1ull << (width))-1)) +#define SEGMENT_ROW_COMPLETION_TEST(mask, rowIndex, width) ((((mask) >> ((rowIndex) * (width))) & ((1ull << (width))-1)) == ((1ull << (width))-1)) #define SEGMENT_CONVERT_IDX_TO_XY(index, x, y, picWidthInLcu) \ MULTI_LINE_MACRO_BEGIN \ (y) = (index) / (picWidthInLcu); \ @@ -62,7 +62,7 @@ extern "C" { struct PredictionUnit_s; #define MAX_NUMBER_OF_SLICES_PER_PICTURE 16 -typedef struct InLoopFilterSliceData_s +typedef struct InLoopFilterSliceData_s { EB_U8 betaOffset; EB_U8 tcOffset; @@ -79,18 +79,18 @@ typedef struct InLoopFilterSliceData_s * Segment-based Control Sets **************************************/ -typedef struct EbMdcLeafData_s +typedef struct EbMdcLeafData_s { EB_U8 leafIndex; EB_BOOL splitFlag; -} EbMdcLeafData_t; +} EbMdcLeafData_t; typedef struct MdcLcuData_s { // Rate Control EB_U8 qp; - + // ME Results EB_U64 treeblockVariance; @@ -111,15 +111,15 @@ typedef struct BdpCuData_s /************************************** * MD Segment Control **************************************/ -typedef struct MdSegmentCtrl_s +typedef struct MdSegmentCtrl_s { EB_U64 completionMask; EB_HANDLE writeLockMutex; - + EB_U32 totalCount; EB_U32 columnCount; EB_U32 rowCount; - + EB_BOOL inProgress; EB_U32 currentRowIdx; @@ -139,28 +139,28 @@ typedef struct EntropyTileInfo_s EB_S8 entropyCodingRowCount; EB_HANDLE entropyCodingMutex; EB_BOOL entropyCodingInProgress; - EB_BOOL entropyCodingPicDone; + EB_BOOL entropyCodingPicDone; EntropyCoder_t *entropyCoderPtr; } EntropyTileInfo; -typedef struct PictureControlSet_s +typedef struct PictureControlSet_s { EbObjectWrapper_t *sequenceControlSetWrapperPtr; EbPictureBufferDesc_t *reconPicturePtr; - + EbPictureBufferDesc_t *reconPicture16bitPtr; - + // Packetization (used to encode SPS, PPS, etc) Bitstream_t *bitstreamPtr; - + // Reference Lists EbObjectWrapper_t *refPicPtrArray[MAX_NUM_OF_REF_PIC_LIST]; EB_U8 refPicQpArray[MAX_NUM_OF_REF_PIC_LIST]; - EB_PICTURE refSliceTypeArray[MAX_NUM_OF_REF_PIC_LIST]; - + EB_PICTURE refSliceTypeArray[MAX_NUM_OF_REF_PIC_LIST]; + // GOP - EB_U64 pictureNumber; + EB_U64 pictureNumber; EB_U8 temporalLayerIndex; EB_U8 temporalId; @@ -186,12 +186,12 @@ typedef struct PictureControlSet_s // Slice Type EB_PICTURE sliceType; - + // Rate Control EB_U8 pictureQp; EB_U8 difCuDeltaQpDepth; EB_U8 useDeltaQp; - + // LCU Array EB_U8 lcuMaxDepth; EB_U16 lcuTotalCount; @@ -213,10 +213,10 @@ typedef struct PictureControlSet_s // Enc/DecQP Assignment EB_U8 encPrevCodedQp[EB_TILE_MAX_COUNT][MAX_PICTURE_HEIGHT_SIZE / MAX_LCU_SIZE]; EB_U8 encPrevQuantGroupCodedQp[EB_TILE_MAX_COUNT][MAX_PICTURE_HEIGHT_SIZE / MAX_LCU_SIZE]; - - // EncDec Entropy Coder (for rate estimation) + + // EncDec Entropy Coder (for rate estimation) EntropyCoder_t *coeffEstEntropyCoderPtr; - CabacCost_t *cabacCost; + CabacCost_t *cabacCost; // Mode Decision Neighbor Arrays NeighborArrayUnit_t **mdIntraLumaModeNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; @@ -224,16 +224,16 @@ typedef struct PictureControlSet_s NeighborArrayUnit_t **mdSkipFlagNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; NeighborArrayUnit_t **mdModeTypeNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; NeighborArrayUnit_t **mdLeafDepthNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; - NeighborArrayUnit_t **mdLumaReconNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; - NeighborArrayUnit_t **mdCbReconNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; - NeighborArrayUnit_t **mdCrReconNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; + NeighborArrayUnit_t **mdLumaReconNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; + NeighborArrayUnit_t **mdCbReconNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; + NeighborArrayUnit_t **mdCrReconNeighborArray[NEIGHBOR_ARRAY_TOTAL_COUNT]; - // Mode Decision Refinement Neighbor Arrays - NeighborArrayUnit_t **mdRefinementIntraLumaModeNeighborArray; - NeighborArrayUnit_t **mdRefinementModeTypeNeighborArray; - NeighborArrayUnit_t **mdRefinementLumaReconNeighborArray; + // Mode Decision Refinement Neighbor Arrays + NeighborArrayUnit_t **mdRefinementIntraLumaModeNeighborArray; + NeighborArrayUnit_t **mdRefinementModeTypeNeighborArray; + NeighborArrayUnit_t **mdRefinementLumaReconNeighborArray; - // Encode Pass Neighbor Arrays + // Encode Pass Neighbor Arrays NeighborArrayUnit_t **epIntraLumaModeNeighborArray; NeighborArrayUnit_t **epMvNeighborArray; NeighborArrayUnit_t **epSkipFlagNeighborArray; @@ -247,7 +247,7 @@ typedef struct PictureControlSet_s NeighborArrayUnit_t **epCbReconNeighborArray16bit; NeighborArrayUnit_t **epCrReconNeighborArray16bit; - // AMVP & MV Merge Neighbor Arrays + // AMVP & MV Merge Neighbor Arrays //NeighborArrayUnit_t *amvpMvMergeMvNeighborArray; //NeighborArrayUnit_t *amvpMvMergeModeTypeNeighborArray; @@ -265,22 +265,22 @@ typedef struct PictureControlSet_s EB_BOOL sliceLevelChromaQpFlag; - // slice level chroma QP offsets - EB_S8 sliceCbQpOffset; - EB_S8 sliceCrQpOffset; + // slice level chroma QP offsets + EB_S8 sliceCbQpOffset; + EB_S8 sliceCrQpOffset; - EB_S8 cbQpOffset; - EB_S8 crQpOffset; + EB_S8 cbQpOffset; + EB_S8 crQpOffset; - struct PictureParentControlSet_s *ParentPcsPtr;//The parent of this PCS. - EbObjectWrapper_t *PictureParentControlSetWrapperPtr; - EB_S8 betaOffset; - EB_S8 tcOffset; + struct PictureParentControlSet_s *ParentPcsPtr;//The parent of this PCS. + EbObjectWrapper_t *PictureParentControlSetWrapperPtr; + EB_S8 betaOffset; + EB_S8 tcOffset; - EB_U8 highIntraSlection; + EB_U8 highIntraSlection; - EB_FRAME_CARACTERICTICS sceneCaracteristicId; - EB_BOOL adjustMinQPFlag; + EB_FRAME_CARACTERICTICS sceneCaracteristicId; + EB_BOOL adjustMinQPFlag; EB_ENC_MODE encMode; EB_BOOL bdpPresentFlag; @@ -295,33 +295,33 @@ typedef struct PictureControlSet_s // To study speed-memory trade-offs typedef struct LcuParameters_s { - EB_U8 horizontalIndex; - EB_U8 verticalIndex; - EB_U16 originX; - EB_U16 originY; - EB_U8 width; - EB_U8 height; - EB_U8 isCompleteLcu; - EB_BOOL rasterScanCuValidity[CU_MAX_COUNT]; + EB_U8 horizontalIndex; + EB_U8 verticalIndex; + EB_U16 originX; + EB_U16 originY; + EB_U8 width; + EB_U8 height; + EB_U8 isCompleteLcu; + EB_BOOL rasterScanCuValidity[CU_MAX_COUNT]; EB_U8 potentialLogoLcu; - EB_U8 isEdgeLcu; + EB_U8 isEdgeLcu; } LcuParams_t; typedef struct CuStat_s { - EB_BOOL grassArea; - EB_BOOL skinArea; + EB_BOOL grassArea; + EB_BOOL skinArea; - EB_BOOL highChroma; - EB_BOOL highLuma; + EB_BOOL highChroma; + EB_BOOL highLuma; - EB_U16 edgeCu; + EB_U16 edgeCu; EB_U16 similarEdgeCount; EB_U16 pmSimilarEdgeCount; } CuStat_t; typedef struct LcuStat_s { - CuStat_t cuStatArray[CU_MAX_COUNT]; + CuStat_t cuStatArray[CU_MAX_COUNT]; EB_U8 stationaryEdgeOverTimeFlag; EB_U8 pmStationaryEdgeOverTimeFlag; @@ -344,15 +344,15 @@ typedef struct TileGroupInfo_s { EB_U16 tileGroupHeightInLcu; } TileGroupInfo_t; - + //CHKN // Add the concept of PictureParentControlSet which is a subset of the old PictureControlSet. // It actually holds only high level Pciture based control data:(GOP management,when to start a picture, when to release the PCS, ....). // The regular PictureControlSet(Child) will be dedicated to store LCU based encoding results and information. // Parent is created before the Child, and continue to live more. Child PCS only lives the exact time needed to encode the picture: from ME to EC/ALF. -typedef struct PictureParentControlSet_s +typedef struct PictureParentControlSet_s { - EbObjectWrapper_t *sequenceControlSetWrapperPtr; + EbObjectWrapper_t *sequenceControlSetWrapperPtr; EbObjectWrapper_t *inputPictureWrapperPtr; EbObjectWrapper_t *referencePictureWrapperPtr; EbObjectWrapper_t *paReferencePictureWrapperPtr; @@ -360,13 +360,13 @@ typedef struct PictureParentControlSet_s EB_BOOL idrFlag; EB_BOOL craFlag; EB_BOOL openGopCraFlag; - EB_BOOL sceneChangeFlag; - EB_BOOL endOfSequenceFlag; + EB_BOOL sceneChangeFlag; + EB_BOOL endOfSequenceFlag; - EB_U8 pictureQp; - EB_U64 pictureNumber; + EB_U8 pictureQp; + EB_U64 pictureNumber; - EbPictureBufferDesc_t *enhancedPicturePtr; + EbPictureBufferDesc_t *enhancedPicturePtr; EbPictureBufferDesc_t *chromaDownSamplePicturePtr; EB_PICNOISE_CLASS picNoiseClass; @@ -375,16 +375,16 @@ typedef struct PictureParentControlSet_s EbObjectWrapper_t *ebInputWrapperPtr; - EB_PICTURE sliceType; + EB_PICTURE sliceType; NalUnitType nalUnit; - EB_U8 predStructIndex; - EB_BOOL useRpsInSps; - EB_U8 referenceStructIndex; - EB_U8 temporalLayerIndex; - EB_U64 decodeOrder; + EB_U8 predStructIndex; + EB_BOOL useRpsInSps; + EB_U8 referenceStructIndex; + EB_U8 temporalLayerIndex; + EB_U64 decodeOrder; EB_BOOL isUsedAsReferenceFlag; - EB_U8 refList0Count; - EB_U8 refList1Count; + EB_U8 refList0Count; + EB_U8 refList1Count; PredictionStructure_t *predStructPtr; // need to check struct PictureParentControlSet_s *refPaPcsArray[MAX_NUM_OF_REF_PIC_LIST]; EbObjectWrapper_t *pPcsWrapperPtr; @@ -393,7 +393,7 @@ typedef struct PictureParentControlSet_s EB_U32 tileUniformSpacing; EB_U16 tileColumnCount; EB_U16 tileRowCount; - EB_U16 tileRowStartLcu[EB_TILE_ROW_MAX_COUNT + 1]; //plus one to calculate the width/height of last + EB_U16 tileRowStartLcu[EB_TILE_ROW_MAX_COUNT + 1]; //plus one to calculate the width/height of last EB_U16 tileColStartLcu[EB_TILE_COLUMN_MAX_COUNT + 1]; EB_U16 pictureWidthInLcu; EB_U16 pictureHeightInLcu; @@ -430,7 +430,7 @@ typedef struct PictureParentControlSet_s EB_BOOL qpOnTheFly; - EB_U8 calculatedQp; + EB_U8 calculatedQp; EB_U8 intraSelectedOrgQp; EB_U64 sadMe; @@ -438,34 +438,34 @@ typedef struct PictureParentControlSet_s EB_U64 quantizedCoeffNumBits; EB_U64 targetBits; EB_U64 averageQp; - + EB_U64 lastIdrPicture; EB_U64 startTimeSeconds; EB_U64 startTimeuSeconds; - EB_U32 lumaSse; - EB_U32 crSse; - EB_U32 cbSse; - + EB_U32 lumaSse; + EB_U32 crSse; + EB_U32 cbSse; + // PA EB_U32 preAssignmentBufferCount; - EbObjectWrapper_t *refPaPicPtrArray[MAX_NUM_OF_REF_PIC_LIST]; + EbObjectWrapper_t *refPaPicPtrArray[MAX_NUM_OF_REF_PIC_LIST]; EB_U64 refPicPocArray[MAX_NUM_OF_REF_PIC_LIST]; EB_U16 **variance; - - EB_U8 **yMean; - EB_U8 **cbMean; - EB_U8 **crMean; - EB_U16 picAvgVariance; + EB_U8 **yMean; + EB_U8 **cbMean; + EB_U8 **crMean; + + EB_U16 picAvgVariance; // Histograms - EB_U32 ****pictureHistogram; + EB_U32 ****pictureHistogram; + + EB_U64 averageIntensityPerRegion[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT][3]; - EB_U64 averageIntensityPerRegion[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT][3]; - // Segments EB_U16 meSegmentsTotalCount; EB_U8 meSegmentsColumnCount; @@ -477,13 +477,13 @@ typedef struct PictureParentControlSet_s EB_U8 maxNumberOfMeCandidatesPerPU; - MeCuResults_t **meResults; - EB_U32 *rcMEdistortion; + MeCuResults_t **meResults; + EB_U32 *rcMEdistortion; - // Motion Estimation Distortion and OIS Historgram + // Motion Estimation Distortion and OIS Historgram EB_U16 *meDistortionHistogram; EB_U16 *oisDistortionHistogram; - + EB_U32 *intraSadIntervalIndex; EB_U32 *interSadIntervalIndex; @@ -493,8 +493,8 @@ typedef struct PictureParentControlSet_s // Open loop Intra candidate Search Results - OisCu32Cu16Results_t **oisCu32Cu16Results; - OisCu8Results_t **oisCu8Results; + OisCu32Cu16Results_t **oisCu32Cu16Results; + OisCu8Results_t **oisCu8Results; // Dynamic GOP EB_PRED predStructure; @@ -506,102 +506,102 @@ typedef struct PictureParentControlSet_s // Interlaced Video EB_PICT_STRUCT pictStruct; - // Average intensity + // Average intensity EB_U8 averageIntensity[3]; EbObjectWrapper_t *outputStreamWrapperPtr; - EB_BOOL disableTmvpFlag; - // zz cost array - EB_U8 *zzCostArray; - // Non moving index array - EB_U8 *nonMovingIndexArray; + EB_BOOL disableTmvpFlag; + // zz cost array + EB_U8 *zzCostArray; + // Non moving index array + EB_U8 *nonMovingIndexArray; - EB_BOOL isPan; - EB_BOOL isTilt; + EB_BOOL isPan; + EB_BOOL isTilt; EB_BOOL *similarColocatedLcuArray; EB_BOOL *similarColocatedLcuArrayAllLayers; - EB_U8 *lcuFlatNoiseArray; - EB_U64 *lcuVarianceOfVarianceOverTime; - EB_BOOL *isLcuHomogeneousOverTime; - EB_U32 regionActivityCost[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; - // 5L or 6L prediction error compared to 4L prediction structure + EB_U8 *lcuFlatNoiseArray; + EB_U64 *lcuVarianceOfVarianceOverTime; + EB_BOOL *isLcuHomogeneousOverTime; + EB_U32 regionActivityCost[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; + // 5L or 6L prediction error compared to 4L prediction structure // 5L: computed for base layer frames (16 - 8 on top of 16 - 0) // 6L: computed for base layer frames (32 - 24 on top of 32 - 0 & 16 - 8 on top of 16 - 0) EB_U8 picHomogenousOverTimeLcuPercentage; - + // To further optimize - EdgeLcuResults_t *edgeResultsPtr; // used by EncDecProcess() - - EB_U8 *sharpEdgeLcuFlag; - EB_U8 *failingMotionLcuFlag; // used by EncDecProcess() and ModeDecisionConfigurationProcess // USED for L2 to replace the uncovered detectors for L6 and L7 - EB_BOOL *uncoveredAreaLcuFlag; // used by EncDecProcess() - EB_BOOL *lcuHomogeneousAreaArray; // used by EncDecProcess() - EB_BOOL logoPicFlag; // used by EncDecProcess() - EB_U64 **varOfVar32x32BasedLcuArray; // used by ModeDecisionConfigurationProcess()- the variance of 8x8 block variances for each 32x32 block - EB_BOOL *lcuCmplxContrastArray; // used by EncDecProcess() - - - EB_U64 **lcuYSrcEnergyCuArray; // used by ModeDecisionConfigurationProcess() 0- 64x64, 1-4 32x32 - EB_U64 **lcuYSrcMeanCuArray; // used by ModeDecisionConfigurationProcess() 0- 64x64, 1-4 32x32 - EB_U8 intraCodedBlockProbability; // used by EncDecProcess() - EB_BOOL lowMotionContentFlag; // used by EncDecProcess() - EB_U32 zzCostAverage; // used by ModeDecisionConfigurationProcess() - EB_U16 nonMovingIndexAverage; // used by ModeDecisionConfigurationProcess() - EB_BOOL *lcuIsolatedNonHomogeneousAreaArray; // used by ModeDecisionConfigurationProcess() + EdgeLcuResults_t *edgeResultsPtr; // used by EncDecProcess() + + EB_U8 *sharpEdgeLcuFlag; + EB_U8 *failingMotionLcuFlag; // used by EncDecProcess() and ModeDecisionConfigurationProcess // USED for L2 to replace the uncovered detectors for L6 and L7 + EB_BOOL *uncoveredAreaLcuFlag; // used by EncDecProcess() + EB_BOOL *lcuHomogeneousAreaArray; // used by EncDecProcess() + EB_BOOL logoPicFlag; // used by EncDecProcess() + EB_U64 **varOfVar32x32BasedLcuArray; // used by ModeDecisionConfigurationProcess()- the variance of 8x8 block variances for each 32x32 block + EB_BOOL *lcuCmplxContrastArray; // used by EncDecProcess() + + + EB_U64 **lcuYSrcEnergyCuArray; // used by ModeDecisionConfigurationProcess() 0- 64x64, 1-4 32x32 + EB_U64 **lcuYSrcMeanCuArray; // used by ModeDecisionConfigurationProcess() 0- 64x64, 1-4 32x32 + EB_U8 intraCodedBlockProbability; // used by EncDecProcess() + EB_BOOL lowMotionContentFlag; // used by EncDecProcess() + EB_U32 zzCostAverage; // used by ModeDecisionConfigurationProcess() + EB_U16 nonMovingIndexAverage; // used by ModeDecisionConfigurationProcess() + EB_BOOL *lcuIsolatedNonHomogeneousAreaArray; // used by ModeDecisionConfigurationProcess() EB_U8 grassPercentageInPicture; - EB_U8 percentageOfEdgeinLightBackground; - EB_BOOL darkBackGroundlightForeGround; + EB_U8 percentageOfEdgeinLightBackground; + EB_BOOL darkBackGroundlightForeGround; EbObjectWrapper_t *previousPictureControlSetWrapperPtr; LcuStat_t *lcuStatArray; EB_U8 veryLowVarPicFlag; - EB_BOOL highDarkAreaDensityFlag; // computed @ PictureAnalysisProcess() and used @ SourceBasedOperationsProcess() - EB_BOOL highDarkLowLightAreaDensityFlag; // computed @ PictureAnalysisProcess() and used @ SourceBasedOperationsProcess() + EB_BOOL highDarkAreaDensityFlag; // computed @ PictureAnalysisProcess() and used @ SourceBasedOperationsProcess() + EB_BOOL highDarkLowLightAreaDensityFlag; // computed @ PictureAnalysisProcess() and used @ SourceBasedOperationsProcess() EB_U8 blackAreaPercentage; - EB_U32 intraComplexityMin[4]; - EB_U32 intraComplexityMax[4]; - EB_U32 intraComplexityAccum[4]; - EB_U32 intraComplexityAvg[4]; - EB_U32 interComplexityMin[4]; - EB_U32 interComplexityMax[4]; - EB_U32 interComplexityAccum[4]; - EB_U32 interComplexityAvg[4]; - EB_U32 processedleafCount[4]; - - EB_U32 intraComplexityMinPre; - EB_U32 intraComplexityMaxPre; - EB_U32 interComplexityMinPre; - EB_U32 interComplexityMaxPre; - - EB_S32 intraMinDistance[4]; - EB_S32 intraMaxDistance[4]; - EB_S32 interMinDistance[4]; - EB_S32 interMaxDistance[4]; - EB_U8 lcuBlockPercentage; - + EB_U32 intraComplexityMin[4]; + EB_U32 intraComplexityMax[4]; + EB_U32 intraComplexityAccum[4]; + EB_U32 intraComplexityAvg[4]; + EB_U32 interComplexityMin[4]; + EB_U32 interComplexityMax[4]; + EB_U32 interComplexityAccum[4]; + EB_U32 interComplexityAvg[4]; + EB_U32 processedleafCount[4]; + + EB_U32 intraComplexityMinPre; + EB_U32 intraComplexityMaxPre; + EB_U32 interComplexityMinPre; + EB_U32 interComplexityMaxPre; + + EB_S32 intraMinDistance[4]; + EB_S32 intraMaxDistance[4]; + EB_S32 interMinDistance[4]; + EB_S32 interMaxDistance[4]; + EB_U8 lcuBlockPercentage; + EB_LCU_DEPTH_MODE *lcuMdModeArray; EB_LCU_COMPLEXITY_STATUS *complexLcuArray; EB_BOOL useSrcRef; - EB_U8 *cmplxStatusLcu; // used by EncDecProcess() - - // Encoder Mode + EB_U8 *cmplxStatusLcu; // used by EncDecProcess() + + // Encoder Mode EB_ENC_MODE encMode; - - // Multi-modes signal(s) + + // Multi-modes signal(s) EB_PICTURE_DEPTH_MODE depthMode; EB_BOOL limitOisToDcModeFlag; EB_BOOL useSubpelFlag; EB_CU_8x8_MODE cu8x8Mode; - EB_CU_16x16_MODE cu16x16Mode; + EB_CU_16x16_MODE cu16x16Mode; EB_BOOL skipOis8x8; EB_NOISE_DETECT_MODE noiseDetectionMethod; EB_U8 noiseDetectionTh; - EB_BOOL enableDenoiseSrcFlag; + EB_BOOL enableDenoiseSrcFlag; EB_BOOL enableHmeFlag; EB_BOOL enableHmeLevel0Flag; EB_BOOL enableHmeLevel1Flag; EB_BOOL enableHmeLevel2Flag; - EB_BOOL disableVarianceFlag; + EB_BOOL disableVarianceFlag; SegmentOverride_t *segmentOvArray; } PictureParentControlSet_t; @@ -609,26 +609,26 @@ typedef struct PictureParentControlSet_s typedef struct PictureControlSetInitData_s { - EB_U16 pictureWidth; - EB_U16 pictureHeight; - EB_U16 leftPadding; - EB_U16 rightPadding; - EB_U16 topPadding; - EB_U16 botPadding; + EB_U16 pictureWidth; + EB_U16 pictureHeight; + EB_U16 leftPadding; + EB_U16 rightPadding; + EB_U16 topPadding; + EB_U16 botPadding; EB_BITDEPTH bitDepth; EB_COLOR_FORMAT colorFormat; EB_U32 lcuSize; EB_U32 maxDepth; EB_BOOL is16bit; - EB_U32 compressedTenBitFormat; + EB_U32 compressedTenBitFormat; EB_U16 encDecSegmentCol; EB_U16 encDecSegmentRow; EB_U16 tileGroupCol; EB_U16 tileGroupRow; - EB_ENC_MODE encMode; + EB_ENC_MODE encMode; - EB_U8 speedControl; + EB_U8 speedControl; // EB_U8 tune; @@ -642,11 +642,11 @@ typedef struct PictureControlSetInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE PictureControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); extern EB_ERRORTYPE PictureParentControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureDecisionProcess.c b/Source/Lib/Codec/EbPictureDecisionProcess.c index 3a7f6fe5f..7ddc2ea26 100644 --- a/Source/Lib/Codec/EbPictureDecisionProcess.c +++ b/Source/Lib/Codec/EbPictureDecisionProcess.c @@ -31,8 +31,8 @@ #define FLASH_TH 5 #define FADE_TH 3 #define SCENE_TH 3000 -#define NOISY_SCENE_TH 4500 // SCD TH in presence of noise -#define HIGH_PICTURE_VARIANCE_TH 1500 +#define NOISY_SCENE_TH 4500 // SCD TH in presence of noise +#define HIGH_PICTURE_VARIANCE_TH 1500 #define NUM64x64INPIC(w,h) ((w*h)>> (LOG2F(MAX_LCU_SIZE)<<1)) #define QUEUE_GET_PREVIOUS_SPOT(h) ((h == 0) ? PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1 : h - 1) #define QUEUE_GET_NEXT_SPOT(h,off) (( (h+off) >= PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH) ? h+off - PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH : h + off) @@ -54,34 +54,34 @@ EB_ERRORTYPE PictureDecisionContextCtor( contextPtr->pictureAnalysisResultsInputFifoPtr = pictureAnalysisResultsInputFifoPtr; contextPtr->pictureDecisionResultsOutputFifoPtr = pictureDecisionResultsOutputFifoPtr; - EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCb, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); + EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCb, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCr, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); + EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvgCr, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvg, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); + EB_MALLOC(EB_U32**, contextPtr->ahdRunningAvg, sizeof(EB_U32*) * MAX_NUMBER_OF_REGIONS_IN_WIDTH, EB_N_PTR); - for (arrayIndex = 0; arrayIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrayIndex++) - { - EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCb[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); + for (arrayIndex = 0; arrayIndex < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrayIndex++) + { + EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCb[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); - EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCr[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); + EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvgCr[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); - EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvg[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); - } + EB_MALLOC(EB_U32*, contextPtr->ahdRunningAvg[arrayIndex], sizeof(EB_U32) * MAX_NUMBER_OF_REGIONS_IN_HEIGHT, EB_N_PTR); + } - for (arrayRow = 0; arrayRow < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; arrayRow++) - { - for (arrowColumn = 0; arrowColumn < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrowColumn++) { - contextPtr->ahdRunningAvgCb[arrowColumn][arrayRow] = 0; - contextPtr->ahdRunningAvgCr[arrowColumn][arrayRow] = 0; - contextPtr->ahdRunningAvg[arrowColumn][arrayRow] = 0; - } - } + for (arrayRow = 0; arrayRow < MAX_NUMBER_OF_REGIONS_IN_HEIGHT; arrayRow++) + { + for (arrowColumn = 0; arrowColumn < MAX_NUMBER_OF_REGIONS_IN_WIDTH; arrowColumn++) { + contextPtr->ahdRunningAvgCb[arrowColumn][arrayRow] = 0; + contextPtr->ahdRunningAvgCr[arrowColumn][arrayRow] = 0; + contextPtr->ahdRunningAvg[arrowColumn][arrayRow] = 0; + } + } contextPtr->resetRunningAvg = EB_TRUE; - contextPtr->isSceneChangeDetected = EB_FALSE; + contextPtr->isSceneChangeDetected = EB_FALSE; return EB_ErrorNone; @@ -89,188 +89,188 @@ EB_ERRORTYPE PictureDecisionContextCtor( static EB_BOOL SceneTransitionDetector( PictureDecisionContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t **ParentPcsWindow, - EB_U32 windowWidthFuture) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t **ParentPcsWindow, + EB_U32 windowWidthFuture) { - PictureParentControlSet_t *previousPictureControlSetPtr = ParentPcsWindow[0]; - PictureParentControlSet_t *currentPictureControlSetPtr = ParentPcsWindow[1]; - PictureParentControlSet_t *futurePictureControlSetPtr = ParentPcsWindow[2]; - - // calculating the frame threshold based on the number of 64x64 blocks in the frame - EB_U32 regionThreshHold; - EB_U32 regionThreshHoldChroma; - // this variable determines whether the running average should be reset to equal the ahd or not after detecting a scene change. + PictureParentControlSet_t *previousPictureControlSetPtr = ParentPcsWindow[0]; + PictureParentControlSet_t *currentPictureControlSetPtr = ParentPcsWindow[1]; + PictureParentControlSet_t *futurePictureControlSetPtr = ParentPcsWindow[2]; + + // calculating the frame threshold based on the number of 64x64 blocks in the frame + EB_U32 regionThreshHold; + EB_U32 regionThreshHoldChroma; + // this variable determines whether the running average should be reset to equal the ahd or not after detecting a scene change. //EB_BOOL resetRunningAvg = contextPtr->resetRunningAvg; - EB_BOOL isAbruptChange; // this variable signals an abrubt change (scene change or flash) - EB_BOOL isSceneChange; // this variable signals a frame representing a scene change - EB_BOOL isFlash; // this variable signals a frame that contains a flash - EB_BOOL isFade; // this variable signals a frame that contains a fade - EB_BOOL gradualChange; // this signals the detection of a light scene change a small/localized flash or the start of a fade + EB_BOOL isAbruptChange; // this variable signals an abrubt change (scene change or flash) + EB_BOOL isSceneChange; // this variable signals a frame representing a scene change + EB_BOOL isFlash; // this variable signals a frame that contains a flash + EB_BOOL isFade; // this variable signals a frame that contains a fade + EB_BOOL gradualChange; // this signals the detection of a light scene change a small/localized flash or the start of a fade - EB_U32 ahd; // accumulative histogram (absolute) differences between the past and current frame + EB_U32 ahd; // accumulative histogram (absolute) differences between the past and current frame - EB_U32 ahdCb; - EB_U32 ahdCr; + EB_U32 ahdCb; + EB_U32 ahdCr; - EB_U32 ahdErrorCb = 0; - EB_U32 ahdErrorCr = 0; + EB_U32 ahdErrorCb = 0; + EB_U32 ahdErrorCr = 0; EB_U32 **ahdRunningAvgCb = contextPtr->ahdRunningAvgCb; EB_U32 **ahdRunningAvgCr = contextPtr->ahdRunningAvgCr; EB_U32 **ahdRunningAvg = contextPtr->ahdRunningAvg; - EB_U32 ahdError = 0; // the difference between the ahd and the running average at the current frame. + EB_U32 ahdError = 0; // the difference between the ahd and the running average at the current frame. - EB_U8 aidFuturePast = 0; // this variable denotes the average intensity difference between the next and the past frames - EB_U8 aidFuturePresent = 0; - EB_U8 aidPresentPast = 0; + EB_U8 aidFuturePast = 0; // this variable denotes the average intensity difference between the next and the past frames + EB_U8 aidFuturePresent = 0; + EB_U8 aidPresentPast = 0; - EB_U32 bin = 0; // variable used to iterate through the bins of the histograms + EB_U32 bin = 0; // variable used to iterate through the bins of the histograms - EB_U32 regionInPictureWidthIndex; - EB_U32 regionInPictureHeightIndex; + EB_U32 regionInPictureWidthIndex; + EB_U32 regionInPictureHeightIndex; - EB_U32 regionWidth; - EB_U32 regionHeight; - EB_U32 regionWidthOffset; - EB_U32 regionHeightOffset; + EB_U32 regionWidth; + EB_U32 regionHeight; + EB_U32 regionWidthOffset; + EB_U32 regionHeightOffset; - EB_U32 isAbruptChangeCount = 0; - EB_U32 isSceneChangeCount = 0; + EB_U32 isAbruptChangeCount = 0; + EB_U32 isSceneChangeCount = 0; - EB_U32 regionCountThreshold = (sequenceControlSetPtr->scdMode == SCD_MODE_2) ? - (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 75) / 100) + 0.5) : - (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 50) / 100) + 0.5) ; + EB_U32 regionCountThreshold = (sequenceControlSetPtr->scdMode == SCD_MODE_2) ? + (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 75) / 100) + 0.5) : + (EB_U32)(((float)((sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight) * 50) / 100) + 0.5) ; - regionWidth = ParentPcsWindow[1]->enhancedPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; - regionHeight = ParentPcsWindow[1]->enhancedPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; + regionWidth = ParentPcsWindow[1]->enhancedPicturePtr->width / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; + regionHeight = ParentPcsWindow[1]->enhancedPicturePtr->height / sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; - // Loop over regions inside the picture - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions + // Loop over regions inside the picture + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions isAbruptChange = EB_FALSE; isSceneChange = EB_FALSE; isFlash = EB_FALSE; gradualChange = EB_FALSE; - // Reset accumulative histogram (absolute) differences between the past and current frame - ahd = 0; - ahdCb = 0; - ahdCr = 0; + // Reset accumulative histogram (absolute) differences between the past and current frame + ahd = 0; + ahdCb = 0; + ahdCr = 0; - regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? - ParentPcsWindow[1]->enhancedPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : - 0; + regionWidthOffset = (regionInPictureWidthIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth - 1) ? + ParentPcsWindow[1]->enhancedPicturePtr->width - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth * regionWidth) : + 0; - regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? - ParentPcsWindow[1]->enhancedPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : - 0; + regionHeightOffset = (regionInPictureHeightIndex == sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight - 1) ? + ParentPcsWindow[1]->enhancedPicturePtr->height - (sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight * regionHeight) : + 0; - regionWidth += regionWidthOffset; - regionHeight += regionHeightOffset; + regionWidth += regionWidthOffset; + regionHeight += regionHeightOffset; - regionThreshHold = ( - // Noise insertion/removal detection - ((ABS((EB_S64)currentPictureControlSetPtr->picAvgVariance - (EB_S64)previousPictureControlSetPtr->picAvgVariance)) > NOISE_VARIANCE_TH) && - (currentPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH || previousPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH)) ? - NOISY_SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) : // SCD TH function of noise insertion/removal. - SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) ; + regionThreshHold = ( + // Noise insertion/removal detection + ((ABS((EB_S64)currentPictureControlSetPtr->picAvgVariance - (EB_S64)previousPictureControlSetPtr->picAvgVariance)) > NOISE_VARIANCE_TH) && + (currentPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH || previousPictureControlSetPtr->picAvgVariance > HIGH_PICTURE_VARIANCE_TH)) ? + NOISY_SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) : // SCD TH function of noise insertion/removal. + SCENE_TH * NUM64x64INPIC(regionWidth, regionHeight) ; - regionThreshHoldChroma = regionThreshHold / 4; + regionThreshHoldChroma = regionThreshHold / 4; - for (bin = 0; bin < HISTOGRAM_NUMBER_OF_BINS; ++bin) { - ahd += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin]); - ahdCb += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin]); - ahdCr += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin]); + for (bin = 0; bin < HISTOGRAM_NUMBER_OF_BINS; ++bin) { + ahd += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][bin]); + ahdCb += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][1][bin]); + ahdCr += ABS((EB_S32)currentPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin] - (EB_S32)previousPictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][2][bin]); - } + } - if (contextPtr->resetRunningAvg){ - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahd; - ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCb; - ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCr; - } + if (contextPtr->resetRunningAvg){ + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahd; + ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCb; + ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] = ahdCr; + } - ahdError = ABS((EB_S32)ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahd); - ahdErrorCb = ABS((EB_S32)ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCb); - ahdErrorCr = ABS((EB_S32)ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCr); + ahdError = ABS((EB_S32)ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahd); + ahdErrorCb = ABS((EB_S32)ahdRunningAvgCb[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCb); + ahdErrorCr = ABS((EB_S32)ahdRunningAvgCr[regionInPictureWidthIndex][regionInPictureHeightIndex] - (EB_S32)ahdCr); - if ((ahdError > regionThreshHold && ahd >= ahdError) || - (ahdErrorCb > regionThreshHoldChroma && ahdCb >= ahdErrorCb) || - (ahdErrorCr > regionThreshHoldChroma && ahdCr >= ahdErrorCr)){ + if ((ahdError > regionThreshHold && ahd >= ahdError) || + (ahdErrorCb > regionThreshHoldChroma && ahdCb >= ahdErrorCb) || + (ahdErrorCr > regionThreshHoldChroma && ahdCr >= ahdErrorCr)){ - isAbruptChange = EB_TRUE; + isAbruptChange = EB_TRUE; - } - else if ((ahdError > (regionThreshHold >> 1)) && ahd >= ahdError){ - gradualChange = EB_TRUE; - } + } + else if ((ahdError > (regionThreshHold >> 1)) && ahd >= ahdError){ + gradualChange = EB_TRUE; + } - if (isAbruptChange) - { - aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); - aidFuturePresent = (EB_U8)ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); - aidPresentPast = (EB_U8)ABS((EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + if (isAbruptChange) + { + aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + aidFuturePresent = (EB_U8)ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + aidPresentPast = (EB_U8)ABS((EB_S16)currentPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); if (aidFuturePast < FLASH_TH && aidFuturePresent >= FLASH_TH && aidPresentPast >= FLASH_TH){ - isFlash = EB_TRUE; - //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - } - else if (aidFuturePresent < FADE_TH && aidPresentPast < FADE_TH){ - isFade = EB_TRUE; - //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - } else { - isSceneChange = EB_TRUE; - //SVT_LOG ("\nScene Change in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - } - - } - else if (gradualChange){ - - aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); - if (aidFuturePast < FLASH_TH){ - // proper action to be signalled - //SVT_LOG ("\nLight Flash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; - } - else{ - // proper action to be signalled - //SVT_LOG ("\nLight Scene Change / fade detected in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; - } - - } - else{ - ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; - } - - isAbruptChangeCount += isAbruptChange; - isSceneChangeCount += isSceneChange; - } - } - - (void)windowWidthFuture; - (void)isFlash; - (void)isFade; - - if (isAbruptChangeCount >= regionCountThreshold) { - contextPtr->resetRunningAvg = EB_TRUE; - } - else { - contextPtr->resetRunningAvg = EB_FALSE; - } + isFlash = EB_TRUE; + //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + } + else if (aidFuturePresent < FADE_TH && aidPresentPast < FADE_TH){ + isFade = EB_TRUE; + //SVT_LOG ("\nFlash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + } else { + isSceneChange = EB_TRUE; + //SVT_LOG ("\nScene Change in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + } + + } + else if (gradualChange){ + + aidFuturePast = (EB_U8) ABS((EB_S16)futurePictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0] - (EB_S16)previousPictureControlSetPtr->averageIntensityPerRegion[regionInPictureWidthIndex][regionInPictureHeightIndex][0]); + if (aidFuturePast < FLASH_TH){ + // proper action to be signalled + //SVT_LOG ("\nLight Flash in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; + } + else{ + // proper action to be signalled + //SVT_LOG ("\nLight Scene Change / fade detected in frame# %i , %i\n", currentPictureControlSetPtr->pictureNumber,aidFuturePast); + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; + } + + } + else{ + ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] = (3 * ahdRunningAvg[regionInPictureWidthIndex][regionInPictureHeightIndex] + ahd) / 4; + } + + isAbruptChangeCount += isAbruptChange; + isSceneChangeCount += isSceneChange; + } + } + + (void)windowWidthFuture; + (void)isFlash; + (void)isFade; + + if (isAbruptChangeCount >= regionCountThreshold) { + contextPtr->resetRunningAvg = EB_TRUE; + } + else { + contextPtr->resetRunningAvg = EB_FALSE; + } if ((isSceneChangeCount >= regionCountThreshold)){ - return(EB_TRUE); - } - else { - return(EB_FALSE); - } + return(EB_TRUE); + } + else { + return(EB_FALSE); + } } @@ -278,29 +278,29 @@ static EB_BOOL SceneTransitionDetector( * EbHevcReleasePrevPictureFromReorderQueue ***************************************************************************************************/ EB_ERRORTYPE EbHevcReleasePrevPictureFromReorderQueue( - EncodeContext_t *encodeContextPtr) { + EncodeContext_t *encodeContextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - PictureDecisionReorderEntry_t *queuePreviousEntryPtr; - EB_S32 previousEntryIndex; + PictureDecisionReorderEntry_t *queuePreviousEntryPtr; + EB_S32 previousEntryIndex; - // Get the previous entry from the Picture Decision Reordering Queue (Entry N-1) - // P.S. The previous entry in display order is needed for Scene Change Detection - previousEntryIndex = (encodeContextPtr->pictureDecisionReorderQueueHeadIndex == 0) ? PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1 : encodeContextPtr->pictureDecisionReorderQueueHeadIndex - 1; - queuePreviousEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[previousEntryIndex]; + // Get the previous entry from the Picture Decision Reordering Queue (Entry N-1) + // P.S. The previous entry in display order is needed for Scene Change Detection + previousEntryIndex = (encodeContextPtr->pictureDecisionReorderQueueHeadIndex == 0) ? PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH - 1 : encodeContextPtr->pictureDecisionReorderQueueHeadIndex - 1; + queuePreviousEntryPtr = encodeContextPtr->pictureDecisionReorderQueue[previousEntryIndex]; - // LCU activity classification based on (0,0) SAD & picture activity derivation - if (queuePreviousEntryPtr->parentPcsWrapperPtr) { + // LCU activity classification based on (0,0) SAD & picture activity derivation + if (queuePreviousEntryPtr->parentPcsWrapperPtr) { - // Reset the Picture Decision Reordering Queue Entry - // P.S. The reset of the Picture Decision Reordering Queue Entry could not be done before running the Scene Change Detector - queuePreviousEntryPtr->pictureNumber += PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH; - queuePreviousEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - } + // Reset the Picture Decision Reordering Queue Entry + // P.S. The reset of the Picture Decision Reordering Queue Entry could not be done before running the Scene Change Detector + queuePreviousEntryPtr->pictureNumber += PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH; + queuePreviousEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; + } - return return_error; + return return_error; } @@ -310,38 +310,38 @@ EB_ERRORTYPE EbHevcReleasePrevPictureFromReorderQueue( * ***************************************************************************************************/ EB_ERRORTYPE EbHevcGenerateMiniGopRps( - PictureDecisionContext_t *contextPtr, - EncodeContext_t *encodeContextPtr) { + PictureDecisionContext_t *contextPtr, + EncodeContext_t *encodeContextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 miniGopIndex; - PictureParentControlSet_t *pictureControlSetPtr; - EB_U32 pictureIndex; + EB_U32 miniGopIndex; + PictureParentControlSet_t *pictureControlSetPtr; + EB_U32 pictureIndex; - SequenceControlSet_t *sequenceControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; - // Loop over all mini GOPs - for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { + // Loop over all mini GOPs + for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { - // Loop over picture within the mini GOP - for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; pictureIndex++) { + // Loop over picture within the mini GOP + for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; pictureIndex++) { - pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; + pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; pictureControlSetPtr->hierarchicalLevels = (EB_U8)contextPtr->miniGopHierarchicalLevels[miniGopIndex]; pictureControlSetPtr->predStructPtr = GetPredictionStructure( - encodeContextPtr->predictionStructureGroupPtr, - pictureControlSetPtr->predStructure, - 1, - pictureControlSetPtr->hierarchicalLevels); - } - } - return return_error; + encodeContextPtr->predictionStructureGroupPtr, + pictureControlSetPtr->predStructure, + 1, + pictureControlSetPtr->hierarchicalLevels); + } + } + return return_error; } /*************************************************************************** @@ -349,39 +349,39 @@ EB_ERRORTYPE EbHevcGenerateMiniGopRps( ****************************************************************************/ EB_U8 PictureLevelSubPelSettingsOq( - EB_U8 inputResolution, - EB_U8 encMode, - EB_U8 temporalLayerIndex, - EB_BOOL isUsedAsReferenceFlag) { - - EB_U8 subPelMode; - - if (encMode <= ENC_MODE_8) { - subPelMode = 1; - } - else if (encMode <= ENC_MODE_9) { - if (inputResolution >= INPUT_SIZE_4K_RANGE) { - subPelMode = (temporalLayerIndex == 0) ? 1 : 0; - } - else { - subPelMode = 1; - } + EB_U8 inputResolution, + EB_U8 encMode, + EB_U8 temporalLayerIndex, + EB_BOOL isUsedAsReferenceFlag) { + + EB_U8 subPelMode; + + if (encMode <= ENC_MODE_8) { + subPelMode = 1; + } + else if (encMode <= ENC_MODE_9) { + if (inputResolution >= INPUT_SIZE_4K_RANGE) { + subPelMode = (temporalLayerIndex == 0) ? 1 : 0; + } + else { + subPelMode = 1; + } } else { - if (inputResolution >= INPUT_SIZE_4K_RANGE) { + if (inputResolution >= INPUT_SIZE_4K_RANGE) { if (encMode > ENC_MODE_10) { subPelMode = 0; } else { subPelMode = (temporalLayerIndex == 0) ? 1 : 0; } - } - else { - subPelMode = isUsedAsReferenceFlag ? 1 : 0; - } + } + else { + subPelMode = isUsedAsReferenceFlag ? 1 : 0; + } } - return subPelMode; + return subPelMode; } @@ -397,14 +397,14 @@ EB_ERRORTYPE SignalDerivationMultiProcessesOq( EB_ERRORTYPE return_error = EB_ErrorNone; // Set MD Partitioning Method - if (pictureControlSetPtr->encMode <= ENC_MODE_3) { - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { - pictureControlSetPtr->depthMode = PICT_FULL84_DEPTH_MODE; - } - else { - pictureControlSetPtr->depthMode = PICT_FULL85_DEPTH_MODE; - } - } + if (pictureControlSetPtr->encMode <= ENC_MODE_3) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + pictureControlSetPtr->depthMode = PICT_FULL84_DEPTH_MODE; + } + else { + pictureControlSetPtr->depthMode = PICT_FULL85_DEPTH_MODE; + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_10) { if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { pictureControlSetPtr->depthMode = PICT_FULL84_DEPTH_MODE; @@ -442,31 +442,31 @@ EB_ERRORTYPE SignalDerivationMultiProcessesOq( if (pictureControlSetPtr->encMode <= ENC_MODE_2 ) { pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_0; } - else if (pictureControlSetPtr->encMode <= ENC_MODE_5) { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } - else { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } - } + else if (pictureControlSetPtr->encMode <= ENC_MODE_5) { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_6) { + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } + else { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->isUsedAsReferenceFlag) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } + } else if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { - pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; - } - else { - pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; - } + if (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) { + pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; + } + else { + pictureControlSetPtr->cu8x8Mode = (pictureControlSetPtr->temporalLayerIndex == 0) ? CU_8x8_MODE_0 : CU_8x8_MODE_1; + } } - else { - pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; + else { + pictureControlSetPtr->cu8x8Mode = CU_8x8_MODE_1; } // CU_16x16 Search Mode - pictureControlSetPtr->cu16x16Mode = CU_16x16_MODE_0; + pictureControlSetPtr->cu16x16Mode = CU_16x16_MODE_0; // Set Skip OIS 8x8 Flag pictureControlSetPtr->skipOis8x8 = (pictureControlSetPtr->sliceType == EB_I_PICTURE && (pictureControlSetPtr->encMode <= ENC_MODE_10)) ? EB_FALSE : EB_TRUE; @@ -606,11 +606,11 @@ void* PictureDecisionKernel(void *inputPtr) EB_U32 depListCount; - // Dynamic GOP - EB_U32 miniGopIndex; - EB_U32 pictureIndex; + // Dynamic GOP + EB_U32 miniGopIndex; + EB_U32 pictureIndex; - EB_BOOL windowAvail,framePasseThru; + EB_BOOL windowAvail,framePasseThru; EB_U32 windowIndex; EB_U32 entryIndex; PictureParentControlSet_t *ParentPcsWindow[FUTURE_WINDOW_WIDTH+2]; @@ -713,7 +713,7 @@ void* PictureDecisionKernel(void *inputPtr) } if(windowAvail == EB_TRUE ||framePasseThru == EB_TRUE) - { + { // Place the PCS into the Pre-Assignment Buffer // P.S. The Pre-Assignment Buffer is used to store a whole pre-structure encodeContextPtr->preAssignmentBuffer[encodeContextPtr->preAssignmentBufferCount] = queueEntryPtr->parentPcsWrapperPtr; @@ -726,9 +726,9 @@ void* PictureDecisionKernel(void *inputPtr) encodeContextPtr->currentInputPoc = pictureControlSetPtr->pictureNumber; - pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; + pictureControlSetPtr->predStructure = sequenceControlSetPtr->staticConfig.predStructure; - pictureControlSetPtr->hierarchicalLayersDiff = 0; + pictureControlSetPtr->hierarchicalLayersDiff = 0; pictureControlSetPtr->initPredStructPositionFlag = EB_FALSE; @@ -775,245 +775,245 @@ void* PictureDecisionKernel(void *inputPtr) 0 : encodeContextPtr->intraPeriodPosition + 1; } - // Determine if Pictures can be released from the Pre-Assignment Buffer - if ((encodeContextPtr->preAssignmentBufferIntraCount > 0) || - (encodeContextPtr->preAssignmentBufferCount == (EB_U32) (1 << sequenceControlSetPtr->staticConfig.hierarchicalLevels)) || - (encodeContextPtr->preAssignmentBufferEosFlag == EB_TRUE) || - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) || - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B)) - { + // Determine if Pictures can be released from the Pre-Assignment Buffer + if ((encodeContextPtr->preAssignmentBufferIntraCount > 0) || + (encodeContextPtr->preAssignmentBufferCount == (EB_U32) (1 << sequenceControlSetPtr->staticConfig.hierarchicalLevels)) || + (encodeContextPtr->preAssignmentBufferEosFlag == EB_TRUE) || + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) || + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B)) + { - // Initialize Picture Block Params - contextPtr->miniGopStartIndex[0] = 0; - contextPtr->miniGopEndIndex [0] = encodeContextPtr->preAssignmentBufferCount - 1; - contextPtr->miniGopLenght [0] = encodeContextPtr->preAssignmentBufferCount; + // Initialize Picture Block Params + contextPtr->miniGopStartIndex[0] = 0; + contextPtr->miniGopEndIndex [0] = encodeContextPtr->preAssignmentBufferCount - 1; + contextPtr->miniGopLenght [0] = encodeContextPtr->preAssignmentBufferCount; - contextPtr->miniGopHierarchicalLevels[0] = sequenceControlSetPtr->staticConfig.hierarchicalLevels; - contextPtr->miniGopIntraCount[0] = encodeContextPtr->preAssignmentBufferIntraCount; - contextPtr->miniGopIdrCount [0] = encodeContextPtr->preAssignmentBufferIdrCount; - contextPtr->totalNumberOfMiniGops = 1; + contextPtr->miniGopHierarchicalLevels[0] = sequenceControlSetPtr->staticConfig.hierarchicalLevels; + contextPtr->miniGopIntraCount[0] = encodeContextPtr->preAssignmentBufferIntraCount; + contextPtr->miniGopIdrCount [0] = encodeContextPtr->preAssignmentBufferIdrCount; + contextPtr->totalNumberOfMiniGops = 1; - encodeContextPtr->previousMiniGopHierarchicalLevels = (pictureControlSetPtr->pictureNumber == 0) ? - sequenceControlSetPtr->staticConfig.hierarchicalLevels : - encodeContextPtr->previousMiniGopHierarchicalLevels; + encodeContextPtr->previousMiniGopHierarchicalLevels = (pictureControlSetPtr->pictureNumber == 0) ? + sequenceControlSetPtr->staticConfig.hierarchicalLevels : + encodeContextPtr->previousMiniGopHierarchicalLevels; - EbHevcGenerateMiniGopRps( - contextPtr, - encodeContextPtr); + EbHevcGenerateMiniGopRps( + contextPtr, + encodeContextPtr); // Loop over Mini GOPs - for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { - - preAssignmentBufferFirstPassFlag = EB_TRUE; - - // 1st Loop over Pictures in the Pre-Assignment Buffer - for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { - - pictureControlSetPtr = (PictureParentControlSet_t*)encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; - - // Keep track of the mini GOP size to which the input picture belongs - needed @ PictureManagerProcess() - pictureControlSetPtr->preAssignmentBufferCount = contextPtr->miniGopLenght[miniGopIndex]; - - // Update the Pred Structure if cutting short a Random Access period - if ((contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod || contextPtr->miniGopIdrCount[miniGopIndex] > 0) && - - pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS && - pictureControlSetPtr->idrFlag == EB_FALSE && - pictureControlSetPtr->craFlag == EB_FALSE) - { - // Correct the Pred Index before switching structures - if (preAssignmentBufferFirstPassFlag == EB_TRUE) { - encodeContextPtr->predStructPosition -= pictureControlSetPtr->predStructPtr->initPicIndex; - } - - pictureControlSetPtr->predStructPtr = GetPredictionStructure( - encodeContextPtr->predictionStructureGroupPtr, - EB_PRED_LOW_DELAY_P, - 1, - pictureControlSetPtr->hierarchicalLevels); - - // Set the RPS Override Flag - this current only will convert a Random Access structure to a Low Delay structure - pictureControlSetPtr->useRpsInSps = EB_FALSE; - pictureControlSetPtr->openGopCraFlag = EB_FALSE; - - pictureType = EB_P_PICTURE; - - } - // Open GOP CRA - adjust the RPS - else if ((contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod) && - - (pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS || pictureControlSetPtr->predStructPtr->temporalLayerCount == 1) && - pictureControlSetPtr->idrFlag == EB_FALSE && - pictureControlSetPtr->craFlag == EB_TRUE) - { - pictureControlSetPtr->useRpsInSps = EB_FALSE; - pictureControlSetPtr->openGopCraFlag = EB_TRUE; - - pictureType = EB_I_PICTURE; - } - else { - - pictureControlSetPtr->useRpsInSps = EB_FALSE; - pictureControlSetPtr->openGopCraFlag = EB_FALSE; - - // Set the Picture Type - pictureType = - (pictureControlSetPtr->idrFlag) ? EB_I_PICTURE : - (pictureControlSetPtr->craFlag) ? EB_I_PICTURE : - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) ? EB_P_PICTURE : - (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B) ? EB_B_PICTURE : - (pictureControlSetPtr->preAssignmentBufferCount == pictureControlSetPtr->predStructPtr->predStructPeriod) ? ((pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex] && sequenceControlSetPtr->staticConfig.baseLayerSwitchMode) ? EB_P_PICTURE : EB_B_PICTURE) : - - (encodeContextPtr->preAssignmentBufferEosFlag) ? EB_P_PICTURE : - EB_B_PICTURE; - } - - // If Intra, reset position - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; - } - - else if (pictureControlSetPtr->craFlag == EB_TRUE && contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod) { - - encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; - } - else if (encodeContextPtr->elapsedNonCraCount == 0) { - // If we are the picture directly after a CRA, we have to not use references that violate the CRA - encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + 1; - } - // Elif Scene Change, determine leading and trailing pictures - //else if (encodeContextPtr->preAssignmentBufferSceneChangeCount > 0) { - // if(bufferIndex < encodeContextPtr->preAssignmentBufferSceneChangeIndex) { - // ++encodeContextPtr->predStructPosition; - // pictureType = EB_P_PICTURE; - // } - // else { - // encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + encodeContextPtr->preAssignmentBufferCount - bufferIndex - 1; - // } - //} - // Else, Increment the position normally - else { - ++encodeContextPtr->predStructPosition; - } - - // The poc number of the latest IDR picture is stored so that lastIdrPicture (present in PCS) for the incoming pictures can be updated. - // The lastIdrPicture is used in reseting the poc (in entropy coding) whenever IDR is encountered. - // Note IMP: This logic only works when display and decode order are the same. Currently for Random Access, IDR is inserted (similar to CRA) by using trailing P pictures (low delay fashion) and breaking prediction structure. - // Note: When leading P pictures are implemented, this logic has to change.. - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - encodeContextPtr->lastIdrPicture = pictureControlSetPtr->pictureNumber; - } - else { - pictureControlSetPtr->lastIdrPicture = encodeContextPtr->lastIdrPicture; - } - - - // Cycle the PredStructPosition if its overflowed - encodeContextPtr->predStructPosition = (encodeContextPtr->predStructPosition == pictureControlSetPtr->predStructPtr->predStructEntryCount) ? - encodeContextPtr->predStructPosition - pictureControlSetPtr->predStructPtr->predStructPeriod : - encodeContextPtr->predStructPosition; - - predPositionPtr = pictureControlSetPtr->predStructPtr->predStructEntryPtrArray[encodeContextPtr->predStructPosition]; - - // Set the NAL Unit - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_IDR_W_RADL; - } - else if (pictureControlSetPtr->craFlag == EB_TRUE) { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_CRA; - } - // User specify of use of non-reference picture is OFF - else { - // If we have an open GOP situation, where pictures are forward-referencing to a CRA, then those pictures have to be tagged as RASL. - if ((contextPtr->miniGopIntraCount[miniGopIndex] > 0) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && - (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) { - - if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_N; - } - else { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_R; - } - } - else if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_N; - } - else { - pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_R; - } - } - - // Set the Slice type - pictureControlSetPtr->sliceType = pictureType; - ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->sliceType = pictureControlSetPtr->sliceType; - - - - switch (pictureType) { - - case EB_I_PICTURE: - - // Reset Prediction Structure Position & Reference Struct Position - if (pictureControlSetPtr->pictureNumber == 0){ - encodeContextPtr->intraPeriodPosition = 0; - } - encodeContextPtr->elapsedNonCraCount = 0; - - //------------------------------- - // IDR - //------------------------------- - if (pictureControlSetPtr->idrFlag == EB_TRUE) { - - // Set CRA flag - pictureControlSetPtr->craFlag = EB_FALSE; - - // Reset the pictures since last IDR counter - encodeContextPtr->elapsedNonIdrCount = 0; - - } - //------------------------------- - // CRA - //------------------------------- - else { - - // Set a Random Access Point if not an IDR - pictureControlSetPtr->craFlag = EB_TRUE; - } - - break; - - case EB_P_PICTURE: - case EB_B_PICTURE: - - // Reset CRA and IDR Flag - pictureControlSetPtr->craFlag = EB_FALSE; - pictureControlSetPtr->idrFlag = EB_FALSE; - - // Increment & Clip the elapsed Non-IDR Counter. This is clipped rather than allowed to free-run - // inorder to avoid rollover issues. This assumes that any the GOP period is less than MAX_ELAPSED_IDR_COUNT - encodeContextPtr->elapsedNonIdrCount = MIN(encodeContextPtr->elapsedNonIdrCount + 1, MAX_ELAPSED_IDR_COUNT); - encodeContextPtr->elapsedNonCraCount = MIN(encodeContextPtr->elapsedNonCraCount + 1, MAX_ELAPSED_IDR_COUNT); - - CHECK_REPORT_ERROR( - (pictureControlSetPtr->predStructPtr->predStructEntryCount < MAX_ELAPSED_IDR_COUNT), - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR1); - - break; - - default: - - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR2); + for (miniGopIndex = 0; miniGopIndex < contextPtr->totalNumberOfMiniGops; ++miniGopIndex) { + + preAssignmentBufferFirstPassFlag = EB_TRUE; + + // 1st Loop over Pictures in the Pre-Assignment Buffer + for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { + + pictureControlSetPtr = (PictureParentControlSet_t*)encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + + // Keep track of the mini GOP size to which the input picture belongs - needed @ PictureManagerProcess() + pictureControlSetPtr->preAssignmentBufferCount = contextPtr->miniGopLenght[miniGopIndex]; - break; - } - pictureControlSetPtr->predStructIndex = (EB_U8)encodeContextPtr->predStructPosition; - pictureControlSetPtr->temporalLayerIndex = (EB_U8)predPositionPtr->temporalLayerIndex; - pictureControlSetPtr->isUsedAsReferenceFlag = predPositionPtr->isReferenced; + // Update the Pred Structure if cutting short a Random Access period + if ((contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod || contextPtr->miniGopIdrCount[miniGopIndex] > 0) && + + pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS && + pictureControlSetPtr->idrFlag == EB_FALSE && + pictureControlSetPtr->craFlag == EB_FALSE) + { + // Correct the Pred Index before switching structures + if (preAssignmentBufferFirstPassFlag == EB_TRUE) { + encodeContextPtr->predStructPosition -= pictureControlSetPtr->predStructPtr->initPicIndex; + } + + pictureControlSetPtr->predStructPtr = GetPredictionStructure( + encodeContextPtr->predictionStructureGroupPtr, + EB_PRED_LOW_DELAY_P, + 1, + pictureControlSetPtr->hierarchicalLevels); + + // Set the RPS Override Flag - this current only will convert a Random Access structure to a Low Delay structure + pictureControlSetPtr->useRpsInSps = EB_FALSE; + pictureControlSetPtr->openGopCraFlag = EB_FALSE; + + pictureType = EB_P_PICTURE; + + } + // Open GOP CRA - adjust the RPS + else if ((contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod) && + + (pictureControlSetPtr->predStructPtr->predType == EB_PRED_RANDOM_ACCESS || pictureControlSetPtr->predStructPtr->temporalLayerCount == 1) && + pictureControlSetPtr->idrFlag == EB_FALSE && + pictureControlSetPtr->craFlag == EB_TRUE) + { + pictureControlSetPtr->useRpsInSps = EB_FALSE; + pictureControlSetPtr->openGopCraFlag = EB_TRUE; + + pictureType = EB_I_PICTURE; + } + else { + + pictureControlSetPtr->useRpsInSps = EB_FALSE; + pictureControlSetPtr->openGopCraFlag = EB_FALSE; + + // Set the Picture Type + pictureType = + (pictureControlSetPtr->idrFlag) ? EB_I_PICTURE : + (pictureControlSetPtr->craFlag) ? EB_I_PICTURE : + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_P) ? EB_P_PICTURE : + (pictureControlSetPtr->predStructure == EB_PRED_LOW_DELAY_B) ? EB_B_PICTURE : + (pictureControlSetPtr->preAssignmentBufferCount == pictureControlSetPtr->predStructPtr->predStructPeriod) ? ((pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex] && sequenceControlSetPtr->staticConfig.baseLayerSwitchMode) ? EB_P_PICTURE : EB_B_PICTURE) : + + (encodeContextPtr->preAssignmentBufferEosFlag) ? EB_P_PICTURE : + EB_B_PICTURE; + } + + // If Intra, reset position + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; + } + + else if (pictureControlSetPtr->craFlag == EB_TRUE && contextPtr->miniGopLenght[miniGopIndex] < pictureControlSetPtr->predStructPtr->predStructPeriod) { + + encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex; + } + else if (encodeContextPtr->elapsedNonCraCount == 0) { + // If we are the picture directly after a CRA, we have to not use references that violate the CRA + encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + 1; + } + // Elif Scene Change, determine leading and trailing pictures + //else if (encodeContextPtr->preAssignmentBufferSceneChangeCount > 0) { + // if(bufferIndex < encodeContextPtr->preAssignmentBufferSceneChangeIndex) { + // ++encodeContextPtr->predStructPosition; + // pictureType = EB_P_PICTURE; + // } + // else { + // encodeContextPtr->predStructPosition = pictureControlSetPtr->predStructPtr->initPicIndex + encodeContextPtr->preAssignmentBufferCount - bufferIndex - 1; + // } + //} + // Else, Increment the position normally + else { + ++encodeContextPtr->predStructPosition; + } + + // The poc number of the latest IDR picture is stored so that lastIdrPicture (present in PCS) for the incoming pictures can be updated. + // The lastIdrPicture is used in reseting the poc (in entropy coding) whenever IDR is encountered. + // Note IMP: This logic only works when display and decode order are the same. Currently for Random Access, IDR is inserted (similar to CRA) by using trailing P pictures (low delay fashion) and breaking prediction structure. + // Note: When leading P pictures are implemented, this logic has to change.. + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + encodeContextPtr->lastIdrPicture = pictureControlSetPtr->pictureNumber; + } + else { + pictureControlSetPtr->lastIdrPicture = encodeContextPtr->lastIdrPicture; + } + + + // Cycle the PredStructPosition if its overflowed + encodeContextPtr->predStructPosition = (encodeContextPtr->predStructPosition == pictureControlSetPtr->predStructPtr->predStructEntryCount) ? + encodeContextPtr->predStructPosition - pictureControlSetPtr->predStructPtr->predStructPeriod : + encodeContextPtr->predStructPosition; + + predPositionPtr = pictureControlSetPtr->predStructPtr->predStructEntryPtrArray[encodeContextPtr->predStructPosition]; + + // Set the NAL Unit + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_IDR_W_RADL; + } + else if (pictureControlSetPtr->craFlag == EB_TRUE) { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_CRA; + } + // User specify of use of non-reference picture is OFF + else { + // If we have an open GOP situation, where pictures are forward-referencing to a CRA, then those pictures have to be tagged as RASL. + if ((contextPtr->miniGopIntraCount[miniGopIndex] > 0) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && + (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) { + + if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_N; + } + else { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_RASL_R; + } + } + else if (pictureControlSetPtr->hierarchicalLevels > 0 && predPositionPtr->temporalLayerIndex == pictureControlSetPtr->hierarchicalLevels){ + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_N; + } + else { + pictureControlSetPtr->nalUnit = NAL_UNIT_CODED_SLICE_TRAIL_R; + } + } + + // Set the Slice type + pictureControlSetPtr->sliceType = pictureType; + ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->sliceType = pictureControlSetPtr->sliceType; + + + + switch (pictureType) { + + case EB_I_PICTURE: + + // Reset Prediction Structure Position & Reference Struct Position + if (pictureControlSetPtr->pictureNumber == 0){ + encodeContextPtr->intraPeriodPosition = 0; + } + encodeContextPtr->elapsedNonCraCount = 0; + + //------------------------------- + // IDR + //------------------------------- + if (pictureControlSetPtr->idrFlag == EB_TRUE) { + + // Set CRA flag + pictureControlSetPtr->craFlag = EB_FALSE; + + // Reset the pictures since last IDR counter + encodeContextPtr->elapsedNonIdrCount = 0; + + } + //------------------------------- + // CRA + //------------------------------- + else { + + // Set a Random Access Point if not an IDR + pictureControlSetPtr->craFlag = EB_TRUE; + } + + break; + + case EB_P_PICTURE: + case EB_B_PICTURE: + + // Reset CRA and IDR Flag + pictureControlSetPtr->craFlag = EB_FALSE; + pictureControlSetPtr->idrFlag = EB_FALSE; + + // Increment & Clip the elapsed Non-IDR Counter. This is clipped rather than allowed to free-run + // inorder to avoid rollover issues. This assumes that any the GOP period is less than MAX_ELAPSED_IDR_COUNT + encodeContextPtr->elapsedNonIdrCount = MIN(encodeContextPtr->elapsedNonIdrCount + 1, MAX_ELAPSED_IDR_COUNT); + encodeContextPtr->elapsedNonCraCount = MIN(encodeContextPtr->elapsedNonCraCount + 1, MAX_ELAPSED_IDR_COUNT); + + CHECK_REPORT_ERROR( + (pictureControlSetPtr->predStructPtr->predStructEntryCount < MAX_ELAPSED_IDR_COUNT), + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR1); + + break; + + default: + + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR2); + + break; + } + pictureControlSetPtr->predStructIndex = (EB_U8)encodeContextPtr->predStructPosition; + pictureControlSetPtr->temporalLayerIndex = (EB_U8)predPositionPtr->temporalLayerIndex; + pictureControlSetPtr->isUsedAsReferenceFlag = predPositionPtr->isReferenced; pictureControlSetPtr->disableTmvpFlag = sequenceControlSetPtr->staticConfig.unrestrictedMotionVector == 0 ? EB_TRUE : EB_FALSE; @@ -1026,9 +1026,9 @@ void* PictureDecisionKernel(void *inputPtr) pictureControlSetPtr); // Set the Decode Order - if ((sequenceControlSetPtr->staticConfig.predStructure == EB_PRED_RANDOM_ACCESS) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && + if ((sequenceControlSetPtr->staticConfig.predStructure == EB_PRED_RANDOM_ACCESS) && (contextPtr->miniGopIdrCount[miniGopIndex] == 0) && - (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) + (contextPtr->miniGopLenght[miniGopIndex] == pictureControlSetPtr->predStructPtr->predStructPeriod)) { pictureControlSetPtr->decodeOrder = encodeContextPtr->decodeBaseNumber + predPositionPtr->decodeOrder; @@ -1146,7 +1146,7 @@ void* PictureDecisionKernel(void *inputPtr) pictureControlSetPtr->refList0Count = (pictureType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList0.referenceListCount; pictureControlSetPtr->refList1Count = (pictureType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList1.referenceListCount; - inputEntryPtr->list0Ptr = &predPositionPtr->refList0; + inputEntryPtr->list0Ptr = &predPositionPtr->refList0; inputEntryPtr->list1Ptr = &predPositionPtr->refList1; { @@ -1171,21 +1171,21 @@ void* PictureDecisionKernel(void *inputPtr) } - ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount = inputEntryPtr->dependentCount; - - /* EB_U32 depCnt = ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount; - if (pictureControlSetPtr->pictureNumber>0 && pictureControlSetPtr->sliceType==EB_I_PICTURE && depCnt!=8 ) - SVT_LOG("depCnt Error1 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0 && depCnt!=8) - SVT_LOG("depCnt Error2 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 1 && depCnt!=4) - SVT_LOG("depCnt Error3 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 2 && depCnt!=2) - SVT_LOG("depCnt Error4 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); - else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 3 && depCnt!=0) - SVT_LOG("depCnt Error5 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount);*/ - //if (pictureControlSetPtr->sliceType==EB_P_PICTURE ) - // SVT_LOG("POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount = inputEntryPtr->dependentCount; + + /* EB_U32 depCnt = ((EbPaReferenceObject_t*)pictureControlSetPtr->paReferencePictureWrapperPtr->objectPtr)->dependentPicturesCount; + if (pictureControlSetPtr->pictureNumber>0 && pictureControlSetPtr->sliceType==EB_I_PICTURE && depCnt!=8 ) + SVT_LOG("depCnt Error1 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0 && depCnt!=8) + SVT_LOG("depCnt Error2 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 1 && depCnt!=4) + SVT_LOG("depCnt Error3 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 2 && depCnt!=2) + SVT_LOG("depCnt Error4 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); + else if (pictureControlSetPtr->sliceType==EB_B_PICTURE && pictureControlSetPtr->temporalLayerIndex == 3 && depCnt!=0) + SVT_LOG("depCnt Error5 POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount);*/ + //if (pictureControlSetPtr->sliceType==EB_P_PICTURE ) + // SVT_LOG("POC:%i TL:%i is needed:%i\n",pictureControlSetPtr->pictureNumber,pictureControlSetPtr->temporalLayerIndex,inputEntryPtr->dependentCount); CHECK_REPORT_ERROR( (pictureControlSetPtr->predStructPtr->predStructPeriod < MAX_ELAPSED_IDR_COUNT), @@ -1193,16 +1193,16 @@ void* PictureDecisionKernel(void *inputPtr) EB_ENC_PD_ERROR5); // Reset the PA Reference Lists - EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); + EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); - EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EB_U32)); + EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EB_U32)); } // 2nd Loop over Pictures in the Pre-Assignment Buffer - for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { + for (pictureIndex = contextPtr->miniGopStartIndex[miniGopIndex]; pictureIndex <= contextPtr->miniGopEndIndex[miniGopIndex]; ++pictureIndex) { - pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; + pictureControlSetPtr = (PictureParentControlSet_t*) encodeContextPtr->preAssignmentBuffer[pictureIndex]->objectPtr; // Find the Reference in the Picture Decision PA Reference Queue inputQueueIndex = encodeContextPtr->pictureDecisionPaReferenceQueueHeadIndex; @@ -1223,15 +1223,15 @@ void* PictureDecisionKernel(void *inputPtr) EB_ENC_PD_ERROR7); // Reset the PA Reference Lists - EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); + EB_MEMSET(pictureControlSetPtr->refPaPicPtrArray, 0, 2 * sizeof(EbObjectWrapper_t*)); - EB_MEMSET(pictureControlSetPtr->refPicPocArray, 0, 2 * sizeof(EB_U64)); + EB_MEMSET(pictureControlSetPtr->refPicPocArray, 0, 2 * sizeof(EB_U64)); // Configure List0 if ((pictureControlSetPtr->sliceType == EB_P_PICTURE) || (pictureControlSetPtr->sliceType == EB_B_PICTURE)) { - if (pictureControlSetPtr->refList0Count){ + if (pictureControlSetPtr->refList0Count){ paReferenceQueueIndex = (EB_U32) CIRCULAR_ADD( ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list0Ptr->referenceList, PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH); // Max @@ -1267,7 +1267,7 @@ void* PictureDecisionKernel(void *inputPtr) // Configure List1 if (pictureControlSetPtr->sliceType == EB_B_PICTURE) { - if (pictureControlSetPtr->refList1Count){ + if (pictureControlSetPtr->refList1Count){ paReferenceQueueIndex = (EB_U32) CIRCULAR_ADD( ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list1Ptr->referenceList, PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH); // Max @@ -1319,7 +1319,7 @@ void* PictureDecisionKernel(void *inputPtr) outputResultsPtr = (PictureDecisionResults_t*) outputResultsWrapperPtr->objectPtr; - outputResultsPtr->pictureControlSetWrapperPtr = encodeContextPtr->preAssignmentBuffer[pictureIndex]; + outputResultsPtr->pictureControlSetWrapperPtr = encodeContextPtr->preAssignmentBuffer[pictureIndex]; outputResultsPtr->segmentIndex = segmentIndex; @@ -1328,13 +1328,13 @@ void* PictureDecisionKernel(void *inputPtr) } } - if (pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex]) { + if (pictureIndex == contextPtr->miniGopEndIndex[miniGopIndex]) { - // Increment the Decode Base Number - encodeContextPtr->decodeBaseNumber += contextPtr->miniGopLenght[miniGopIndex]; - } + // Increment the Decode Base Number + encodeContextPtr->decodeBaseNumber += contextPtr->miniGopLenght[miniGopIndex]; + } - if (pictureIndex == encodeContextPtr->preAssignmentBufferCount - 1) { + if (pictureIndex == encodeContextPtr->preAssignmentBufferCount - 1) { // Reset the Pre-Assignment Buffer encodeContextPtr->preAssignmentBufferCount = 0; @@ -1403,7 +1403,7 @@ void* PictureDecisionKernel(void *inputPtr) static void UnusedVariablevoidFunc_PicDecision() { (void)NxMSadKernel_funcPtrArray; - (void)NxMSadLoopKernel_funcPtrArray; + (void)NxMSadLoopKernel_funcPtrArray; (void)NxMSadAveragingKernel_funcPtrArray; (void)SadCalculation_8x8_16x16_funcPtrArray; (void)SadCalculation_32x32_64x64_funcPtrArray; diff --git a/Source/Lib/Codec/EbPictureDecisionProcess.h b/Source/Lib/Codec/EbPictureDecisionProcess.h index 93357afc8..d562a2644 100644 --- a/Source/Lib/Codec/EbPictureDecisionProcess.h +++ b/Source/Lib/Codec/EbPictureDecisionProcess.h @@ -17,36 +17,36 @@ extern "C" { * Context **************************************/ typedef struct PictureDecisionContext_s -{ +{ EbFifo_t *pictureAnalysisResultsInputFifoPtr; EbFifo_t *pictureDecisionResultsOutputFifoPtr; - + EB_U64 lastSolidColorFramePoc; - EB_BOOL resetRunningAvg; + EB_BOOL resetRunningAvg; EB_U32 **ahdRunningAvgCb; EB_U32 **ahdRunningAvgCr; EB_U32 **ahdRunningAvg; - EB_BOOL isSceneChangeDetected; + EB_BOOL isSceneChangeDetected; - // Dynamic GOP - EB_U32 totalRegionActivityCost[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; + // Dynamic GOP + EB_U32 totalRegionActivityCost[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; - EB_U32 totalNumberOfMiniGops; + EB_U32 totalNumberOfMiniGops; - EB_U32 miniGopStartIndex[MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopEndIndex [MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopLenght [MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopIntraCount[MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopIdrCount [MINI_GOP_WINDOW_MAX_COUNT]; - EB_U32 miniGopHierarchicalLevels[MINI_GOP_WINDOW_MAX_COUNT]; - EB_BOOL miniGopActivityArray [MINI_GOP_MAX_COUNT]; - EB_U32 miniGopRegionActivityCostArray[MINI_GOP_MAX_COUNT][MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; + EB_U32 miniGopStartIndex[MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopEndIndex [MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopLenght [MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopIntraCount[MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopIdrCount [MINI_GOP_WINDOW_MAX_COUNT]; + EB_U32 miniGopHierarchicalLevels[MINI_GOP_WINDOW_MAX_COUNT]; + EB_BOOL miniGopActivityArray [MINI_GOP_MAX_COUNT]; + EB_U32 miniGopRegionActivityCostArray[MINI_GOP_MAX_COUNT][MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT]; - EB_U32 miniGopGroupFadedInPicturesCount [MINI_GOP_MAX_COUNT]; - EB_U32 miniGopGroupFadedOutPicturesCount[MINI_GOP_MAX_COUNT]; + EB_U32 miniGopGroupFadedInPicturesCount [MINI_GOP_MAX_COUNT]; + EB_U32 miniGopGroupFadedOutPicturesCount[MINI_GOP_MAX_COUNT]; } PictureDecisionContext_t; /*************************************** @@ -56,7 +56,7 @@ extern EB_ERRORTYPE PictureDecisionContextCtor( PictureDecisionContext_t **contextDblPtr, EbFifo_t *pictureAnalysisResultsInputFifoPtr, EbFifo_t *pictureDecisionResultsOutputFifoPtr); - + extern void* PictureDecisionKernel(void *inputPtr); diff --git a/Source/Lib/Codec/EbPictureDecisionQueue.c b/Source/Lib/Codec/EbPictureDecisionQueue.c index 099da8e00..12cfa749d 100644 --- a/Source/Lib/Codec/EbPictureDecisionQueue.c +++ b/Source/Lib/Codec/EbPictureDecisionQueue.c @@ -7,7 +7,7 @@ #include "EbPictureDecisionQueue.h" -EB_ERRORTYPE PaReferenceQueueEntryCtor( +EB_ERRORTYPE PaReferenceQueueEntryCtor( PaReferenceQueueEntry_t **entryDblPtr) { PaReferenceQueueEntry_t *entryPtr; @@ -21,10 +21,10 @@ EB_ERRORTYPE PaReferenceQueueEntryCtor( entryPtr->list0Ptr = (ReferenceList_t*) EB_NULL; entryPtr->list1Ptr = (ReferenceList_t*) EB_NULL; EB_MALLOC(EB_S32*, entryPtr->list0.list, sizeof(EB_S32) * (1 << MAX_TEMPORAL_LAYERS) , EB_N_PTR); - + EB_MALLOC(EB_S32*, entryPtr->list1.list, sizeof(EB_S32) * (1 << MAX_TEMPORAL_LAYERS) , EB_N_PTR); return EB_ErrorNone; } - + diff --git a/Source/Lib/Codec/EbPictureDecisionQueue.h b/Source/Lib/Codec/EbPictureDecisionQueue.h index c5c391d54..4093dd4fa 100644 --- a/Source/Lib/Codec/EbPictureDecisionQueue.h +++ b/Source/Lib/Codec/EbPictureDecisionQueue.h @@ -10,7 +10,7 @@ #include "EbDefinitions.h" #include "EbSystemResourceManager.h" #include "EbPredictionStructure.h" -#include"EbPictureControlSet.h" +#include"EbPictureControlSet.h" #ifdef __cplusplus extern "C" { #endif @@ -24,16 +24,16 @@ typedef struct PaReferenceQueueEntry_s { EB_U32 dependentCount; EB_U32 referenceEntryIndex; ReferenceList_t *list0Ptr; - ReferenceList_t *list1Ptr; + ReferenceList_t *list1Ptr; EB_U32 depList0Count; EB_U32 depList1Count; DependentList_t list0; DependentList_t list1; - PictureParentControlSet_t *pPcsPtr; + PictureParentControlSet_t *pPcsPtr; } PaReferenceQueueEntry_t; -extern EB_ERRORTYPE PaReferenceQueueEntryCtor( +extern EB_ERRORTYPE PaReferenceQueueEntryCtor( PaReferenceQueueEntry_t **entryDblPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureDecisionReorderQueue.c b/Source/Lib/Codec/EbPictureDecisionReorderQueue.c index 16cc268be..e51bcbcc1 100644 --- a/Source/Lib/Codec/EbPictureDecisionReorderQueue.c +++ b/Source/Lib/Codec/EbPictureDecisionReorderQueue.c @@ -6,7 +6,7 @@ #include #include "EbPictureManagerReorderQueue.h" -EB_ERRORTYPE PictureManagerReorderEntryCtor( +EB_ERRORTYPE PictureManagerReorderEntryCtor( PictureManagerReorderEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -14,6 +14,6 @@ EB_ERRORTYPE PictureManagerReorderEntryCtor( (*entryDblPtr)->pictureNumber = pictureNumber; (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureDecisionReorderQueue.h b/Source/Lib/Codec/EbPictureDecisionReorderQueue.h index 361b5087c..df150e81c 100644 --- a/Source/Lib/Codec/EbPictureDecisionReorderQueue.h +++ b/Source/Lib/Codec/EbPictureDecisionReorderQueue.h @@ -16,11 +16,11 @@ extern "C" { * Packetization Reorder Queue Entry ************************************************/ typedef struct PictureDecisionReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *parentPcsWrapperPtr; -} PictureDecisionReorderEntry_t; +} PictureDecisionReorderEntry_t; -extern EB_ERRORTYPE PictureDecisionReorderEntryCtor( +extern EB_ERRORTYPE PictureDecisionReorderEntryCtor( PictureDecisionReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); diff --git a/Source/Lib/Codec/EbPictureDecisionResults.c b/Source/Lib/Codec/EbPictureDecisionResults.c index f3a608f12..65b21558e 100644 --- a/Source/Lib/Codec/EbPictureDecisionResults.c +++ b/Source/Lib/Codec/EbPictureDecisionResults.c @@ -8,7 +8,7 @@ #include "EbPictureDecisionResults.h" EB_ERRORTYPE PictureDecisionResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureDecisionResults_t *objectPtr; @@ -17,7 +17,7 @@ EB_ERRORTYPE PictureDecisionResultCtor( *objectDblPtr = (EB_PTR) objectPtr; objectInitDataPtr = 0; (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureDecisionResults.h b/Source/Lib/Codec/EbPictureDecisionResults.h index 0bd063f16..f2b85236b 100644 --- a/Source/Lib/Codec/EbPictureDecisionResults.h +++ b/Source/Lib/Codec/EbPictureDecisionResults.h @@ -30,7 +30,7 @@ typedef struct PictureDecisionResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE PictureDecisionResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureDemuxResults.c b/Source/Lib/Codec/EbPictureDemuxResults.c index afe0a8e2a..20f39953b 100644 --- a/Source/Lib/Codec/EbPictureDemuxResults.c +++ b/Source/Lib/Codec/EbPictureDemuxResults.c @@ -7,21 +7,21 @@ #include "EbPictureDemuxResults.h" EB_ERRORTYPE PictureResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { PictureDemuxResults_t *objectPtr; EB_MALLOC(PictureDemuxResults_t*, objectPtr, sizeof(PictureDemuxResults_t), EB_N_PTR); *objectDblPtr = objectPtr; - + objectPtr->pictureType = EB_PIC_INVALID; objectPtr->pictureControlSetWrapperPtr = 0; objectPtr->referencePictureWrapperPtr = 0; objectPtr->pictureNumber = 0; - + (void) objectInitDataPtr; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureDemuxResults.h b/Source/Lib/Codec/EbPictureDemuxResults.h index 82aaa2134..aef4c645f 100644 --- a/Source/Lib/Codec/EbPictureDemuxResults.h +++ b/Source/Lib/Codec/EbPictureDemuxResults.h @@ -27,10 +27,10 @@ typedef enum EB_PIC_TYPE { typedef struct PictureDemuxResults_s { EB_PIC_TYPE pictureType; - + // Only valid for input pictures EbObjectWrapper_t *pictureControlSetWrapperPtr; - + // Only valid for reference pictures EbObjectWrapper_t *referencePictureWrapperPtr; EbObjectWrapper_t *sequenceControlSetWrapperPtr; @@ -47,7 +47,7 @@ typedef struct PictureResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE PictureResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureManagerProcess.c b/Source/Lib/Codec/EbPictureManagerProcess.c index 951c27d12..81e4a44db 100644 --- a/Source/Lib/Codec/EbPictureManagerProcess.c +++ b/Source/Lib/Codec/EbPictureManagerProcess.c @@ -187,8 +187,8 @@ void* PictureManagerKernel(void *inputPtr) SequenceControlSet_t *entrySequenceControlSetPtr; // Initialization - PictureManagerReorderEntry_t *queueEntryPtr; - EB_S32 queueEntryIndex; + PictureManagerReorderEntry_t *queueEntryPtr; + EB_S32 queueEntryIndex; // Debug EB_U32 loopCount = 0; @@ -218,310 +218,310 @@ void* PictureManagerKernel(void *inputPtr) #if DEADLOCK_DEBUG SVT_LOG("POC %lld PM IN \n", pictureControlSetPtr->pictureNumber); #endif - queueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->pictureManagerReorderQueue[encodeContextPtr->pictureManagerReorderQueueHeadIndex]->pictureNumber); - queueEntryIndex += encodeContextPtr->pictureManagerReorderQueueHeadIndex; - queueEntryIndex = (queueEntryIndex > PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndex - PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH : queueEntryIndex; - queueEntryPtr = encodeContextPtr->pictureManagerReorderQueue[queueEntryIndex]; - if (queueEntryPtr->parentPcsWrapperPtr != NULL){ - CHECK_REPORT_ERROR_NC( - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR8); - } - else{ - queueEntryPtr->parentPcsWrapperPtr = inputPictureDemuxPtr->pictureControlSetWrapperPtr; - queueEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; - } - // Process the head of the Picture Manager Reorder Queue - queueEntryPtr = encodeContextPtr->pictureManagerReorderQueue[encodeContextPtr->pictureManagerReorderQueueHeadIndex]; + queueEntryIndex = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->pictureManagerReorderQueue[encodeContextPtr->pictureManagerReorderQueueHeadIndex]->pictureNumber); + queueEntryIndex += encodeContextPtr->pictureManagerReorderQueueHeadIndex; + queueEntryIndex = (queueEntryIndex > PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH - 1) ? queueEntryIndex - PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH : queueEntryIndex; + queueEntryPtr = encodeContextPtr->pictureManagerReorderQueue[queueEntryIndex]; + if (queueEntryPtr->parentPcsWrapperPtr != NULL){ + CHECK_REPORT_ERROR_NC( + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR8); + } + else{ + queueEntryPtr->parentPcsWrapperPtr = inputPictureDemuxPtr->pictureControlSetWrapperPtr; + queueEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; + } + // Process the head of the Picture Manager Reorder Queue + queueEntryPtr = encodeContextPtr->pictureManagerReorderQueue[encodeContextPtr->pictureManagerReorderQueueHeadIndex]; - while (queueEntryPtr->parentPcsWrapperPtr != EB_NULL) { + while (queueEntryPtr->parentPcsWrapperPtr != EB_NULL) { - pictureControlSetPtr = (PictureParentControlSet_t*)queueEntryPtr->parentPcsWrapperPtr->objectPtr; + pictureControlSetPtr = (PictureParentControlSet_t*)queueEntryPtr->parentPcsWrapperPtr->objectPtr; - predPositionPtr = pictureControlSetPtr->predStructPtr->predStructEntryPtrArray[pictureControlSetPtr->predStructIndex]; + predPositionPtr = pictureControlSetPtr->predStructPtr->predStructEntryPtrArray[pictureControlSetPtr->predStructIndex]; - // If there was a change in the number of temporal layers, then cleanup the Reference Queue's Dependent Counts - if (pictureControlSetPtr->hierarchicalLayersDiff != 0) { + // If there was a change in the number of temporal layers, then cleanup the Reference Queue's Dependent Counts + if (pictureControlSetPtr->hierarchicalLayersDiff != 0) { - referenceQueueIndex = encodeContextPtr->referencePictureQueueHeadIndex; + referenceQueueIndex = encodeContextPtr->referencePictureQueueHeadIndex; - while (referenceQueueIndex != encodeContextPtr->referencePictureQueueTailIndex) { + while (referenceQueueIndex != encodeContextPtr->referencePictureQueueTailIndex) { - referenceEntryPtr = encodeContextPtr->referencePictureQueue[referenceQueueIndex]; + referenceEntryPtr = encodeContextPtr->referencePictureQueue[referenceQueueIndex]; - if (referenceEntryPtr->pictureNumber == (pictureControlSetPtr->pictureNumber - 1)) { // Picture where the change happened + if (referenceEntryPtr->pictureNumber == (pictureControlSetPtr->pictureNumber - 1)) { // Picture where the change happened - // Get the prediction struct entry of the next GOP structure - nextPredStructPtr = GetPredictionStructure( - encodeContextPtr->predictionStructureGroupPtr, - pictureControlSetPtr->predStructure, - 1, - pictureControlSetPtr->hierarchicalLevels); - - // Get the prediction struct of a picture in temporal layer 0 (from the new GOP structure) - nextBaseLayerPredPositionPtr = nextPredStructPtr->predStructEntryPtrArray[nextPredStructPtr->predStructEntryCount - 1]; - - - // Remove all positive entries from the dependant lists - dependantListPositiveEntries = 0; - for (depIdx = 0; depIdx < referenceEntryPtr->list0.listCount; ++depIdx) { - if (referenceEntryPtr->list0.list[depIdx] >= 0) { - dependantListPositiveEntries++; - } - } - referenceEntryPtr->list0.listCount = referenceEntryPtr->list0.listCount - dependantListPositiveEntries; + // Get the prediction struct entry of the next GOP structure + nextPredStructPtr = GetPredictionStructure( + encodeContextPtr->predictionStructureGroupPtr, + pictureControlSetPtr->predStructure, + 1, + pictureControlSetPtr->hierarchicalLevels); + + // Get the prediction struct of a picture in temporal layer 0 (from the new GOP structure) + nextBaseLayerPredPositionPtr = nextPredStructPtr->predStructEntryPtrArray[nextPredStructPtr->predStructEntryCount - 1]; + + + // Remove all positive entries from the dependant lists + dependantListPositiveEntries = 0; + for (depIdx = 0; depIdx < referenceEntryPtr->list0.listCount; ++depIdx) { + if (referenceEntryPtr->list0.list[depIdx] >= 0) { + dependantListPositiveEntries++; + } + } + referenceEntryPtr->list0.listCount = referenceEntryPtr->list0.listCount - dependantListPositiveEntries; - dependantListPositiveEntries = 0; - for (depIdx = 0; depIdx < referenceEntryPtr->list1.listCount; ++depIdx) { - if (referenceEntryPtr->list1.list[depIdx] >= 0) { - dependantListPositiveEntries++; - } - } - referenceEntryPtr->list1.listCount = referenceEntryPtr->list1.listCount - dependantListPositiveEntries; + dependantListPositiveEntries = 0; + for (depIdx = 0; depIdx < referenceEntryPtr->list1.listCount; ++depIdx) { + if (referenceEntryPtr->list1.list[depIdx] >= 0) { + dependantListPositiveEntries++; + } + } + referenceEntryPtr->list1.listCount = referenceEntryPtr->list1.listCount - dependantListPositiveEntries; - for (depIdx = 0; depIdx < nextBaseLayerPredPositionPtr->depList0.listCount; ++depIdx) { - if (nextBaseLayerPredPositionPtr->depList0.list[depIdx] >= 0) { - referenceEntryPtr->list0.list[referenceEntryPtr->list0.listCount++] = nextBaseLayerPredPositionPtr->depList0.list[depIdx]; - } - } + for (depIdx = 0; depIdx < nextBaseLayerPredPositionPtr->depList0.listCount; ++depIdx) { + if (nextBaseLayerPredPositionPtr->depList0.list[depIdx] >= 0) { + referenceEntryPtr->list0.list[referenceEntryPtr->list0.listCount++] = nextBaseLayerPredPositionPtr->depList0.list[depIdx]; + } + } - for (depIdx = 0; depIdx < nextBaseLayerPredPositionPtr->depList1.listCount; ++depIdx) { - if (nextBaseLayerPredPositionPtr->depList1.list[depIdx] >= 0) { - referenceEntryPtr->list1.list[referenceEntryPtr->list1.listCount++] = nextBaseLayerPredPositionPtr->depList1.list[depIdx]; - } - } + for (depIdx = 0; depIdx < nextBaseLayerPredPositionPtr->depList1.listCount; ++depIdx) { + if (nextBaseLayerPredPositionPtr->depList1.list[depIdx] >= 0) { + referenceEntryPtr->list1.list[referenceEntryPtr->list1.listCount++] = nextBaseLayerPredPositionPtr->depList1.list[depIdx]; + } + } - // Update the dependant count update - dependantListRemovedEntries = referenceEntryPtr->depList0Count + referenceEntryPtr->depList1Count - referenceEntryPtr->dependentCount; + // Update the dependant count update + dependantListRemovedEntries = referenceEntryPtr->depList0Count + referenceEntryPtr->depList1Count - referenceEntryPtr->dependentCount; - referenceEntryPtr->depList0Count = referenceEntryPtr->list0.listCount; - referenceEntryPtr->depList1Count = referenceEntryPtr->list1.listCount; - referenceEntryPtr->dependentCount = referenceEntryPtr->depList0Count + referenceEntryPtr->depList1Count - dependantListRemovedEntries; + referenceEntryPtr->depList0Count = referenceEntryPtr->list0.listCount; + referenceEntryPtr->depList1Count = referenceEntryPtr->list1.listCount; + referenceEntryPtr->dependentCount = referenceEntryPtr->depList0Count + referenceEntryPtr->depList1Count - dependantListRemovedEntries; - } - else { - - // Modify Dependent List0 - depListCount = referenceEntryPtr->list0.listCount; - for (depIdx = 0; depIdx < depListCount; ++depIdx) { + } + else { + + // Modify Dependent List0 + depListCount = referenceEntryPtr->list0.listCount; + for (depIdx = 0; depIdx < depListCount; ++depIdx) { - // Adjust the latest currentInputPoc in case we're in a POC rollover scenario - // currentInputPoc += (currentInputPoc < referenceEntryPtr->pocNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; + // Adjust the latest currentInputPoc in case we're in a POC rollover scenario + // currentInputPoc += (currentInputPoc < referenceEntryPtr->pocNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; - depPoc = POC_CIRCULAR_ADD( - referenceEntryPtr->pictureNumber, // can't use a value that gets reset - referenceEntryPtr->list0.list[depIdx]/*, - sequenceControlSetPtr->bitsForPictureOrderCount*/); + depPoc = POC_CIRCULAR_ADD( + referenceEntryPtr->pictureNumber, // can't use a value that gets reset + referenceEntryPtr->list0.list[depIdx]/*, + sequenceControlSetPtr->bitsForPictureOrderCount*/); - // If Dependent POC is greater or equal to the IDR POC - if (depPoc >= pictureControlSetPtr->pictureNumber && referenceEntryPtr->list0.list[depIdx]) { + // If Dependent POC is greater or equal to the IDR POC + if (depPoc >= pictureControlSetPtr->pictureNumber && referenceEntryPtr->list0.list[depIdx]) { - referenceEntryPtr->list0.list[depIdx] = 0; + referenceEntryPtr->list0.list[depIdx] = 0; - // Decrement the Reference's referenceCount - --referenceEntryPtr->dependentCount; + // Decrement the Reference's referenceCount + --referenceEntryPtr->dependentCount; - CHECK_REPORT_ERROR( - (referenceEntryPtr->dependentCount != ~0u), - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR3); - } - } + CHECK_REPORT_ERROR( + (referenceEntryPtr->dependentCount != ~0u), + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR3); + } + } - // Modify Dependent List1 - depListCount = referenceEntryPtr->list1.listCount; - for (depIdx = 0; depIdx < depListCount; ++depIdx) { + // Modify Dependent List1 + depListCount = referenceEntryPtr->list1.listCount; + for (depIdx = 0; depIdx < depListCount; ++depIdx) { - // Adjust the latest currentInputPoc in case we're in a POC rollover scenario - // currentInputPoc += (currentInputPoc < referenceEntryPtr->pocNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; + // Adjust the latest currentInputPoc in case we're in a POC rollover scenario + // currentInputPoc += (currentInputPoc < referenceEntryPtr->pocNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; - depPoc = POC_CIRCULAR_ADD( - referenceEntryPtr->pictureNumber, - referenceEntryPtr->list1.list[depIdx]/*, - sequenceControlSetPtr->bitsForPictureOrderCount*/); + depPoc = POC_CIRCULAR_ADD( + referenceEntryPtr->pictureNumber, + referenceEntryPtr->list1.list[depIdx]/*, + sequenceControlSetPtr->bitsForPictureOrderCount*/); - // If Dependent POC is greater or equal to the IDR POC - if ((depPoc >= pictureControlSetPtr->pictureNumber) && referenceEntryPtr->list1.list[depIdx]) { - referenceEntryPtr->list1.list[depIdx] = 0; + // If Dependent POC is greater or equal to the IDR POC + if ((depPoc >= pictureControlSetPtr->pictureNumber) && referenceEntryPtr->list1.list[depIdx]) { + referenceEntryPtr->list1.list[depIdx] = 0; - // Decrement the Reference's referenceCount - --referenceEntryPtr->dependentCount; + // Decrement the Reference's referenceCount + --referenceEntryPtr->dependentCount; - CHECK_REPORT_ERROR( - (referenceEntryPtr->dependentCount != ~0u), - encodeContextPtr->appCallbackPtr, - EB_ENC_PD_ERROR3); - } - } - } + CHECK_REPORT_ERROR( + (referenceEntryPtr->dependentCount != ~0u), + encodeContextPtr->appCallbackPtr, + EB_ENC_PD_ERROR3); + } + } + } - // Increment the referenceQueueIndex Iterator - referenceQueueIndex = (referenceQueueIndex == REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : referenceQueueIndex + 1; - } - } - - // If there was an I-frame or Scene Change, then cleanup the Reference Queue's Dependent Counts - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) - { - - referenceQueueIndex = encodeContextPtr->referencePictureQueueHeadIndex; - while (referenceQueueIndex != encodeContextPtr->referencePictureQueueTailIndex) { - - referenceEntryPtr = encodeContextPtr->referencePictureQueue[referenceQueueIndex]; - - // Modify Dependent List0 - depListCount = referenceEntryPtr->list0.listCount; - for (depIdx = 0; depIdx < depListCount; ++depIdx) { - - currentInputPoc = pictureControlSetPtr->pictureNumber; - - // Adjust the latest currentInputPoc in case we're in a POC rollover scenario - // currentInputPoc += (currentInputPoc < referenceEntryPtr->pictureNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; - - depPoc = POC_CIRCULAR_ADD( - referenceEntryPtr->pictureNumber, // can't use a value that gets reset - referenceEntryPtr->list0.list[depIdx]/*, - sequenceControlSetPtr->bitsForPictureOrderCount*/); + // Increment the referenceQueueIndex Iterator + referenceQueueIndex = (referenceQueueIndex == REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : referenceQueueIndex + 1; + } + } + + // If there was an I-frame or Scene Change, then cleanup the Reference Queue's Dependent Counts + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) + { + + referenceQueueIndex = encodeContextPtr->referencePictureQueueHeadIndex; + while (referenceQueueIndex != encodeContextPtr->referencePictureQueueTailIndex) { + + referenceEntryPtr = encodeContextPtr->referencePictureQueue[referenceQueueIndex]; + + // Modify Dependent List0 + depListCount = referenceEntryPtr->list0.listCount; + for (depIdx = 0; depIdx < depListCount; ++depIdx) { + + currentInputPoc = pictureControlSetPtr->pictureNumber; + + // Adjust the latest currentInputPoc in case we're in a POC rollover scenario + // currentInputPoc += (currentInputPoc < referenceEntryPtr->pictureNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; + + depPoc = POC_CIRCULAR_ADD( + referenceEntryPtr->pictureNumber, // can't use a value that gets reset + referenceEntryPtr->list0.list[depIdx]/*, + sequenceControlSetPtr->bitsForPictureOrderCount*/); - // If Dependent POC is greater or equal to the IDR POC - if (depPoc >= currentInputPoc && referenceEntryPtr->list0.list[depIdx]) { - - referenceEntryPtr->list0.list[depIdx] = 0; - - // Decrement the Reference's referenceCount - --referenceEntryPtr->dependentCount; - CHECK_REPORT_ERROR( - (referenceEntryPtr->dependentCount != ~0u), - encodeContextPtr->appCallbackPtr, - EB_ENC_PM_ERROR3); - } - } - - // Modify Dependent List1 - depListCount = referenceEntryPtr->list1.listCount; - for (depIdx = 0; depIdx < depListCount; ++depIdx) { - - currentInputPoc = pictureControlSetPtr->pictureNumber; - - // Adjust the latest currentInputPoc in case we're in a POC rollover scenario - // currentInputPoc += (currentInputPoc < referenceEntryPtr->pictureNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; - - depPoc = POC_CIRCULAR_ADD( - referenceEntryPtr->pictureNumber, - referenceEntryPtr->list1.list[depIdx]/*, - sequenceControlSetPtr->bitsForPictureOrderCount*/); - - // If Dependent POC is greater or equal to the IDR POC or if we inserted trailing Ps - if (((depPoc >= currentInputPoc) || (((pictureControlSetPtr->preAssignmentBufferCount != pictureControlSetPtr->predStructPtr->predStructPeriod) || (pictureControlSetPtr->idrFlag == EB_TRUE)) && (depPoc > (currentInputPoc - pictureControlSetPtr->preAssignmentBufferCount)))) && referenceEntryPtr->list1.list[depIdx]) { - - referenceEntryPtr->list1.list[depIdx] = 0; - - // Decrement the Reference's referenceCount - --referenceEntryPtr->dependentCount; - CHECK_REPORT_ERROR( - (referenceEntryPtr->dependentCount != ~0u), - encodeContextPtr->appCallbackPtr, - EB_ENC_PM_ERROR3); - } - - } - - // Increment the referenceQueueIndex Iterator - referenceQueueIndex = (referenceQueueIndex == REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : referenceQueueIndex + 1; - } - - } - else if (pictureControlSetPtr->idrFlag == EB_TRUE) { - - // Set Reference Entry pointer - referenceEntryPtr = (ReferenceQueueEntry_t*)EB_NULL; - } - - // Check if the EnhancedPictureQueue is full. - // *Note - Having the number of Enhanced Pictures less than the InputQueueSize should ensure this never gets hit - - CHECK_REPORT_ERROR( - (((encodeContextPtr->inputPictureQueueHeadIndex != encodeContextPtr->inputPictureQueueTailIndex) || (encodeContextPtr->inputPictureQueue[encodeContextPtr->inputPictureQueueHeadIndex]->inputObjectPtr == EB_NULL))), - encodeContextPtr->appCallbackPtr, - EB_ENC_PM_ERROR4); - - // Place Picture in input queue - inputEntryPtr = encodeContextPtr->inputPictureQueue[encodeContextPtr->inputPictureQueueTailIndex]; - inputEntryPtr->inputObjectPtr = queueEntryPtr->parentPcsWrapperPtr; - inputEntryPtr->referenceEntryIndex = encodeContextPtr->referencePictureQueueTailIndex; - encodeContextPtr->inputPictureQueueTailIndex = - (encodeContextPtr->inputPictureQueueTailIndex == INPUT_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->inputPictureQueueTailIndex + 1; - - // Copy the reference lists into the inputEntry and - // set the Reference Counts Based on Temporal Layer and how many frames are active - pictureControlSetPtr->refList0Count = (pictureControlSetPtr->sliceType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList0.referenceListCount; - pictureControlSetPtr->refList1Count = (pictureControlSetPtr->sliceType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList1.referenceListCount; - inputEntryPtr->list0Ptr = &predPositionPtr->refList0; - inputEntryPtr->list1Ptr = &predPositionPtr->refList1; - - // Check if the ReferencePictureQueue is full. - CHECK_REPORT_ERROR( - (((encodeContextPtr->referencePictureQueueHeadIndex != encodeContextPtr->referencePictureQueueTailIndex) || (encodeContextPtr->referencePictureQueue[encodeContextPtr->referencePictureQueueHeadIndex]->referenceObjectPtr == EB_NULL))), - encodeContextPtr->appCallbackPtr, - EB_ENC_PM_ERROR5); - - // Create Reference Queue Entry even if picture will not be referenced - referenceEntryPtr = encodeContextPtr->referencePictureQueue[encodeContextPtr->referencePictureQueueTailIndex]; - referenceEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; - referenceEntryPtr->referenceObjectPtr = (EbObjectWrapper_t*)EB_NULL; - referenceEntryPtr->releaseEnable = EB_TRUE; - referenceEntryPtr->referenceAvailable = EB_FALSE; - referenceEntryPtr->isUsedAsReferenceFlag = pictureControlSetPtr->isUsedAsReferenceFlag; - referenceEntryPtr->feedbackArrived = EB_FALSE; - encodeContextPtr->referencePictureQueueTailIndex = - (encodeContextPtr->referencePictureQueueTailIndex == REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->referencePictureQueueTailIndex + 1; + // If Dependent POC is greater or equal to the IDR POC + if (depPoc >= currentInputPoc && referenceEntryPtr->list0.list[depIdx]) { + + referenceEntryPtr->list0.list[depIdx] = 0; + + // Decrement the Reference's referenceCount + --referenceEntryPtr->dependentCount; + CHECK_REPORT_ERROR( + (referenceEntryPtr->dependentCount != ~0u), + encodeContextPtr->appCallbackPtr, + EB_ENC_PM_ERROR3); + } + } + + // Modify Dependent List1 + depListCount = referenceEntryPtr->list1.listCount; + for (depIdx = 0; depIdx < depListCount; ++depIdx) { + + currentInputPoc = pictureControlSetPtr->pictureNumber; + + // Adjust the latest currentInputPoc in case we're in a POC rollover scenario + // currentInputPoc += (currentInputPoc < referenceEntryPtr->pictureNumber) ? (1 << sequenceControlSetPtr->bitsForPictureOrderCount) : 0; + + depPoc = POC_CIRCULAR_ADD( + referenceEntryPtr->pictureNumber, + referenceEntryPtr->list1.list[depIdx]/*, + sequenceControlSetPtr->bitsForPictureOrderCount*/); + + // If Dependent POC is greater or equal to the IDR POC or if we inserted trailing Ps + if (((depPoc >= currentInputPoc) || (((pictureControlSetPtr->preAssignmentBufferCount != pictureControlSetPtr->predStructPtr->predStructPeriod) || (pictureControlSetPtr->idrFlag == EB_TRUE)) && (depPoc > (currentInputPoc - pictureControlSetPtr->preAssignmentBufferCount)))) && referenceEntryPtr->list1.list[depIdx]) { + + referenceEntryPtr->list1.list[depIdx] = 0; + + // Decrement the Reference's referenceCount + --referenceEntryPtr->dependentCount; + CHECK_REPORT_ERROR( + (referenceEntryPtr->dependentCount != ~0u), + encodeContextPtr->appCallbackPtr, + EB_ENC_PM_ERROR3); + } + + } + + // Increment the referenceQueueIndex Iterator + referenceQueueIndex = (referenceQueueIndex == REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : referenceQueueIndex + 1; + } + + } + else if (pictureControlSetPtr->idrFlag == EB_TRUE) { + + // Set Reference Entry pointer + referenceEntryPtr = (ReferenceQueueEntry_t*)EB_NULL; + } + + // Check if the EnhancedPictureQueue is full. + // *Note - Having the number of Enhanced Pictures less than the InputQueueSize should ensure this never gets hit + + CHECK_REPORT_ERROR( + (((encodeContextPtr->inputPictureQueueHeadIndex != encodeContextPtr->inputPictureQueueTailIndex) || (encodeContextPtr->inputPictureQueue[encodeContextPtr->inputPictureQueueHeadIndex]->inputObjectPtr == EB_NULL))), + encodeContextPtr->appCallbackPtr, + EB_ENC_PM_ERROR4); + + // Place Picture in input queue + inputEntryPtr = encodeContextPtr->inputPictureQueue[encodeContextPtr->inputPictureQueueTailIndex]; + inputEntryPtr->inputObjectPtr = queueEntryPtr->parentPcsWrapperPtr; + inputEntryPtr->referenceEntryIndex = encodeContextPtr->referencePictureQueueTailIndex; + encodeContextPtr->inputPictureQueueTailIndex = + (encodeContextPtr->inputPictureQueueTailIndex == INPUT_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->inputPictureQueueTailIndex + 1; + + // Copy the reference lists into the inputEntry and + // set the Reference Counts Based on Temporal Layer and how many frames are active + pictureControlSetPtr->refList0Count = (pictureControlSetPtr->sliceType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList0.referenceListCount; + pictureControlSetPtr->refList1Count = (pictureControlSetPtr->sliceType == EB_I_PICTURE) ? 0 : (EB_U8)predPositionPtr->refList1.referenceListCount; + inputEntryPtr->list0Ptr = &predPositionPtr->refList0; + inputEntryPtr->list1Ptr = &predPositionPtr->refList1; + + // Check if the ReferencePictureQueue is full. + CHECK_REPORT_ERROR( + (((encodeContextPtr->referencePictureQueueHeadIndex != encodeContextPtr->referencePictureQueueTailIndex) || (encodeContextPtr->referencePictureQueue[encodeContextPtr->referencePictureQueueHeadIndex]->referenceObjectPtr == EB_NULL))), + encodeContextPtr->appCallbackPtr, + EB_ENC_PM_ERROR5); + + // Create Reference Queue Entry even if picture will not be referenced + referenceEntryPtr = encodeContextPtr->referencePictureQueue[encodeContextPtr->referencePictureQueueTailIndex]; + referenceEntryPtr->pictureNumber = pictureControlSetPtr->pictureNumber; + referenceEntryPtr->referenceObjectPtr = (EbObjectWrapper_t*)EB_NULL; + referenceEntryPtr->releaseEnable = EB_TRUE; + referenceEntryPtr->referenceAvailable = EB_FALSE; + referenceEntryPtr->isUsedAsReferenceFlag = pictureControlSetPtr->isUsedAsReferenceFlag; + referenceEntryPtr->feedbackArrived = EB_FALSE; + encodeContextPtr->referencePictureQueueTailIndex = + (encodeContextPtr->referencePictureQueueTailIndex == REFERENCE_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->referencePictureQueueTailIndex + 1; // Copy the Dependent Lists - // *Note - we are removing any leading picture dependencies for now - referenceEntryPtr->list0.listCount = 0; - for (depIdx = 0; depIdx < predPositionPtr->depList0.listCount; ++depIdx) { - if (predPositionPtr->depList0.list[depIdx] >= 0) { - referenceEntryPtr->list0.list[referenceEntryPtr->list0.listCount++] = predPositionPtr->depList0.list[depIdx]; - } - } - - referenceEntryPtr->list1.listCount = predPositionPtr->depList1.listCount; - for (depIdx = 0; depIdx < predPositionPtr->depList1.listCount; ++depIdx) { - referenceEntryPtr->list1.list[depIdx] = predPositionPtr->depList1.list[depIdx]; - } - - referenceEntryPtr->depList0Count = referenceEntryPtr->list0.listCount; - referenceEntryPtr->depList1Count = referenceEntryPtr->list1.listCount; - referenceEntryPtr->dependentCount = referenceEntryPtr->depList0Count + referenceEntryPtr->depList1Count; - - CHECK_REPORT_ERROR( - (pictureControlSetPtr->predStructPtr->predStructPeriod < MAX_ELAPSED_IDR_COUNT), - encodeContextPtr->appCallbackPtr, - EB_ENC_PM_ERROR6); - - // Release the Reference Buffer once we know it is not a reference - if (pictureControlSetPtr->isUsedAsReferenceFlag == EB_FALSE){ - // Release the nominal liveCount value - EbReleaseObject(pictureControlSetPtr->referencePictureWrapperPtr); - pictureControlSetPtr->referencePictureWrapperPtr = (EbObjectWrapper_t*)EB_NULL; - } + // *Note - we are removing any leading picture dependencies for now + referenceEntryPtr->list0.listCount = 0; + for (depIdx = 0; depIdx < predPositionPtr->depList0.listCount; ++depIdx) { + if (predPositionPtr->depList0.list[depIdx] >= 0) { + referenceEntryPtr->list0.list[referenceEntryPtr->list0.listCount++] = predPositionPtr->depList0.list[depIdx]; + } + } + + referenceEntryPtr->list1.listCount = predPositionPtr->depList1.listCount; + for (depIdx = 0; depIdx < predPositionPtr->depList1.listCount; ++depIdx) { + referenceEntryPtr->list1.list[depIdx] = predPositionPtr->depList1.list[depIdx]; + } + + referenceEntryPtr->depList0Count = referenceEntryPtr->list0.listCount; + referenceEntryPtr->depList1Count = referenceEntryPtr->list1.listCount; + referenceEntryPtr->dependentCount = referenceEntryPtr->depList0Count + referenceEntryPtr->depList1Count; + + CHECK_REPORT_ERROR( + (pictureControlSetPtr->predStructPtr->predStructPeriod < MAX_ELAPSED_IDR_COUNT), + encodeContextPtr->appCallbackPtr, + EB_ENC_PM_ERROR6); + + // Release the Reference Buffer once we know it is not a reference + if (pictureControlSetPtr->isUsedAsReferenceFlag == EB_FALSE){ + // Release the nominal liveCount value + EbReleaseObject(pictureControlSetPtr->referencePictureWrapperPtr); + pictureControlSetPtr->referencePictureWrapperPtr = (EbObjectWrapper_t*)EB_NULL; + } #if DEADLOCK_DEBUG SVT_LOG("POC %lld PM OUT \n", pictureControlSetPtr->pictureNumber); #endif - // Release the Picture Manager Reorder Queue - queueEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t*)EB_NULL; - queueEntryPtr->pictureNumber += PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH; + // Release the Picture Manager Reorder Queue + queueEntryPtr->parentPcsWrapperPtr = (EbObjectWrapper_t*)EB_NULL; + queueEntryPtr->pictureNumber += PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH; - // Increment the Picture Manager Reorder Queue - encodeContextPtr->pictureManagerReorderQueueHeadIndex = (encodeContextPtr->pictureManagerReorderQueueHeadIndex == PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->pictureManagerReorderQueueHeadIndex + 1; + // Increment the Picture Manager Reorder Queue + encodeContextPtr->pictureManagerReorderQueueHeadIndex = (encodeContextPtr->pictureManagerReorderQueueHeadIndex == PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH - 1) ? 0 : encodeContextPtr->pictureManagerReorderQueueHeadIndex + 1; - // Get the next entry from the Picture Manager Reorder Queue (Entry N+1) - queueEntryPtr = encodeContextPtr->pictureManagerReorderQueue[encodeContextPtr->pictureManagerReorderQueueHeadIndex]; + // Get the next entry from the Picture Manager Reorder Queue (Entry N+1) + queueEntryPtr = encodeContextPtr->pictureManagerReorderQueue[encodeContextPtr->pictureManagerReorderQueueHeadIndex]; - } - break; + } + break; case EB_PIC_REFERENCE: @@ -623,7 +623,7 @@ void* PictureManagerKernel(void *inputPtr) availabilityFlag = EB_TRUE; // Check RefList0 Availability - if (entryPictureControlSetPtr->refList0Count){ + if (entryPictureControlSetPtr->refList0Count){ referenceQueueIndex = (EB_U32) CIRCULAR_ADD( ((EB_S32) inputEntryPtr->referenceEntryIndex) - // Base inputEntryPtr->list0Ptr->referenceList, // Offset @@ -654,7 +654,7 @@ void* PictureManagerKernel(void *inputPtr) // Check RefList1 Availability if(entryPictureControlSetPtr->sliceType == EB_B_PICTURE) { - if (entryPictureControlSetPtr->refList1Count){ + if (entryPictureControlSetPtr->refList1Count){ // If Reference is valid (non-zero), update the availability if(inputEntryPtr->list1Ptr->referenceList != (EB_S32) INVALID_POC) { @@ -724,8 +724,8 @@ void* PictureManagerKernel(void *inputPtr) ChildPictureControlSetPtr->ParentPcsPtr->quantizedCoeffNumBits = 0; ChildPictureControlSetPtr->encMode = entryPictureControlSetPtr->encMode; - ChildPictureControlSetPtr->encDecCodedLcuCount = 0; - ChildPictureControlSetPtr->resetDone = EB_FALSE; + ChildPictureControlSetPtr->encDecCodedLcuCount = 0; + ChildPictureControlSetPtr->resetDone = EB_FALSE; // printf("POC [%lu], use pcs %p\n", ChildPictureControlSetPtr->pictureNumber, ChildPictureControlSetPtr); @@ -815,11 +815,11 @@ void* PictureManagerKernel(void *inputPtr) EB_MEMSET(ChildPictureControlSetPtr->refPicQpArray, 0, 2 * sizeof(EB_U8)); EB_MEMSET(ChildPictureControlSetPtr->refSliceTypeArray, 0, 2 * sizeof(EB_PICTURE)); - + // Configure List0 if ((entryPictureControlSetPtr->sliceType == EB_P_PICTURE) || (entryPictureControlSetPtr->sliceType == EB_B_PICTURE)) { - if (entryPictureControlSetPtr->refList0Count){ + if (entryPictureControlSetPtr->refList0Count){ referenceQueueIndex = (EB_U32) CIRCULAR_ADD( ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list0Ptr->referenceList, REFERENCE_QUEUE_MAX_DEPTH); // Max @@ -851,7 +851,7 @@ void* PictureManagerKernel(void *inputPtr) // Configure List1 if (entryPictureControlSetPtr->sliceType == EB_B_PICTURE) { - if (entryPictureControlSetPtr->refList1Count){ + if (entryPictureControlSetPtr->refList1Count){ referenceQueueIndex = (EB_U32) CIRCULAR_ADD( ((EB_S32) inputEntryPtr->referenceEntryIndex) - inputEntryPtr->list1Ptr->referenceList, REFERENCE_QUEUE_MAX_DEPTH); // Max @@ -863,7 +863,7 @@ void* PictureManagerKernel(void *inputPtr) ChildPictureControlSetPtr->refPicQpArray[REF_LIST_1] = ((EbReferenceObject_t*) referenceEntryPtr->referenceObjectPtr->objectPtr)->qp; ChildPictureControlSetPtr->refSliceTypeArray[REF_LIST_1] = ((EbReferenceObject_t*) referenceEntryPtr->referenceObjectPtr->objectPtr)->sliceType; - + // Increment the Reference's liveCount by the number of tiles in the input picture diff --git a/Source/Lib/Codec/EbPictureManagerProcess.h b/Source/Lib/Codec/EbPictureManagerProcess.h index 0ec16eb32..f7014d07d 100644 --- a/Source/Lib/Codec/EbPictureManagerProcess.h +++ b/Source/Lib/Codec/EbPictureManagerProcess.h @@ -15,11 +15,11 @@ extern "C" { * Context ***************************************/ typedef struct PictureManagerContext_s -{ +{ EbFifo_t *pictureInputFifoPtr; EbFifo_t *pictureManagerOutputFifoPtr; EbFifo_t **pictureControlSetFifoPtrArray; - + } PictureManagerContext_t; /*************************************** @@ -28,10 +28,10 @@ typedef struct PictureManagerContext_s extern EB_ERRORTYPE PictureManagerContextCtor( PictureManagerContext_t **contextDblPtr, EbFifo_t *pictureInputFifoPtr, - EbFifo_t *pictureManagerOutputFifoPtr, + EbFifo_t *pictureManagerOutputFifoPtr, EbFifo_t **pictureControlSetFifoPtrArray); - - + + extern void* PictureManagerKernel(void *inputPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbPictureManagerQueue.c b/Source/Lib/Codec/EbPictureManagerQueue.c index addaf9831..109ae41c6 100644 --- a/Source/Lib/Codec/EbPictureManagerQueue.c +++ b/Source/Lib/Codec/EbPictureManagerQueue.c @@ -25,7 +25,7 @@ EB_ERRORTYPE InputQueueEntryCtor( -EB_ERRORTYPE ReferenceQueueEntryCtor( +EB_ERRORTYPE ReferenceQueueEntryCtor( ReferenceQueueEntry_t **entryDblPtr) { ReferenceQueueEntry_t *entryPtr; diff --git a/Source/Lib/Codec/EbPictureManagerQueue.h b/Source/Lib/Codec/EbPictureManagerQueue.h index 922bcaca9..edce3802c 100644 --- a/Source/Lib/Codec/EbPictureManagerQueue.h +++ b/Source/Lib/Codec/EbPictureManagerQueue.h @@ -19,19 +19,19 @@ extern "C" { * Input Queue Entry ************************************************/ struct ReferenceQueueEntry_s; // empty struct definition - + typedef struct InputQueueEntry_s { EbObjectWrapper_t *inputObjectPtr; EB_U32 dependentCount; - EB_U32 referenceEntryIndex; + EB_U32 referenceEntryIndex; ReferenceList_t *list0Ptr; - ReferenceList_t *list1Ptr; + ReferenceList_t *list1Ptr; EB_U32 useCount; EB_BOOL memoryMgmtLoopDone; EB_BOOL rateControlLoopDone; EB_BOOL encodingHasBegun; -} InputQueueEntry_t; +} InputQueueEntry_t; /************************************************ * Reference Queue Entry @@ -52,25 +52,25 @@ typedef struct ReferenceQueueEntry_s { EB_U64 rcGroupIndex; EB_BOOL feedbackArrived; - -} ReferenceQueueEntry_t; + +} ReferenceQueueEntry_t; /************************************************ * Rate Control Input Queue Entry ************************************************/ - + typedef struct RcInputQueueEntry_s { EB_U64 pictureNumber; EbObjectWrapper_t *inputObjectPtr; - + EB_BOOL isPassed; EB_BOOL releaseEnabled; EB_U64 groupId; EB_U64 gopFirstPoc; EB_U32 gopIndex; - - -} RcInputQueueEntry_t; + + +} RcInputQueueEntry_t; /************************************************ * Rate Control FeedBack Queue Entry @@ -86,19 +86,19 @@ typedef struct RcFeedbackQueueEntry_s { EB_U64 groupId; EB_U64 gopFirstPoc; EB_U32 gopIndex; - -} RcFeedbackQueueEntry_t; -extern EB_ERRORTYPE InputQueueEntryCtor( +} RcFeedbackQueueEntry_t; + +extern EB_ERRORTYPE InputQueueEntryCtor( InputQueueEntry_t **entryDblPtr); - -extern EB_ERRORTYPE ReferenceQueueEntryCtor( + +extern EB_ERRORTYPE ReferenceQueueEntryCtor( ReferenceQueueEntry_t **entryDblPtr); #ifdef __cplusplus } -#endif +#endif #endif // EbPictureManagerQueue_h \ No newline at end of file diff --git a/Source/Lib/Codec/EbPictureManagerReorderQueue.c b/Source/Lib/Codec/EbPictureManagerReorderQueue.c index e8f8f84de..0d5440eaf 100644 --- a/Source/Lib/Codec/EbPictureManagerReorderQueue.c +++ b/Source/Lib/Codec/EbPictureManagerReorderQueue.c @@ -6,7 +6,7 @@ #include #include "EbPictureDecisionReorderQueue.h" -EB_ERRORTYPE PictureDecisionReorderEntryCtor( +EB_ERRORTYPE PictureDecisionReorderEntryCtor( PictureDecisionReorderEntry_t **entryDblPtr, EB_U32 pictureNumber) { @@ -14,6 +14,6 @@ EB_ERRORTYPE PictureDecisionReorderEntryCtor( (*entryDblPtr)->pictureNumber = pictureNumber; (*entryDblPtr)->parentPcsWrapperPtr = (EbObjectWrapper_t *)EB_NULL; - + return EB_ErrorNone; } diff --git a/Source/Lib/Codec/EbPictureManagerReorderQueue.h b/Source/Lib/Codec/EbPictureManagerReorderQueue.h index b368898b9..f4d3f5cac 100644 --- a/Source/Lib/Codec/EbPictureManagerReorderQueue.h +++ b/Source/Lib/Codec/EbPictureManagerReorderQueue.h @@ -16,11 +16,11 @@ extern "C" { * Packetization Reorder Queue Entry ************************************************/ typedef struct PictureManagerReorderEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EbObjectWrapper_t *parentPcsWrapperPtr; -} PictureManagerReorderEntry_t; +} PictureManagerReorderEntry_t; -extern EB_ERRORTYPE PictureManagerReorderEntryCtor( +extern EB_ERRORTYPE PictureManagerReorderEntryCtor( PictureManagerReorderEntry_t **entryDblPtr, EB_U32 pictureNumber); diff --git a/Source/Lib/Codec/EbPictureOperators.c b/Source/Lib/Codec/EbPictureOperators.c index 14dd182aa..2367f8611 100644 --- a/Source/Lib/Codec/EbPictureOperators.c +++ b/Source/Lib/Codec/EbPictureOperators.c @@ -28,7 +28,7 @@ void PictureAddition( EB_U32 height) { - AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][width >> 3]( + AdditionKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][width >> 3]( predPtr, predStride, residualPtr, @@ -74,7 +74,7 @@ EB_ERRORTYPE PictureCopy8Bit( if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( &(src->bufferCb[srcChromaOriginIndex]), src->strideCb, &(dst->bufferCb[dstChromaOriginIndex]), @@ -85,7 +85,7 @@ EB_ERRORTYPE PictureCopy8Bit( if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaAreaWidth >> 3]( &(src->bufferCr[srcChromaOriginIndex]), src->strideCr, &(dst->bufferCr[dstChromaOriginIndex]), @@ -184,47 +184,47 @@ void PictureResidual16bit( } EB_U64 EbHevcComputeNxMSatd8x8Units_U8( - EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr - EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride - EB_U32 width, // input parameter, block width (N) - EB_U32 height, // input parameter, block height (M) - EB_U64 *dcValue) + EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr + EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride + EB_U32 width, // input parameter, block width (N) + EB_U32 height, // input parameter, block height (M) + EB_U64 *dcValue) { - EB_U64 satd = 0; - EB_U32 blockIndexInWidth; - EB_U32 blockIndexInHeight; - EB_SATD_U8_TYPE Compute8x8SatdFunction = Compute8x8Satd_U8_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]; - - for (blockIndexInHeight = 0; blockIndexInHeight < height >> 3; ++blockIndexInHeight) { - for (blockIndexInWidth = 0; blockIndexInWidth < width >> 3; ++blockIndexInWidth) { - satd += Compute8x8SatdFunction(&(src[(blockIndexInWidth << 3) + (blockIndexInHeight << 3) * srcStride]), dcValue, srcStride); - } - } - - return satd; + EB_U64 satd = 0; + EB_U32 blockIndexInWidth; + EB_U32 blockIndexInHeight; + EB_SATD_U8_TYPE Compute8x8SatdFunction = Compute8x8Satd_U8_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)]; + + for (blockIndexInHeight = 0; blockIndexInHeight < height >> 3; ++blockIndexInHeight) { + for (blockIndexInWidth = 0; blockIndexInWidth < width >> 3; ++blockIndexInWidth) { + satd += Compute8x8SatdFunction(&(src[(blockIndexInWidth << 3) + (blockIndexInHeight << 3) * srcStride]), dcValue, srcStride); + } + } + + return satd; } EB_U64 EbHevcComputeNxMSatd4x4Units_U8( - EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr - EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride - EB_U32 width, // input parameter, block width (N) - EB_U32 height, // input parameter, block height (M) - EB_U64 *dcValue) + EB_U8 *src, //EB_S16 *diff, // input parameter, diff samples Ptr + EB_U32 srcStride, //EB_U32 diffStride, // input parameter, source stride + EB_U32 width, // input parameter, block width (N) + EB_U32 height, // input parameter, block height (M) + EB_U64 *dcValue) { - EB_U64 satd = 0; - EB_U32 blockIndexInWidth; - EB_U32 blockIndexInHeight; + EB_U64 satd = 0; + EB_U32 blockIndexInWidth; + EB_U32 blockIndexInHeight; - for (blockIndexInHeight = 0; blockIndexInHeight < height >> 2; ++blockIndexInHeight) { - for (blockIndexInWidth = 0; blockIndexInWidth < width >> 2; ++blockIndexInWidth) { - satd += Compute4x4Satd_U8(&(src[(blockIndexInWidth << 2) + (blockIndexInHeight << 2) * srcStride]), dcValue, srcStride); + for (blockIndexInHeight = 0; blockIndexInHeight < height >> 2; ++blockIndexInHeight) { + for (blockIndexInWidth = 0; blockIndexInWidth < width >> 2; ++blockIndexInWidth) { + satd += Compute4x4Satd_U8(&(src[(blockIndexInWidth << 2) + (blockIndexInHeight << 2) * srcStride]), dcValue, srcStride); - } - } + } + } - return satd; + return satd; } /******************************************* * returns NxM Sum of Absolute Transformed Differences using Compute4x4Satd @@ -333,8 +333,8 @@ EB_ERRORTYPE PictureFullDistortion_R( EB_U64 lumaDistortion[DIST_CALC_TOTAL], EB_U64 cbDistortion[DIST_CALC_TOTAL], EB_U64 crDistortion[DIST_CALC_TOTAL], - EB_U32 *countNonZeroCoeffs, - EB_MODETYPE mode) + EB_U32 *countNonZeroCoeffs, + EB_MODETYPE mode) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -349,7 +349,7 @@ EB_ERRORTYPE PictureFullDistortion_R( // Y if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[0] != 0][mode == INTRA_MODE][areaSize>>3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[0] != 0][mode == INTRA_MODE][areaSize>>3]( &(((EB_S16*) coeff->bufferY)[coeffLumaOriginIndex]), coeff->strideY, &(((EB_S16*) reconCoeff->bufferY)[coeffLumaOriginIndex]), @@ -362,7 +362,7 @@ EB_ERRORTYPE PictureFullDistortion_R( // Cb if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[1] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[1] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( &(((EB_S16*) coeff->bufferCb)[coeffChromaOriginIndex]), coeff->strideCb, &(((EB_S16*) reconCoeff->bufferCb)[coeffChromaOriginIndex]), @@ -375,7 +375,7 @@ EB_ERRORTYPE PictureFullDistortion_R( // Cr if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[2] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffs[2] != 0][mode == INTRA_MODE][chromaAreaSize >> 3]( &(((EB_S16*) coeff->bufferCr)[coeffChromaOriginIndex]), coeff->strideCr, &(((EB_S16*) reconCoeff->bufferCr)[coeffChromaOriginIndex]), @@ -401,8 +401,8 @@ EB_ERRORTYPE PictureFullDistortionLuma( EB_U32 reconCoeffLumaOriginIndex, EB_U32 areaSize, EB_U64 lumaDistortion[DIST_CALC_TOTAL], - EB_U32 countNonZeroCoeffsY, - EB_MODETYPE mode) + EB_U32 countNonZeroCoeffsY, + EB_MODETYPE mode) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -411,7 +411,7 @@ EB_ERRORTYPE PictureFullDistortionLuma( lumaDistortion[1] = 0; // Y - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffsY != 0][mode == INTRA_MODE][areaSize >> 3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][countNonZeroCoeffsY != 0][mode == INTRA_MODE][areaSize >> 3]( &(((EB_S16*) coeff->bufferY)[coeffLumaOriginIndex]), coeff->strideY, &(((EB_S16*) reconCoeff->bufferY)[reconCoeffLumaOriginIndex]), @@ -516,7 +516,7 @@ void UnPack2D( EbObjectWrapper_t *copyFrameBufferWrapperPtr; EbObjectWrapper_t *unpackEndSyncWrapperPtr; EB_ENC_UnPack2D_TYPE_t *unpack; - + for(;;){ EbGetFullObject(context->copyFrameOutputFifoPtr,©FrameBufferWrapperPtr); EB_CHECK_END_OBJ(copyFrameBufferWrapperPtr); @@ -534,7 +534,7 @@ void UnPack2D( unpack->outnStride, unpack->width, unpack->height); - + EbGetEmptyObject(context->unPackInputFifoPtr,&unpackEndSyncWrapperPtr); EbReleaseObject(copyFrameBufferWrapperPtr); EbPostFullObject(unpackEndSyncWrapperPtr); @@ -589,48 +589,48 @@ void CompressedPackLcu( void CompressedPackBlk( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U16 *out16BitBuffer, - EB_U32 outStride, - EB_U32 width, - EB_U32 height - ) + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U16 *out16BitBuffer, + EB_U32 outStride, + EB_U32 width, + EB_U32 height + ) { - CompressedPack_funcPtrArray[((width == 64 || width == 32 || width == 16 || width == 8) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( - in8BitBuffer, - in8Stride, - innBitBuffer, - out16BitBuffer, - innStride, - outStride, - width, - height); + CompressedPack_funcPtrArray[((width == 64 || width == 32 || width == 16 || width == 8) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( + in8BitBuffer, + in8Stride, + innBitBuffer, + out16BitBuffer, + innStride, + outStride, + width, + height); } void Conv2bToCPackLcu( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height) + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height) { - Convert_Unpack_CPack_funcPtrArray[((width == 64 || width == 32) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( - innBitBuffer, - innStride, - inCompnBitBuffer, - outStride, - localCache, - width, - height); + Convert_Unpack_CPack_funcPtrArray[((width == 64 || width == 32) ? (!!(ASM_TYPES & AVX2_MASK)) : EB_ASM_C)]( + innBitBuffer, + innStride, + inCompnBitBuffer, + outStride, + localCache, + width, + height); } @@ -698,6 +698,6 @@ void memset16bitBlock ( void UnusedVariablevoidFunc_PicOper() { (void)NxMSadKernel_funcPtrArray; - (void)NxMSadLoopKernel_funcPtrArray; + (void)NxMSadLoopKernel_funcPtrArray; (void)NxMSadAveragingKernel_funcPtrArray; } diff --git a/Source/Lib/Codec/EbPictureOperators.h b/Source/Lib/Codec/EbPictureOperators.h index 2d8ed0743..0e7dd214c 100644 --- a/Source/Lib/Codec/EbPictureOperators.h +++ b/Source/Lib/Codec/EbPictureOperators.h @@ -75,8 +75,8 @@ EB_ERRORTYPE PictureFullDistortion_R( EB_U64 lumaDistortion[DIST_CALC_TOTAL], EB_U64 cbDistortion[DIST_CALC_TOTAL], EB_U64 crDistortion[DIST_CALC_TOTAL], - EB_U32 *countNonZeroCoeffs, - EB_MODETYPE mode); + EB_U32 *countNonZeroCoeffs, + EB_MODETYPE mode); extern EB_ERRORTYPE PictureFullDistortionLuma( EbPictureBufferDesc_t *coeff, @@ -85,22 +85,22 @@ extern EB_ERRORTYPE PictureFullDistortionLuma( EB_U32 reconCoeffLumaOriginIndex, EB_U32 areaSize, EB_U64 lumaDistortion[DIST_CALC_TOTAL], - EB_U32 countNonZeroCoeffsY, - EB_MODETYPE mode); + EB_U32 countNonZeroCoeffsY, + EB_MODETYPE mode); extern EB_ERRORTYPE PictureFullDistortionChroma( EbPictureBufferDesc_t *coeff, EB_U32 coeffCbOriginIndex, - EB_U32 coeffCrOriginIndex, + EB_U32 coeffCrOriginIndex, EbPictureBufferDesc_t *reconCoeff, EB_U32 reconCoeffCbOriginIndex, - EB_U32 reconCoeffCrOriginIndex, + EB_U32 reconCoeffCrOriginIndex, EB_U32 areaSize, EB_U64 cbDistortion[DIST_CALC_TOTAL], - EB_U64 crDistortion[DIST_CALC_TOTAL], - EB_U32 countNonZeroCoeffsCb, - EB_U32 countNonZeroCoeffsCr, - EB_MODETYPE mode); + EB_U64 crDistortion[DIST_CALC_TOTAL], + EB_U32 countNonZeroCoeffsCb, + EB_U32 countNonZeroCoeffsCr, + EB_MODETYPE mode); extern EB_U64 ComputeNxMSatdSadLCU( EB_U8 *src, // input parameter, source samples Ptr @@ -139,23 +139,23 @@ extern void PictureResidual16bit( EB_U32 areaHeight); void CompressedPackBlk( - EB_U8 *in8BitBuffer, - EB_U32 in8Stride, - EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U16 *out16BitBuffer, - EB_U32 outStride, - EB_U32 width, - EB_U32 height - ); + EB_U8 *in8BitBuffer, + EB_U32 in8Stride, + EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U16 *out16BitBuffer, + EB_U32 outStride, + EB_U32 width, + EB_U32 height + ); void Conv2bToCPackLcu( - const EB_U8 *innBitBuffer, - EB_U32 innStride, - EB_U8 *inCompnBitBuffer, - EB_U32 outStride, - EB_U8 *localCache, - EB_U32 width, - EB_U32 height); + const EB_U8 *innBitBuffer, + EB_U32 innStride, + EB_U8 *inCompnBitBuffer, + EB_U32 outStride, + EB_U8 *localCache, + EB_U32 width, + EB_U32 height); void CompressedPackLcu( EB_U8 *in8BitBuffer, @@ -179,7 +179,7 @@ void Pack2D_SRC( void UnPack2D( UnPackContext_t *context); - + void extract8Bitdata( EB_U16 *in16BitBuffer, EB_U32 inStride, @@ -241,10 +241,10 @@ typedef EB_S32(*EB_SUM_RES)( EB_U32 strideIn ); static EB_SUM_RES FUNC_TABLE SumResidual_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - sumResidual, - // AVX2 - sumResidual8bit_AVX2_INTRIN, + // C_DEFAULT + sumResidual, + // AVX2 + sumResidual8bit_AVX2_INTRIN, }; void memset16bitBlock ( @@ -261,10 +261,10 @@ typedef void(*EB_MEMSET16bitBLK)( EB_S16 value ); static EB_MEMSET16bitBLK FUNC_TABLE memset16bitBlock_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - memset16bitBlock, - // AVX2 - memset16bitBlock_AVX2_INTRIN, + // C_DEFAULT + memset16bitBlock, + // AVX2 + memset16bitBlock_AVX2_INTRIN, }; /*************************************** @@ -340,9 +340,9 @@ typedef EB_U64(*EB_SATD_TYPE)( EB_S16 *diff); typedef EB_U64(*EB_SATD_U8_TYPE)( - EB_U8 *diff, - EB_U64 *dcValue, - EB_U32 srcStride); + EB_U8 *diff, + EB_U64 *dcValue, + EB_U32 srcStride); /*************************************** * Function Tables @@ -362,23 +362,23 @@ static EB_ADDDKERNEL_TYPE FUNC_TABLE AdditionKernel_funcPtrArray[EB_ASM_TYPE_TOT }, // AVX2 { - /*0 4x4 */ PictureAdditionKernel4x4_SSE_INTRIN, - /*1 8x8 */ PictureAdditionKernel8x8_SSE2_INTRIN, - /*2 16x16 */ PictureAdditionKernel16x16_SSE2_INTRIN, + /*0 4x4 */ PictureAdditionKernel4x4_SSE_INTRIN, + /*1 8x8 */ PictureAdditionKernel8x8_SSE2_INTRIN, + /*2 16x16 */ PictureAdditionKernel16x16_SSE2_INTRIN, /*3 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, - /*4 32x32 */ PictureAdditionKernel32x32_SSE2_INTRIN, + /*4 32x32 */ PictureAdditionKernel32x32_SSE2_INTRIN, /*5 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, /*6 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, /*7 */ (EB_ADDDKERNEL_TYPE)PictureAdditionVoidFunc, - /*8 64x64 */ PictureAdditionKernel64x64_SSE2_INTRIN, + /*8 64x64 */ PictureAdditionKernel64x64_SSE2_INTRIN, }, }; static EB_ADDDKERNEL_TYPE_16BIT FUNC_TABLE AdditionKernel_funcPtrArray16bit[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT PictureAdditionKernel16bit, - // AVX2 - PictureAdditionKernel16bit_SSE2_INTRIN, + // AVX2 + PictureAdditionKernel16bit_SSE2_INTRIN, }; static EB_PICCOPY_TYPE FUNC_TABLE PicCopyKernel_funcPtrArray[EB_ASM_TYPE_TOTAL][9] = { @@ -396,15 +396,15 @@ static EB_PICCOPY_TYPE FUNC_TABLE PicCopyKernel_funcPtrArray[EB_ASM_TYPE_TOTAL][ }, // AVX2 { - /*0 4x4 */ PictureCopyKernel4x4_SSE_INTRIN, - /*1 8x8 */ PictureCopyKernel8x8_SSE2_INTRIN, - /*2 16x16 */ PictureCopyKernel16x16_SSE2_INTRIN, + /*0 4x4 */ PictureCopyKernel4x4_SSE_INTRIN, + /*1 8x8 */ PictureCopyKernel8x8_SSE2_INTRIN, + /*2 16x16 */ PictureCopyKernel16x16_SSE2_INTRIN, /*3 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, - /*4 32x32 */ PictureCopyKernel32x32_SSE2_INTRIN, + /*4 32x32 */ PictureCopyKernel32x32_SSE2_INTRIN, /*5 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, /*6 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, /*7 */ (EB_PICCOPY_TYPE)PicCopyVoidFunc, - /*8 64x64 */ PictureCopyKernel64x64_SSE2_INTRIN, + /*8 64x64 */ PictureCopyKernel64x64_SSE2_INTRIN, }, }; @@ -421,35 +421,35 @@ typedef void(*EB_RESDKERNELSUBSAMPLED_TYPE)( EB_U8 lastLine ); static EB_RESDKERNELSUBSAMPLED_TYPE FUNC_TABLE ResidualKernelSubSampled_funcPtrArray[EB_ASM_TYPE_TOTAL][9] = { - // C_DEFAULT - { - /*0 4x4 */ ResidualKernelSubSampled, - /*1 8x8 */ ResidualKernelSubSampled, - /*2 16x16 */ ResidualKernelSubSampled, - /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*4 32x32 */ ResidualKernelSubSampled, - /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*8 64x64 */ ResidualKernelSubSampled - }, - // AVX2 - { - /*0 4x4 */ ResidualKernelSubSampled4x4_SSE_INTRIN, - /*1 8x8 */ ResidualKernelSubSampled8x8_SSE2_INTRIN, - /*2 16x16 */ ResidualKernelSubSampled16x16_SSE2_INTRIN, - /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*4 32x32 */ ResidualKernelSubSampled32x32_SSE2_INTRIN, - /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, - /*8 64x64 */ ResidualKernelSubSampled64x64_SSE2_INTRIN, - }, + // C_DEFAULT + { + /*0 4x4 */ ResidualKernelSubSampled, + /*1 8x8 */ ResidualKernelSubSampled, + /*2 16x16 */ ResidualKernelSubSampled, + /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*4 32x32 */ ResidualKernelSubSampled, + /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*8 64x64 */ ResidualKernelSubSampled + }, + // AVX2 + { + /*0 4x4 */ ResidualKernelSubSampled4x4_SSE_INTRIN, + /*1 8x8 */ ResidualKernelSubSampled8x8_SSE2_INTRIN, + /*2 16x16 */ ResidualKernelSubSampled16x16_SSE2_INTRIN, + /*3 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*4 32x32 */ ResidualKernelSubSampled32x32_SSE2_INTRIN, + /*5 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*6 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*7 */ (EB_RESDKERNELSUBSAMPLED_TYPE)PicResdVoidFunc, + /*8 64x64 */ ResidualKernelSubSampled64x64_SSE2_INTRIN, + }, }; static EB_RESDKERNEL_TYPE FUNC_TABLE ResidualKernel_funcPtrArray[EB_ASM_TYPE_TOTAL][9] = { - // C_DEFAULT - { + // C_DEFAULT + { /*0 4x4 */ ResidualKernel, /*1 8x8 */ ResidualKernel, /*2 16x16 */ ResidualKernel, @@ -459,19 +459,19 @@ static EB_RESDKERNEL_TYPE FUNC_TABLE ResidualKernel_funcPtrArray[EB_ASM_TYPE_TOT /*6 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, /*7 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, /*8 64x64 */ ResidualKernel - }, - // AVX2 - { - /*0 4x4 */ ResidualKernel4x4_SSE_INTRIN, - /*1 8x8 */ ResidualKernel8x8_SSE2_INTRIN, - /*2 16x16 */ ResidualKernel16x16_SSE2_INTRIN, - /*3 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*4 32x32 */ ResidualKernel32x32_SSE2_INTRIN, - /*5 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*6 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*7 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, - /*8 64x64 */ ResidualKernel64x64_SSE2_INTRIN, - }, + }, + // AVX2 + { + /*0 4x4 */ ResidualKernel4x4_SSE_INTRIN, + /*1 8x8 */ ResidualKernel8x8_SSE2_INTRIN, + /*2 16x16 */ ResidualKernel16x16_SSE2_INTRIN, + /*3 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*4 32x32 */ ResidualKernel32x32_SSE2_INTRIN, + /*5 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*6 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*7 */ (EB_RESDKERNEL_TYPE)PicResdVoidFunc, + /*8 64x64 */ ResidualKernel64x64_SSE2_INTRIN, + }, }; @@ -617,10 +617,10 @@ static EB_SATD_TYPE FUNC_TABLE Compute8x8Satd_funcPtrArray[EB_ASM_TYPE_TOTAL] = }; static EB_SATD_U8_TYPE FUNC_TABLE Compute8x8Satd_U8_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT + // C_DEFAULT Compute8x8Satd_U8, - // ASM_AVX2 - Compute8x8Satd_U8_SSE4 + // ASM_AVX2 + Compute8x8Satd_U8_SSE4 }; typedef EB_U64(*EB_SPATIALFULLDIST_TYPE)( diff --git a/Source/Lib/Codec/EbPredictionStructure.c b/Source/Lib/Codec/EbPredictionStructure.c index ba44ba03d..aa678e51c 100644 --- a/Source/Lib/Codec/EbPredictionStructure.c +++ b/Source/Lib/Codec/EbPredictionStructure.c @@ -74,8 +74,8 @@ static PredictionStructureConfigEntry_t flatPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 1, // GOP Index 0 - Ref List 0 - 1 // GOP Index 0 - Ref List 1 + 1, // GOP Index 0 - Ref List 0 + 1 // GOP Index 0 - Ref List 1 } }; @@ -97,15 +97,15 @@ static PredictionStructureConfigEntry_t twoLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 2, // GOP Index 0 - Ref List 0 - 2 // GOP Index 0 - Ref List 1 + 2, // GOP Index 0 - Ref List 0 + 2 // GOP Index 0 - Ref List 1 }, { 1, // GOP Index 1 - Temporal Layer 1, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 } }; @@ -131,29 +131,29 @@ static PredictionStructureConfigEntry_t threeLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 4, // GOP Index 0 - Ref List 0 - 4 // GOP Index 0 - Ref List 1 + 4, // GOP Index 0 - Ref List 0 + 4 // GOP Index 0 - Ref List 1 }, { 2, // GOP Index 1 - Temporal Layer 2, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 1, // GOP Index 2 - Temporal Layer 1, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 2, // GOP Index 3 - Temporal Layer 3, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 } }; @@ -192,50 +192,50 @@ static PredictionStructureConfigEntry_t fourLevelHierarchicalPredStruct[] = { { 3, // GOP Index 1 - Temporal Layer 3, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 2, // GOP Index 2 - Temporal Layer 2, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 3, // GOP Index 3 - Temporal Layer 4, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 }, { 1, // GOP Index 4 - Temporal Layer 1, // GOP Index 4 - Decode Order - 4, // GOP Index 4 - Ref List 0 - -4 // GOP Index 4 - Ref List 1 + 4, // GOP Index 4 - Ref List 0 + -4 // GOP Index 4 - Ref List 1 }, { 3, // GOP Index 5 - Temporal Layer 6, // GOP Index 5 - Decode Order - 1, // GOP Index 5 - Ref List 0 - -1 // GOP Index 5 - Ref List 1 + 1, // GOP Index 5 - Ref List 0 + -1 // GOP Index 5 - Ref List 1 }, { 2, // GOP Index 6 - Temporal Layer 5, // GOP Index 6 - Decode Order - 2, // GOP Index 6 - Ref List 0 - -2 // GOP Index 6 - Ref List 1 + 2, // GOP Index 6 - Ref List 0 + -2 // GOP Index 6 - Ref List 1 }, { 3, // GOP Index 7 - Temporal Layer 7, // GOP Index 7 - Decode Order - 1, // GOP Index 7 - Ref List 0 - -1 // GOP Index 7 - Ref List 1 + 1, // GOP Index 7 - Ref List 0 + -1 // GOP Index 7 - Ref List 1 } }; @@ -268,113 +268,113 @@ static PredictionStructureConfigEntry_t fiveLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 16, // GOP Index 0 - Ref List 0 - 16 // GOP Index 0 - Ref List 1 + 16, // GOP Index 0 - Ref List 0 + 16 // GOP Index 0 - Ref List 1 }, { 4, // GOP Index 1 - Temporal Layer 4, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 3, // GOP Index 2 - Temporal Layer 3, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 4, // GOP Index 3 - Temporal Layer 5, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 }, { 2, // GOP Index 4 - Temporal Layer 2, // GOP Index 4 - Decode Order - 4, // GOP Index 4 - Ref List 0 - -4 // GOP Index 4 - Ref List 1 + 4, // GOP Index 4 - Ref List 0 + -4 // GOP Index 4 - Ref List 1 }, { 4, // GOP Index 5 - Temporal Layer 7, // GOP Index 5 - Decode Order - 1, // GOP Index 5 - Ref List 0 - -1 // GOP Index 5 - Ref List 1 + 1, // GOP Index 5 - Ref List 0 + -1 // GOP Index 5 - Ref List 1 }, { 3, // GOP Index 6 - Temporal Layer 6, // GOP Index 6 - Decode Order - 2, // GOP Index 6 - Ref List 0 - -2 // GOP Index 6 - Ref List 1 + 2, // GOP Index 6 - Ref List 0 + -2 // GOP Index 6 - Ref List 1 }, { 4, // GOP Index 7 - Temporal Layer 8, // GOP Index 7 - Decode Order - 1, // GOP Index 7 - Ref List 0 - -1 // GOP Index 7 - Ref List 1 + 1, // GOP Index 7 - Ref List 0 + -1 // GOP Index 7 - Ref List 1 }, { 1, // GOP Index 8 - Temporal Layer 1, // GOP Index 8 - Decode Order - 8, // GOP Index 8 - Ref List 0 - -8 // GOP Index 8 - Ref List 1 + 8, // GOP Index 8 - Ref List 0 + -8 // GOP Index 8 - Ref List 1 }, { 4, // GOP Index 9 - Temporal Layer 11, // GOP Index 9 - Decode Order - 1, // GOP Index 9 - Ref List 0 - -1 // GOP Index 9 - Ref List 1 + 1, // GOP Index 9 - Ref List 0 + -1 // GOP Index 9 - Ref List 1 }, { 3, // GOP Index 10 - Temporal Layer 10, // GOP Index 10 - Decode Order - 2, // GOP Index 10 - Ref List 0 - -2 // GOP Index 10 - Ref List 1 + 2, // GOP Index 10 - Ref List 0 + -2 // GOP Index 10 - Ref List 1 }, { 4, // GOP Index 11 - Temporal Layer 12, // GOP Index 11 - Decode Order - 1, // GOP Index 11 - Ref List 0 - -1 // GOP Index 11 - Ref List 1 + 1, // GOP Index 11 - Ref List 0 + -1 // GOP Index 11 - Ref List 1 }, { 2, // GOP Index 12 - Temporal Layer 9, // GOP Index 12 - Decode Order - 4, // GOP Index 12 - Ref List 0 - -4 // GOP Index 12 - Ref List 1 + 4, // GOP Index 12 - Ref List 0 + -4 // GOP Index 12 - Ref List 1 }, { 4, // GOP Index 13 - Temporal Layer 14, // GOP Index 13 - Decode Order - 1, // GOP Index 13 - Ref List 0 - -1 // GOP Index 13 - Ref List 1 + 1, // GOP Index 13 - Ref List 0 + -1 // GOP Index 13 - Ref List 1 }, { 3, // GOP Index 14 - Temporal Layer 13, // GOP Index 14 - Decode Order - 2, // GOP Index 14 - Ref List 0 - -2 // GOP Index 14 - Ref List 1 + 2, // GOP Index 14 - Ref List 0 + -2 // GOP Index 14 - Ref List 1 }, { 4, // GOP Index 15 - Temporal Layer 15, // GOP Index 15 - Decode Order - 1, // GOP Index 15 - Ref List 0 - -1 // GOP Index 15 - Ref List 1 + 1, // GOP Index 15 - Ref List 0 + -1 // GOP Index 15 - Ref List 1 } }; @@ -410,225 +410,225 @@ static PredictionStructureConfigEntry_t sixLevelHierarchicalPredStruct[] = { { 0, // GOP Index 0 - Temporal Layer 0, // GOP Index 0 - Decode Order - 32, // GOP Index 0 - Ref List 0 - 32 // GOP Index 0 - Ref List 1 + 32, // GOP Index 0 - Ref List 0 + 32 // GOP Index 0 - Ref List 1 }, { 5, // GOP Index 1 - Temporal Layer 5, // GOP Index 1 - Decode Order - 1, // GOP Index 1 - Ref List 0 - -1 // GOP Index 1 - Ref List 1 + 1, // GOP Index 1 - Ref List 0 + -1 // GOP Index 1 - Ref List 1 }, { 4, // GOP Index 2 - Temporal Layer 4, // GOP Index 2 - Decode Order - 2, // GOP Index 2 - Ref List 0 - -2 // GOP Index 2 - Ref List 1 + 2, // GOP Index 2 - Ref List 0 + -2 // GOP Index 2 - Ref List 1 }, { 5, // GOP Index 3 - Temporal Layer 6, // GOP Index 3 - Decode Order - 1, // GOP Index 3 - Ref List 0 - -1 // GOP Index 3 - Ref List 1 + 1, // GOP Index 3 - Ref List 0 + -1 // GOP Index 3 - Ref List 1 }, { 3, // GOP Index 4 - Temporal Layer 3, // GOP Index 4 - Decode Order - 4, // GOP Index 4 - Ref List 0 - -4 // GOP Index 4 - Ref List 1 + 4, // GOP Index 4 - Ref List 0 + -4 // GOP Index 4 - Ref List 1 }, { 5, // GOP Index 5 - Temporal Layer 8, // GOP Index 5 - Decode Order - 1, // GOP Index 5 - Ref List 0 - -1 // GOP Index 5 - Ref List 1 + 1, // GOP Index 5 - Ref List 0 + -1 // GOP Index 5 - Ref List 1 }, { 4, // GOP Index 6 - Temporal Layer 7, // GOP Index 6 - Decode Order - 2, // GOP Index 6 - Ref List 0 - -2 // GOP Index 6 - Ref List 1 + 2, // GOP Index 6 - Ref List 0 + -2 // GOP Index 6 - Ref List 1 }, { 5, // GOP Index 7 - Temporal Layer 9, // GOP Index 7 - Decode Order - 1, // GOP Index 7 - Ref List 0 - -1 // GOP Index 7 - Ref List 1 + 1, // GOP Index 7 - Ref List 0 + -1 // GOP Index 7 - Ref List 1 }, { 2, // GOP Index 8 - Temporal Layer 2, // GOP Index 8 - Decode Order - 8, // GOP Index 8 - Ref List 0 - -8 // GOP Index 8 - Ref List 1 + 8, // GOP Index 8 - Ref List 0 + -8 // GOP Index 8 - Ref List 1 }, { 5, // GOP Index 9 - Temporal Layer 12, // GOP Index 9 - Decode Order - 1, // GOP Index 9 - Ref List 0 - -1 // GOP Index 9 - Ref List 1 + 1, // GOP Index 9 - Ref List 0 + -1 // GOP Index 9 - Ref List 1 }, { 4, // GOP Index 10 - Temporal Layer 11, // GOP Index 10 - Decode Order - 2, // GOP Index 10 - Ref List 0 - -2 // GOP Index 10 - Ref List 1 + 2, // GOP Index 10 - Ref List 0 + -2 // GOP Index 10 - Ref List 1 }, { 5, // GOP Index 11 - Temporal Layer 13, // GOP Index 11 - Decode Order - 1, // GOP Index 11 - Ref List 0 - -1 // GOP Index 11 - Ref List 1 + 1, // GOP Index 11 - Ref List 0 + -1 // GOP Index 11 - Ref List 1 }, { 3, // GOP Index 12 - Temporal Layer 10, // GOP Index 12 - Decode Order - 4, // GOP Index 12 - Ref List 0 - -4 // GOP Index 12 - Ref List 1 + 4, // GOP Index 12 - Ref List 0 + -4 // GOP Index 12 - Ref List 1 }, { 5, // GOP Index 13 - Temporal Layer 15, // GOP Index 13 - Decode Order - 1, // GOP Index 13 - Ref List 0 - -1 // GOP Index 13 - Ref List 1 + 1, // GOP Index 13 - Ref List 0 + -1 // GOP Index 13 - Ref List 1 }, { 4, // GOP Index 14 - Temporal Layer 14, // GOP Index 14 - Decode Order - 2, // GOP Index 14 - Ref List 0 - -2 // GOP Index 14 - Ref List 1 + 2, // GOP Index 14 - Ref List 0 + -2 // GOP Index 14 - Ref List 1 }, { 5, // GOP Index 15 - Temporal Layer 16, // GOP Index 15 - Decode Order - 1, // GOP Index 15 - Ref List 0 - -1 // GOP Index 15 - Ref List 1 + 1, // GOP Index 15 - Ref List 0 + -1 // GOP Index 15 - Ref List 1 }, { 1, // GOP Index 16 - Temporal Layer 1, // GOP Index 16 - Decode Order - 16, // GOP Index 16 - Ref List 0 - -16 // GOP Index 16 - Ref List 1 + 16, // GOP Index 16 - Ref List 0 + -16 // GOP Index 16 - Ref List 1 }, { 5, // GOP Index 17 - Temporal Layer 20, // GOP Index 17 - Decode Order - 1, // GOP Index 17 - Ref List 0 - -1 // GOP Index 17 - Ref List 1 + 1, // GOP Index 17 - Ref List 0 + -1 // GOP Index 17 - Ref List 1 }, { 4, // GOP Index 18 - Temporal Layer 19, // GOP Index 18 - Decode Order - 2, // GOP Index 18 - Ref List 0 - -2 // GOP Index 18 - Ref List 1 + 2, // GOP Index 18 - Ref List 0 + -2 // GOP Index 18 - Ref List 1 }, { 5, // GOP Index 19 - Temporal Layer 21, // GOP Index 19 - Decode Order - 1, // GOP Index 19 - Ref List 0 - -1 // GOP Index 19 - Ref List 1 + 1, // GOP Index 19 - Ref List 0 + -1 // GOP Index 19 - Ref List 1 }, { 3, // GOP Index 20 - Temporal Layer 18, // GOP Index 20 - Decode Order - 4, // GOP Index 20 - Ref List 0 - -4 // GOP Index 20 - Ref List 1 + 4, // GOP Index 20 - Ref List 0 + -4 // GOP Index 20 - Ref List 1 }, { 5, // GOP Index 21 - Temporal Layer 23, // GOP Index 21 - Decode Order - 1, // GOP Index 21 - Ref List 0 - -1 // GOP Index 21 - Ref List 1 + 1, // GOP Index 21 - Ref List 0 + -1 // GOP Index 21 - Ref List 1 }, { 4, // GOP Index 22 - Temporal Layer 22, // GOP Index 22 - Decode Order - 2, // GOP Index 22 - Ref List 0 - -2 // GOP Index 22 - Ref List 1 + 2, // GOP Index 22 - Ref List 0 + -2 // GOP Index 22 - Ref List 1 }, { 5, // GOP Index 23 - Temporal Layer 24, // GOP Index 23 - Decode Order - 1, // GOP Index 23 - Ref List 0 - -1 // GOP Index 23 - Ref List 1 + 1, // GOP Index 23 - Ref List 0 + -1 // GOP Index 23 - Ref List 1 }, { 2, // GOP Index 24 - Temporal Layer 17, // GOP Index 24 - Decode Order - 8, // GOP Index 24 - Ref List 0 - -8 // GOP Index 24 - Ref List 1 + 8, // GOP Index 24 - Ref List 0 + -8 // GOP Index 24 - Ref List 1 }, { 5, // GOP Index 25 - Temporal Layer 27, // GOP Index 25 - Decode Order - 1, // GOP Index 25 - Ref List 0 - -1 // GOP Index 25 - Ref List 1 + 1, // GOP Index 25 - Ref List 0 + -1 // GOP Index 25 - Ref List 1 }, { 4, // GOP Index 26 - Temporal Layer 26, // GOP Index 26 - Decode Order - 2, // GOP Index 26 - Ref List 0 - -2 // GOP Index 26 - Ref List 1 + 2, // GOP Index 26 - Ref List 0 + -2 // GOP Index 26 - Ref List 1 }, { 5, // GOP Index 27 - Temporal Layer 28, // GOP Index 27 - Decode Order - 1, // GOP Index 27 - Ref List 0 - -1 // GOP Index 27 - Ref List 1 + 1, // GOP Index 27 - Ref List 0 + -1 // GOP Index 27 - Ref List 1 }, { 3, // GOP Index 28 - Temporal Layer 25, // GOP Index 28 - Decode Order - 4, // GOP Index 28 - Ref List 0 - -4 // GOP Index 28 - Ref List 1 + 4, // GOP Index 28 - Ref List 0 + -4 // GOP Index 28 - Ref List 1 }, { 5, // GOP Index 29 - Temporal Layer 30, // GOP Index 29 - Decode Order - 1, // GOP Index 29 - Ref List 0 - -1 // GOP Index 29 - Ref List 1 + 1, // GOP Index 29 - Ref List 0 + -1 // GOP Index 29 - Ref List 1 }, { 4, // GOP Index 30 - Temporal Layer 29, // GOP Index 30 - Decode Order - 2, // GOP Index 30 - Ref List 0 - -2 // GOP Index 30 - Ref List 1 + 2, // GOP Index 30 - Ref List 0 + -2 // GOP Index 30 - Ref List 1 }, { 5, // GOP Index 31 - Temporal Layer 31, // GOP Index 31 - Decode Order - 1, // GOP Index 31 - Ref List 0 - -1 // GOP Index 31 - Ref List 1 + 1, // GOP Index 31 - Ref List 0 + -1 // GOP Index 31 - Ref List 1 } }; @@ -1018,7 +1018,7 @@ static EB_ERRORTYPE PredictionStructureCtor( predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceListCount = refIndex; // Allocate the Leading Picture Reference List 0{ - predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceList = 0; + predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceList = 0; // Copy Reference List 0 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList0.referenceListCount; ++refIndex) { @@ -1045,7 +1045,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1071,7 +1071,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1145,7 +1145,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1167,7 +1167,7 @@ static EB_ERRORTYPE PredictionStructureCtor( // Allocate the Leading Picture Reference List 1 predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceList = 0; - + // Copy Reference List 1 for(refIndex = 0; refIndex < predictionStructurePtr->predStructEntryPtrArray[entryIndex]->refList1.referenceListCount; ++refIndex) { @@ -1781,10 +1781,10 @@ EB_ERRORTYPE PredictionStructureGroupCtor( // Count the number of Prediction Structures while((PredictionStructureConfigArray[predStructIndex].entryArray != 0) && (PredictionStructureConfigArray[predStructIndex].entryCount != 0)) { // Get Random Access + P for temporal ID 0 - if(PredictionStructureConfigArray[predStructIndex].entryArray->temporalLayerIndex == 0 && baseLayerSwitchMode) { + if(PredictionStructureConfigArray[predStructIndex].entryArray->temporalLayerIndex == 0 && baseLayerSwitchMode) { PredictionStructureConfigArray[predStructIndex].entryArray->refList1 = 0; } - ++predStructIndex; + ++predStructIndex; } predictionStructureGroupPtr->predictionStructureCount = MAX_TEMPORAL_LAYERS * EB_PRED_TOTAL_COUNT; diff --git a/Source/Lib/Codec/EbPredictionStructure.h b/Source/Lib/Codec/EbPredictionStructure.h index 74d048fc0..7b27afc5b 100644 --- a/Source/Lib/Codec/EbPredictionStructure.h +++ b/Source/Lib/Codec/EbPredictionStructure.h @@ -31,13 +31,13 @@ extern "C" { /************************************************ * Reference List * - * referenceList - Contains the deltaPOCs of + * referenceList - Contains the deltaPOCs of * the pictures referenced by the current * picture. ************************************************/ typedef struct ReferenceList_s { - EB_S32 referenceList; + EB_S32 referenceList; EB_U32 referenceListCount; } ReferenceList_t; @@ -47,25 +47,25 @@ typedef struct ReferenceList_s * * listCount - Contains count of how * deep into list should be used - * depending on how many references are + * depending on how many references are * being used in the prediction structure. * * list - Contains the deltaPOCs of * pictures that reference the current picture. * The dependent list pictures must be grouped - * by the referenceCount group in ascending + * by the referenceCount group in ascending * order. The grouping is not display order! ************************************************/ typedef struct DependentList_s { EB_S32 *list; EB_U32 listCount; - + } DependentList_t; /************************************************ * Prediction Structure Config Entry - * Contains the basic reference lists and + * Contains the basic reference lists and * configurations for each Prediction Structure * Config Entry. ************************************************/ @@ -87,7 +87,7 @@ typedef struct PredictionStructureConfig_s { } PredictionStructureConfig_t; /************************************************ - * Prediction Structure Entry + * Prediction Structure Entry * Contains the reference and dependent lists * for a particular picture in the Prediction * Structure. @@ -135,11 +135,11 @@ typedef struct PredictionStructureEntry_s { EB_S32 refPicsList0TotalCountMinus1; EB_S32 refPicsList1TotalCountMinus1; EB_BOOL listsModificationPresentFlag; - EB_BOOL restrictedRefPicListsFlag; // Same list enable flag (if set, - // it implies all slices of the - // same type in the same picture + EB_BOOL restrictedRefPicListsFlag; // Same list enable flag (if set, + // it implies all slices of the + // same type in the same picture // have identical lists) - + // List Modification // *Note - This should probably be moved to the slice header since its a dynamic control - JMJ Jan 2, 2013 EB_BOOL list0ModificationFlag; @@ -148,7 +148,7 @@ typedef struct PredictionStructureEntry_s { EB_U32 list1ModIndex[MAX_NUM_OF_REF_PICS_TOTAL]; // Lists Combination (STUB) - + } PredictionStructureEntry_t; /************************************************ @@ -169,7 +169,7 @@ typedef struct PredictionStructure_s { EB_U32 leadingPicIndex; EB_U32 initPicIndex; EB_U32 steadyStateIndex; - + // RPS Related Entries EB_BOOL restrictedRefPicListsEnableFlag; EB_BOOL listsModificationEnableFlag; @@ -181,8 +181,8 @@ typedef struct PredictionStructure_s { /************************************************ * Prediction Structure Group - * Contains the control structures for all - * supported prediction structures. + * Contains the control structures for all + * supported prediction structures. ************************************************/ typedef struct PredictionStructureGroup_s { PredictionStructure_t **predictionStructurePtrArray; @@ -200,7 +200,7 @@ extern PredictionStructure_t* GetPredictionStructure( PredictionStructureGroup_t *predictionStructureGroupPtr, EB_PRED predStructure, EB_U32 numberOfReferences, - EB_U32 levelsOfHierarchy); + EB_U32 levelsOfHierarchy); #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbPredictionUnit.h b/Source/Lib/Codec/EbPredictionUnit.h index c424c9b66..0e3db6c63 100644 --- a/Source/Lib/Codec/EbPredictionUnit.h +++ b/Source/Lib/Codec/EbPredictionUnit.h @@ -13,17 +13,17 @@ extern "C" { #endif #pragma pack(push, 1) -typedef struct PredictionUnit_s +typedef struct PredictionUnit_s { - Mv_t mv [MAX_NUM_OF_REF_PIC_LIST]; // 16-bytes + Mv_t mv [MAX_NUM_OF_REF_PIC_LIST]; // 16-bytes Mvd_t mvd[MAX_NUM_OF_REF_PIC_LIST]; // 16-bytes unsigned mergeIndex : 5; - unsigned mergeFlag : 1; - + unsigned mergeFlag : 1; + unsigned interPredDirectionIndex : 2; - unsigned intraLumaMode : 6; - unsigned intraLumaLeftMode : 6; - unsigned intraLumaTopMode : 6; + unsigned intraLumaMode : 6; + unsigned intraLumaLeftMode : 6; + unsigned intraLumaTopMode : 6; } PredictionUnit_t; #pragma pack(pop) diff --git a/Source/Lib/Codec/EbProductCodingLoop.c b/Source/Lib/Codec/EbProductCodingLoop.c index 4108f4e81..82fac6fec 100644 --- a/Source/Lib/Codec/EbProductCodingLoop.c +++ b/Source/Lib/Codec/EbProductCodingLoop.c @@ -27,180 +27,180 @@ EB_U8 MDSCAN_TO_QUADTREE_ID[] = { - 1, - 1, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, - 2, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, - 3, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, - 4, - 1, - 1, - 2, - 3, - 4, - 2, - 1, - 2, - 3, - 4, - 3, - 1, - 2, - 3, - 4, - 4, - 1, - 2, - 3, - 4, + 1, + 1, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, + 2, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, + 3, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, + 4, + 1, + 1, + 2, + 3, + 4, + 2, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 3, + 4, + 4, + 1, + 2, + 3, + 4, }; EB_U8 CHILD_MDSCAN_TO_PARENT_MDSCAN[] = { - 0, - 0, - 1, - 2, - 2, - 2, - 2, - 1, - 7, - 7, - 7, - 7, - 1, - 12, - 12, - 12, - 12, - 1, - 17, - 17, - 17, - 17, - 0, - 22, - 23, - 23, - 23, - 23, - 22, - 28, - 28, - 28, - 28, - 22, - 33, - 33, - 33, - 33, - 22, - 38, - 38, - 38, - 38, - 0, - 43, - 44, - 44, - 44, - 44, - 43, - 49, - 49, - 49, - 49, - 43, - 54, - 54, - 54, - 54, - 43, - 59, - 59, - 59, - 59, - 0, - 64, - 65, - 65, - 65, - 65, - 64, - 70, - 70, - 70, - 70, - 64, - 75, - 75, - 75, - 75, - 64, - 80, - 80, - 80, - 80, + 0, + 0, + 1, + 2, + 2, + 2, + 2, + 1, + 7, + 7, + 7, + 7, + 1, + 12, + 12, + 12, + 12, + 1, + 17, + 17, + 17, + 17, + 0, + 22, + 23, + 23, + 23, + 23, + 22, + 28, + 28, + 28, + 28, + 22, + 33, + 33, + 33, + 33, + 22, + 38, + 38, + 38, + 38, + 0, + 43, + 44, + 44, + 44, + 44, + 43, + 49, + 49, + 49, + 49, + 43, + 54, + 54, + 54, + 54, + 43, + 59, + 59, + 59, + 59, + 0, + 64, + 65, + 65, + 65, + 65, + 64, + 70, + 70, + 70, + 70, + 64, + 75, + 75, + 75, + 75, + 64, + 80, + 80, + 80, + 80, }; @@ -210,9 +210,9 @@ static const EB_U8 CuOffset[4] = { 85, 21, 5, 1 }; const EB_FULL_COST_FUNC fullCostFuncTable[3][3] = { - /* */{ NULL, NULL, NULL }, - /*INTER */{ InterFullCost, InterFullCost, NULL }, - /*INTRA */{ IntraFullCostPslice, IntraFullCostPslice, IntraFullCostIslice }, + /* */{ NULL, NULL, NULL }, + /*INTER */{ InterFullCost, InterFullCost, NULL }, + /*INTRA */{ IntraFullCostPslice, IntraFullCostPslice, IntraFullCostIslice }, }; const EB_PREDICTION_FUNC PredictionFunTableOl[2][3] = { @@ -228,15 +228,15 @@ const EB_PREDICTION_FUNC PredictionFunTableCl[2][3] = { const EB_FAST_COST_FUNC ProductFastCostFuncOptTable[3][3] = { - /* */{ NULL, NULL, NULL }, - /*INTER */{ InterFastCostBsliceOpt, InterFastCostPsliceOpt, NULL }, - /*INTRA */{ Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostIsliceOpt }, + /* */{ NULL, NULL, NULL }, + /*INTER */{ InterFastCostBsliceOpt, InterFastCostPsliceOpt, NULL }, + /*INTRA */{ Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostPsliceOpt, Intra2Nx2NFastCostIsliceOpt }, }; const EB_FULL_LUMA_COST_FUNC ProductFullLumaCostFuncTable[3][3] = { - /* */{ NULL, NULL, NULL }, - /*INTER */{ InterFullLumaCost, InterFullLumaCost, NULL }, - /*INTRA */{ IntraFullLumaCostPslice, IntraFullLumaCostPslice, IntraFullLumaCostIslice }, + /* */{ NULL, NULL, NULL }, + /*INTER */{ InterFullLumaCost, InterFullLumaCost, NULL }, + /*INTRA */{ IntraFullLumaCostPslice, IntraFullLumaCostPslice, IntraFullLumaCostIslice }, }; const EB_INTRA_4x4_FAST_LUMA_COST_FUNC Intra4x4FastCostFuncTable[3] = @@ -255,27 +255,27 @@ const EB_INTRA_4x4_FULL_LUMA_COST_FUNC Intra4x4FullCostFuncTable[3] = const EB_INTRA_NxN_FAST_COST_FUNC IntraNxNFastCostFuncTable[3] = { - IntraNxNFastCostPslice, - IntraNxNFastCostPslice, - IntraNxNFastCostIslice + IntraNxNFastCostPslice, + IntraNxNFastCostPslice, + IntraNxNFastCostIslice }; const EB_INTRA_NxN_FULL_COST_FUNC IntraNxNFullCostFuncTable[3] = { - IntraNxNFullCostPslice, - IntraNxNFullCostPslice, - IntraNxNFullCostIslice + IntraNxNFullCostPslice, + IntraNxNFullCostPslice, + IntraNxNFullCostIslice }; extern void GenerateIntraLumaReferenceSamplesMd( - ModeDecisionContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr) { + ModeDecisionContext_t *contextPtr, + EbPictureBufferDesc_t *inputPicturePtr) { EB_BOOL pictureLeftBoundary = (contextPtr->lcuPtr->lcuEdgeInfoPtr->tileLeftEdgeFlag == EB_TRUE && ((contextPtr->cuOriginX & (contextPtr->lcuPtr->size - 1)) == 0)) ? EB_TRUE : EB_FALSE; EB_BOOL pictureTopBoundary = (contextPtr->lcuPtr->lcuEdgeInfoPtr->tileTopEdgeFlag == EB_TRUE && ((contextPtr->cuOriginY & (contextPtr->lcuPtr->size - 1)) == 0)) ? EB_TRUE : EB_FALSE; EB_BOOL pictureRightBoundary = (contextPtr->lcuPtr->lcuEdgeInfoPtr->tileRightEdgeFlag == EB_TRUE && (((contextPtr->cuOriginX + contextPtr->cuStats->size) & (contextPtr->lcuPtr->size - 1)) == 0)) ? EB_TRUE : EB_FALSE; - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) { + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) { GenerateLumaIntraReferenceSamplesEncodePass( EB_FALSE, @@ -294,110 +294,110 @@ extern void GenerateIntraLumaReferenceSamplesMd( pictureTopBoundary, pictureRightBoundary); - contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; + contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; - } - else{ - //TODO: Change this function to take care of neighbour validity. - // then create a generic function that takes recon or input frame as generic input for both open and close loop case. - UpdateNeighborSamplesArrayOL( - contextPtr->intraRefPtr, - inputPicturePtr, - inputPicturePtr->strideY, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuStats->size, - contextPtr->lcuPtr); + } + else{ + //TODO: Change this function to take care of neighbour validity. + // then create a generic function that takes recon or input frame as generic input for both open and close loop case. + UpdateNeighborSamplesArrayOL( + contextPtr->intraRefPtr, + inputPicturePtr, + inputPicturePtr->strideY, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuStats->size, + contextPtr->lcuPtr); - contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; + contextPtr->lumaIntraRefSamplesGenDone = EB_TRUE; - } + } } void ApplyMvOverBoundariesBias( - SequenceControlSet_t *sequenceControlSetPtr, - ModeDecisionContext_t *contextPtr, - EB_U32 cuSize, - ModeDecisionCandidateBuffer_t *candidateBuffer - ) { - - if (candidateBuffer->candidatePtr->type == INTER_MODE) { - - if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_0) { - if ( - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) - - ){ - *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; - - - } - } - else if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_1) { - if ( - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) - ){ - //*candidateBuffer->fastCostPtr += (*candidateBuffer->fastCostPtr * 100) / 100; - *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; - - } - } - else { - if ( - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || - ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || - ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) - ){ - *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; - } - } - } + SequenceControlSet_t *sequenceControlSetPtr, + ModeDecisionContext_t *contextPtr, + EB_U32 cuSize, + ModeDecisionCandidateBuffer_t *candidateBuffer + ) { + + if (candidateBuffer->candidatePtr->type == INTER_MODE) { + + if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_0) { + if ( + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) + + ){ + *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; + + + } + } + else if (candidateBuffer->candidatePtr->predictionDirection[0] == UNI_PRED_LIST_1) { + if ( + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) + ){ + //*candidateBuffer->fastCostPtr += (*candidateBuffer->fastCostPtr * 100) / 100; + *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; + + } + } + else { + if ( + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX + cuSize)) > sequenceControlSetPtr->lumaWidth) || + ((unsigned)ABS((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY + cuSize)) > sequenceControlSetPtr->lumaHeight) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L0 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L0 >> 2) + contextPtr->cuOriginY) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_x_L1 >> 2) + contextPtr->cuOriginX) < 0) || + ((signed int)((signed int)(candidateBuffer->candidatePtr->motionVector_y_L1 >> 2) + contextPtr->cuOriginY) < 0) + ){ + *candidateBuffer->fastCostPtr = 0xFFFFFFFFFFFFFF; + } + } + } }; /*************************************************** * Update Recon Samples Neighbor Arrays ***************************************************/ void ModeDecisionUpdateNeighborArrays( - NeighborArrayUnit_t *leafDepthNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - NeighborArrayUnit_t *skipNeighborArray, - NeighborArrayUnit_t *lumaReconSampleNeighborArray, - NeighborArrayUnit_t *cbReconSampleNeighborArray, - NeighborArrayUnit_t *crReconSampleNeighborArray, - EbPictureBufferDesc_t *reconBuffer, - EB_U32 lcuSize, - EB_BOOL intraMdOpenLoop, + NeighborArrayUnit_t *leafDepthNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + NeighborArrayUnit_t *skipNeighborArray, + NeighborArrayUnit_t *lumaReconSampleNeighborArray, + NeighborArrayUnit_t *cbReconSampleNeighborArray, + NeighborArrayUnit_t *crReconSampleNeighborArray, + EbPictureBufferDesc_t *reconBuffer, + EB_U32 lcuSize, + EB_BOOL intraMdOpenLoop, EB_BOOL intra4x4Selected, - EB_U8 *depth, - EB_U8 *modeType, - EB_U8 *lumaMode, - MvUnit_t *mvUnit, - EB_U8 *skipFlag, - EB_U32 originX, - EB_U32 originY, - EB_U32 size, - EB_BOOL useIntraChromaflag) + EB_U8 *depth, + EB_U8 *modeType, + EB_U8 *lumaMode, + MvUnit_t *mvUnit, + EB_U8 *skipFlag, + EB_U32 originX, + EB_U32 originY, + EB_U32 size, + EB_BOOL useIntraChromaflag) { - NeighborArrayUnitDepthSkipWrite( - leafDepthNeighborArray, - (EB_U8*)depth, - originX, - originY, - size); + NeighborArrayUnitDepthSkipWrite( + leafDepthNeighborArray, + (EB_U8*)depth, + originX, + originY, + size); if (intra4x4Selected == EB_FALSE){ NeighborArrayUnitModeTypeWrite( @@ -415,20 +415,20 @@ void ModeDecisionUpdateNeighborArrays( size); } - // *Note - this has to be changed for non-square PU support -- JMJ - NeighborArrayUnitMvWrite( - mvNeighborArray, - (EB_U8*)mvUnit, - originX, - originY, - size); - - NeighborArrayUnitDepthSkipWrite( - skipNeighborArray, - (EB_U8*)skipFlag, - originX, - originY, - size); + // *Note - this has to be changed for non-square PU support -- JMJ + NeighborArrayUnitMvWrite( + mvNeighborArray, + (EB_U8*)mvUnit, + originX, + originY, + size); + + NeighborArrayUnitDepthSkipWrite( + skipNeighborArray, + (EB_U8*)skipFlag, + originX, + originY, + size); if (intraMdOpenLoop == EB_FALSE && intra4x4Selected == EB_FALSE) { // Recon Samples - Luma @@ -474,41 +474,41 @@ void ModeDecisionUpdateNeighborArrays( } - return; + return; } void MvMergePassUpdateNeighborArrays( PictureControlSet_t *pictureControlSetPtr, - NeighborArrayUnit_t *leafDepthNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, - NeighborArrayUnit_t *mvNeighborArray, - NeighborArrayUnit_t *skipNeighborArray, - NeighborArrayUnit_t *lumaReconSampleNeighborArray, - NeighborArrayUnit_t *cbReconSampleNeighborArray, - NeighborArrayUnit_t *crReconSampleNeighborArray, - EbPictureBufferDesc_t *reconBuffer, - EB_U32 lcuSize, - EB_BOOL intraMdOpenLoop, - EB_U8 *depth, - EB_U8 *modeType, - EB_U8 *lumaMode, - MvUnit_t *mvUnit, - EB_U8 *skipFlag, - EB_U32 originX, - EB_U32 originY, - EB_U32 size, + NeighborArrayUnit_t *leafDepthNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *mvNeighborArray, + NeighborArrayUnit_t *skipNeighborArray, + NeighborArrayUnit_t *lumaReconSampleNeighborArray, + NeighborArrayUnit_t *cbReconSampleNeighborArray, + NeighborArrayUnit_t *crReconSampleNeighborArray, + EbPictureBufferDesc_t *reconBuffer, + EB_U32 lcuSize, + EB_BOOL intraMdOpenLoop, + EB_U8 *depth, + EB_U8 *modeType, + EB_U8 *lumaMode, + MvUnit_t *mvUnit, + EB_U8 *skipFlag, + EB_U32 originX, + EB_U32 originY, + EB_U32 size, EB_U16 tileIdx, - EB_BOOL useIntraChromaflag) + EB_BOOL useIntraChromaflag) { - NeighborArrayUnitDepthSkipWrite( - leafDepthNeighborArray, - (EB_U8*)depth, - originX, - originY, - size); + NeighborArrayUnitDepthSkipWrite( + leafDepthNeighborArray, + (EB_U8*)depth, + originX, + originY, + size); NeighborArrayUnitModeTypeWrite( modeTypeNeighborArray, @@ -524,63 +524,63 @@ void MvMergePassUpdateNeighborArrays( originY, size); - // *Note - this has to be changed for non-square PU support -- JMJ - NeighborArrayUnitMvWrite( - mvNeighborArray, - (EB_U8*)mvUnit, - originX, - originY, - size); - - NeighborArrayUnitDepthSkipWrite( - skipNeighborArray, - (EB_U8*)skipFlag, - originX, - originY, - size); + // *Note - this has to be changed for non-square PU support -- JMJ + NeighborArrayUnitMvWrite( + mvNeighborArray, + (EB_U8*)mvUnit, + originX, + originY, + size); + + NeighborArrayUnitDepthSkipWrite( + skipNeighborArray, + (EB_U8*)skipFlag, + originX, + originY, + size); if (intraMdOpenLoop == EB_FALSE) { - // Recon Samples - Luma - NeighborArrayUnitSampleWrite( - lumaReconSampleNeighborArray, - reconBuffer->bufferY, - reconBuffer->strideY, - originX & (lcuSize - 1), - originY & (lcuSize - 1), - originX, - originY, - size,//CHKN width, - size,//CHKN height, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - if (useIntraChromaflag){ - // Recon Samples - Cb - NeighborArrayUnitSampleWrite( - cbReconSampleNeighborArray, - reconBuffer->bufferCb, - reconBuffer->strideCb, - (originX & (lcuSize - 1)) >> 1, - (originY & (lcuSize - 1)) >> 1, - originX >> 1, - originY >> 1, - size >> 1, - size >> 1, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - // Recon Samples - Cr - NeighborArrayUnitSampleWrite( - crReconSampleNeighborArray, - reconBuffer->bufferCr, - reconBuffer->strideCr, - (originX & (lcuSize - 1)) >> 1, - (originY & (lcuSize - 1)) >> 1, - originX >> 1, - originY >> 1, - size >> 1, - size >> 1, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - } - } + // Recon Samples - Luma + NeighborArrayUnitSampleWrite( + lumaReconSampleNeighborArray, + reconBuffer->bufferY, + reconBuffer->strideY, + originX & (lcuSize - 1), + originY & (lcuSize - 1), + originX, + originY, + size,//CHKN width, + size,//CHKN height, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + if (useIntraChromaflag){ + // Recon Samples - Cb + NeighborArrayUnitSampleWrite( + cbReconSampleNeighborArray, + reconBuffer->bufferCb, + reconBuffer->strideCb, + (originX & (lcuSize - 1)) >> 1, + (originY & (lcuSize - 1)) >> 1, + originX >> 1, + originY >> 1, + size >> 1, + size >> 1, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + // Recon Samples - Cr + NeighborArrayUnitSampleWrite( + crReconSampleNeighborArray, + reconBuffer->bufferCr, + reconBuffer->strideCr, + (originX & (lcuSize - 1)) >> 1, + (originY & (lcuSize - 1)) >> 1, + originX >> 1, + originY >> 1, + size >> 1, + size >> 1, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + } + } @@ -668,7 +668,7 @@ void MvMergePassUpdateNeighborArrays( } - return; + return; } @@ -870,34 +870,34 @@ void Bdp16x16vs8x8RefinementUpdateNeighborArrays( } void DeriveMpmModes( - ModeDecisionContext_t *contextPtr, - CodingUnit_t * const cuPtr) { - EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; - EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; - - if (leftNeighborMode == topNeighborMode) { - if (leftNeighborMode > 1) { // For angular modes - contextPtr->mostProbableModeArray[0] = leftNeighborMode; - contextPtr->mostProbableModeArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - contextPtr->mostProbableModeArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - contextPtr->mostProbableModeArray[0] = EB_INTRA_PLANAR; - contextPtr->mostProbableModeArray[1] = EB_INTRA_DC; - contextPtr->mostProbableModeArray[2] = EB_INTRA_VERTICAL; - } - } - else { - contextPtr->mostProbableModeArray[0] = leftNeighborMode; - contextPtr->mostProbableModeArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - contextPtr->mostProbableModeArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - contextPtr->mostProbableModeArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } + ModeDecisionContext_t *contextPtr, + CodingUnit_t * const cuPtr) { + EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; + EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; + + if (leftNeighborMode == topNeighborMode) { + if (leftNeighborMode > 1) { // For angular modes + contextPtr->mostProbableModeArray[0] = leftNeighborMode; + contextPtr->mostProbableModeArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + contextPtr->mostProbableModeArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + contextPtr->mostProbableModeArray[0] = EB_INTRA_PLANAR; + contextPtr->mostProbableModeArray[1] = EB_INTRA_DC; + contextPtr->mostProbableModeArray[2] = EB_INTRA_VERTICAL; + } + } + else { + contextPtr->mostProbableModeArray[0] = leftNeighborMode; + contextPtr->mostProbableModeArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + contextPtr->mostProbableModeArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + contextPtr->mostProbableModeArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } } //*************************// // SetNfl @@ -905,13 +905,13 @@ void DeriveMpmModes( // the NFL candidates numbers are set //*************************// void SetNfl( - LargestCodingUnit_t *lcuPtr, - ModeDecisionContext_t *contextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_MD_STAGE mdStage) + LargestCodingUnit_t *lcuPtr, + ModeDecisionContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_MD_STAGE mdStage) { - switch (mdStage) { - case MDC_STAGE: + switch (mdStage) { + case MDC_STAGE: // NFL Level MD Settings // 0 4 // 1 3 if 32x32, 2 otherwise @@ -960,7 +960,7 @@ void SetNfl( } break; - case BDP_PILLAR_STAGE: + case BDP_PILLAR_STAGE: case BDP_16X16_8X8_REF_STAGE: // NFL Level Pillar/8x8 Refinement Settings // 0 4 @@ -1025,7 +1025,7 @@ void SetNfl( break; case BDP_MVMERGE_STAGE: - case BDP_64X64_32X32_REF_STAGE: + case BDP_64X64_32X32_REF_STAGE: // NFL Level MvMerge/64x64 Refinement Settings // 0 4 @@ -1089,8 +1089,8 @@ void SetNfl( // the NMM candidates numbers are set //*************************// void SetNmm( - ModeDecisionContext_t *contextPtr, - EB_MD_STAGE mdStage) + ModeDecisionContext_t *contextPtr, + EB_MD_STAGE mdStage) { // NMM Level MD Settings @@ -1106,8 +1106,8 @@ void SetNmm( // 3 2 - switch (mdStage) { - case MDC_STAGE: + switch (mdStage) { + case MDC_STAGE: if (contextPtr->nmmLevelMd == 0) { contextPtr->mvMergeSkipModeCount = 5; } @@ -1121,9 +1121,9 @@ void SetNmm( contextPtr->mvMergeSkipModeCount = 2; } - break; + break; - case BDP_PILLAR_STAGE: + case BDP_PILLAR_STAGE: case BDP_64X64_32X32_REF_STAGE: case BDP_16X16_8X8_REF_STAGE: case BDP_MVMERGE_STAGE: @@ -1156,186 +1156,186 @@ void SetNmm( break; - default: - break; - } + default: + break; + } } void CheckHighCostPartition( - SequenceControlSet_t *sequenceControlSetPtr, - ModeDecisionContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr, - EB_U8 leafIndex, - EB_U8 *parentLeafIndexPtr, + SequenceControlSet_t *sequenceControlSetPtr, + ModeDecisionContext_t *contextPtr, + LargestCodingUnit_t *lcuPtr, + EB_U8 leafIndex, + EB_U8 *parentLeafIndexPtr, EB_BOOL enableExitPartitioning, - EB_U8 *exitPartitionPtr - ) + EB_U8 *exitPartitionPtr + ) { - EB_U8 parentLeafIndex; + EB_U8 parentLeafIndex; - if (sequenceControlSetPtr->lcuParamsArray[lcuPtr->index].isCompleteLcu && contextPtr->cuStats->depth>0) - { + if (sequenceControlSetPtr->lcuParamsArray[lcuPtr->index].isCompleteLcu && contextPtr->cuStats->depth>0) + { - const EB_U8 totChildren = MDSCAN_TO_QUADTREE_ID[leafIndex]; - EB_BOOL areGrandChildrenDone = EB_FALSE; - if (contextPtr->cuPtr->splitFlag == EB_FALSE) - areGrandChildrenDone = EB_TRUE; + const EB_U8 totChildren = MDSCAN_TO_QUADTREE_ID[leafIndex]; + EB_BOOL areGrandChildrenDone = EB_FALSE; + if (contextPtr->cuPtr->splitFlag == EB_FALSE) + areGrandChildrenDone = EB_TRUE; - if (enableExitPartitioning) + if (enableExitPartitioning) areGrandChildrenDone = (lcuPtr->pictureControlSetPtr->sliceType != EB_I_PICTURE) ? EB_TRUE : areGrandChildrenDone; - if (totChildren<4 && areGrandChildrenDone) - { - - parentLeafIndex = CHILD_MDSCAN_TO_PARENT_MDSCAN[leafIndex]; - if (contextPtr->mdLocalCuUnit[parentLeafIndex].testedCuFlag) - - { - //get parent cost. - EB_U64 depthNRate = 0; - SplitFlagRate( - contextPtr, - lcuPtr->codedLeafArrayPtr[parentLeafIndex], - 0, - &depthNRate, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - sequenceControlSetPtr->maxLcuDepth); - - EB_U64 parentCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; - - //get partition cost so far - EB_U64 totalChildrenCost = 0; - EB_U8 cuIt = leafIndex; - EB_U8 it; - for (it = 0; it < totChildren; it++) - { - totalChildrenCost += contextPtr->mdLocalCuUnit[cuIt].cost; - cuIt = cuIt - CuOffset[contextPtr->cuStats->depth]; - } - - if (enableExitPartitioning) - totalChildrenCost = lcuPtr->pictureControlSetPtr->temporalLayerIndex == 0 || contextPtr->edgeBlockNumFlag ? totalChildrenCost : (totalChildrenCost / totChildren) * 4; - - if (totalChildrenCost > parentCost) - { - *exitPartitionPtr = EB_TRUE; - *parentLeafIndexPtr = parentLeafIndex; - } - - } - - } - } + if (totChildren<4 && areGrandChildrenDone) + { + + parentLeafIndex = CHILD_MDSCAN_TO_PARENT_MDSCAN[leafIndex]; + if (contextPtr->mdLocalCuUnit[parentLeafIndex].testedCuFlag) + + { + //get parent cost. + EB_U64 depthNRate = 0; + SplitFlagRate( + contextPtr, + lcuPtr->codedLeafArrayPtr[parentLeafIndex], + 0, + &depthNRate, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + sequenceControlSetPtr->maxLcuDepth); + + EB_U64 parentCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; + + //get partition cost so far + EB_U64 totalChildrenCost = 0; + EB_U8 cuIt = leafIndex; + EB_U8 it; + for (it = 0; it < totChildren; it++) + { + totalChildrenCost += contextPtr->mdLocalCuUnit[cuIt].cost; + cuIt = cuIt - CuOffset[contextPtr->cuStats->depth]; + } + + if (enableExitPartitioning) + totalChildrenCost = lcuPtr->pictureControlSetPtr->temporalLayerIndex == 0 || contextPtr->edgeBlockNumFlag ? totalChildrenCost : (totalChildrenCost / totChildren) * 4; + + if (totalChildrenCost > parentCost) + { + *exitPartitionPtr = EB_TRUE; + *parentLeafIndexPtr = parentLeafIndex; + } + + } + + } + } } EB_U32 BdpCalculateNextCuIndex( - EB_U8 * leafDataArray, - EB_U32 cuIndex, - EB_U32 leafCount, - EB_U32 cuDepth - ) + EB_U8 * leafDataArray, + EB_U32 cuIndex, + EB_U32 leafCount, + EB_U32 cuDepth + ) { - EB_U32 cuIdx; - EB_U32 stepSplitFalse = 1; - EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1] + 1 : leafDataArray[cuIndex] + DepthOffset[cuDepth]; + EB_U32 cuIdx; + EB_U32 stepSplitFalse = 1; + EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1] + 1 : leafDataArray[cuIndex] + DepthOffset[cuDepth]; - for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ - // Assign CU data - const EB_U8 leafIndex = leafDataArray[cuIdx]; + for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ + // Assign CU data + const EB_U8 leafIndex = leafDataArray[cuIdx]; - if (leafIndex < nextLeafIndex){ - stepSplitFalse++; - } + if (leafIndex < nextLeafIndex){ + stepSplitFalse++; + } - else{ - break; - } + else{ + break; + } - } - return stepSplitFalse; + } + return stepSplitFalse; } // Calculate the next CU index EB_U32 CalculateNextCuIndex( - const EbMdcLeafData_t *const leafDataArray, - EB_U32 cuIndex, - EB_U32 leafCount, - EB_U32 cuDepth - ) + const EbMdcLeafData_t *const leafDataArray, + EB_U32 cuIndex, + EB_U32 leafCount, + EB_U32 cuDepth + ) { - EB_U32 cuIdx; - EB_U32 stepSplitFalse = 1; - EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1].leafIndex + 1 : leafDataArray[cuIndex].leafIndex + DepthOffset[cuDepth]; + EB_U32 cuIdx; + EB_U32 stepSplitFalse = 1; + EB_U8 nextLeafIndex = cuDepth == 0 ? leafDataArray[leafCount - 1].leafIndex + 1 : leafDataArray[cuIndex].leafIndex + DepthOffset[cuDepth]; - for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ - // Assign CU data + for (cuIdx = cuIndex + 1; cuIdx < leafCount; ++cuIdx){ + // Assign CU data const EB_U8 leafIndex = leafDataArray[cuIdx].leafIndex; - //const EB_BOOL splitFlag = leafDataArray[cuIdx].splitFlag; - //const CodedUnitStats_t *cuStatsPtr = GetCodedUnitStats(leafIndex); + //const EB_BOOL splitFlag = leafDataArray[cuIdx].splitFlag; + //const CodedUnitStats_t *cuStatsPtr = GetCodedUnitStats(leafIndex); - if (leafIndex < nextLeafIndex){ - stepSplitFalse++; - } + if (leafIndex < nextLeafIndex){ + stepSplitFalse++; + } - else{ - break; - } + else{ + break; + } - } - return stepSplitFalse; + } + return stepSplitFalse; } void ConstructMdCuArray( - ModeDecisionContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - LargestCodingUnit_t *lcuPtr, - const MdcLcuData_t * const mdcResultTbPtr) { - EB_U32 cuIdx = 0; - EB_U32 maxCuIndex = 0; + ModeDecisionContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + LargestCodingUnit_t *lcuPtr, + const MdcLcuData_t * const mdcResultTbPtr) { + EB_U32 cuIdx = 0; + EB_U32 maxCuIndex = 0; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuPtr->index]; - for (cuIdx = 0; cuIdx < mdcResultTbPtr->leafCount; ++cuIdx) { - maxCuIndex = MAX(maxCuIndex, mdcResultTbPtr->leafDataArray[cuIdx].leafIndex); - } + for (cuIdx = 0; cuIdx < mdcResultTbPtr->leafCount; ++cuIdx) { + maxCuIndex = MAX(maxCuIndex, mdcResultTbPtr->leafDataArray[cuIdx].leafIndex); + } // CU Loop - if (lcuParams->isCompleteLcu) + if (lcuParams->isCompleteLcu) - { + { cuIdx = 0; - do - { - CodingUnit_t * const cuPtr = lcuPtr->codedLeafArrayPtr[cuIdx]; - contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; - cuPtr->splitFlag = EB_TRUE; + do + { + CodingUnit_t * const cuPtr = lcuPtr->codedLeafArrayPtr[cuIdx]; + contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; - ++cuIdx; + ++cuIdx; } while (cuIdx < maxCuIndex); - } - else { - // Initialize the cost & skipFlag for each CU belonging to this tree block for the future usage by inter-depth decision - CodingUnit_t ** const codedLeafArrayPtr = lcuPtr->codedLeafArrayPtr; + } + else { + // Initialize the cost & skipFlag for each CU belonging to this tree block for the future usage by inter-depth decision + CodingUnit_t ** const codedLeafArrayPtr = lcuPtr->codedLeafArrayPtr; const unsigned codedLeafCount = CU_MAX_COUNT; - cuIdx = 0; - do - { - CodingUnit_t * const cuPtr = codedLeafArrayPtr[cuIdx]; - contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; - cuPtr->splitFlag = EB_TRUE; + cuIdx = 0; + do + { + CodingUnit_t * const cuPtr = codedLeafArrayPtr[cuIdx]; + contextPtr->mdLocalCuUnit[cuIdx].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; - ++cuIdx; + ++cuIdx; - } while (cuIdx < codedLeafCount); - } + } while (cuIdx < codedLeafCount); + } } void PerformInverseTransformRecon( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, ModeDecisionCandidateBuffer_t *candidateBuffer, CodingUnit_t *cuPtr, - const CodedUnitStats_t *cuStatsPtr) { + const CodedUnitStats_t *cuStatsPtr) { const TransformUnitStats_t *tuStatPtr; EB_U32 tuSize; @@ -1345,7 +1345,7 @@ void PerformInverseTransformRecon( EB_U32 tuTotalCount; EB_U32 tuIndex; - EB_U32 tuItr; + EB_U32 tuItr; TransformUnit_t *tuPtr; // Recon not needed if Open-Loop INTRA, or if spatialSseFullLoop ON (where T-1 performed @ Full-Loop) @@ -1552,134 +1552,134 @@ void PerformInverseTransformRecon( * Coding Loop - Fast Loop Initialization *******************************************/ void EbHevcProductCodingLoopInitFastLoop( - ModeDecisionContext_t *contextPtr, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *skipFlagNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *leafDepthNeighborArray) + ModeDecisionContext_t *contextPtr, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *skipFlagNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *leafDepthNeighborArray) { - // Keep track of the LCU Ptr - contextPtr->lumaIntraRefSamplesGenDone = EB_FALSE; - contextPtr->chromaIntraRefSamplesGenDone = EB_FALSE; - - // Generate Split, Skip and intra mode contexts for the rate estimation - CodingLoopContextGeneration( - contextPtr, - contextPtr->cuPtr, - contextPtr->cuOriginX, - contextPtr->cuOriginY, + // Keep track of the LCU Ptr + contextPtr->lumaIntraRefSamplesGenDone = EB_FALSE; + contextPtr->chromaIntraRefSamplesGenDone = EB_FALSE; + + // Generate Split, Skip and intra mode contexts for the rate estimation + CodingLoopContextGeneration( + contextPtr, + contextPtr->cuPtr, + contextPtr->cuOriginX, + contextPtr->cuOriginY, MAX_LCU_SIZE, intraLumaNeighborArray, skipFlagNeighborArray, modeTypeNeighborArray, leafDepthNeighborArray); - // *Notes - // -Instead of creating function pointers in a static array, put the func pointers in a queue - // -This function should also do the SAD calc for each mode - // -The best independent intra chroma mode should be determined here - // -Modify PictureBufferDesc to be able to create Luma, Cb, and/or Cr only buffers via flags - // -Have one PictureBufferDesc that points to the intra chroma buffer to be used. - // -Properly signal the DM mode at this point + // *Notes + // -Instead of creating function pointers in a static array, put the func pointers in a queue + // -This function should also do the SAD calc for each mode + // -The best independent intra chroma mode should be determined here + // -Modify PictureBufferDesc to be able to create Luma, Cb, and/or Cr only buffers via flags + // -Have one PictureBufferDesc that points to the intra chroma buffer to be used. + // -Properly signal the DM mode at this point - // Initialize the candidate buffer costs - { + // Initialize the candidate buffer costs + { EB_U32 bufferDepthIndexStart = contextPtr->bufferDepthIndexStart[contextPtr->cuStats->depth]; - EB_U32 bufferDepthIndexWidth = contextPtr->bufferDepthIndexWidth[contextPtr->cuStats->depth]; - EB_U32 index = 0; + EB_U32 bufferDepthIndexWidth = contextPtr->bufferDepthIndexWidth[contextPtr->cuStats->depth]; + EB_U32 index = 0; - for (index = 0; index < bufferDepthIndexWidth; ++index){ - contextPtr->fastCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; - contextPtr->fullCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; - } + for (index = 0; index < bufferDepthIndexWidth; ++index){ + contextPtr->fastCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; + contextPtr->fullCostArray[bufferDepthIndexStart + index] = 0xFFFFFFFFFFFFFFFFull; + } - } - return; + } + return; } static inline EB_ERRORTYPE ChromaPrediction( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, - EB_U32 cuChromaOriginIndex, - ModeDecisionContext_t *contextPtr) + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, + EB_U32 cuChromaOriginIndex, + ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; (void) cuChromaOriginIndex; if (candidateBuffer->candidatePtr->predictionIsReady == EB_FALSE) { - const EB_U8 type = candidateBuffer->candidatePtr->type; + const EB_U8 type = candidateBuffer->candidatePtr->type; - contextPtr->puOriginX = contextPtr->cuOriginX; + contextPtr->puOriginX = contextPtr->cuOriginX; - contextPtr->puOriginY = contextPtr->cuOriginY; + contextPtr->puOriginY = contextPtr->cuOriginY; - contextPtr->puWidth = contextPtr->cuSize; + contextPtr->puWidth = contextPtr->cuSize; - contextPtr->puHeight = contextPtr->cuSize; + contextPtr->puHeight = contextPtr->cuSize; - contextPtr->puItr = 0; + contextPtr->puItr = 0; - if (contextPtr->intraMdOpenLoopFlag){ + if (contextPtr->intraMdOpenLoopFlag){ PredictionFunTableOl[contextPtr->interpolationMethod][type]( - contextPtr, - PICTURE_BUFFER_DESC_CHROMA_MASK, - pictureControlSetPtr, - candidateBuffer); - } - else{ + contextPtr, + PICTURE_BUFFER_DESC_CHROMA_MASK, + pictureControlSetPtr, + candidateBuffer); + } + else{ PredictionFunTableCl[contextPtr->interpolationMethod][type]( - contextPtr, - PICTURE_BUFFER_DESC_CHROMA_MASK, - pictureControlSetPtr, - candidateBuffer); - } - } - - return return_error; + contextPtr, + PICTURE_BUFFER_DESC_CHROMA_MASK, + pictureControlSetPtr, + candidateBuffer); + } + } + + return return_error; } void ProductMdFastPuPrediction( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, - ModeDecisionContext_t *contextPtr, - EB_U32 useChromaInformationInFastLoop, - EB_U32 modeType, - ModeDecisionCandidate_t *const candidatePtr, - EB_U32 fastLoopCandidateIndex, - EB_U32 bestFirstFastCostSearchCandidateIndex) + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, + ModeDecisionContext_t *contextPtr, + EB_U32 useChromaInformationInFastLoop, + EB_U32 modeType, + ModeDecisionCandidate_t *const candidatePtr, + EB_U32 fastLoopCandidateIndex, + EB_U32 bestFirstFastCostSearchCandidateIndex) { - contextPtr->puItr = 0; + contextPtr->puItr = 0; - // Prediction - if (contextPtr->intraMdOpenLoopFlag){ + // Prediction + if (contextPtr->intraMdOpenLoopFlag){ - EB_U32 predMask = useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK; - if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) - predMask = predMask & (~PICTURE_BUFFER_DESC_Y_FLAG); + EB_U32 predMask = useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK; + if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) + predMask = predMask & (~PICTURE_BUFFER_DESC_Y_FLAG); - candidateBuffer->candidatePtr->predictionIsReadyLuma = (EB_BOOL)(predMask & PICTURE_BUFFER_DESC_Y_FLAG); + candidateBuffer->candidatePtr->predictionIsReadyLuma = (EB_BOOL)(predMask & PICTURE_BUFFER_DESC_Y_FLAG); PredictionFunTableOl[contextPtr->interpolationMethod][modeType]( - contextPtr, - predMask, - pictureControlSetPtr, - candidateBuffer); + contextPtr, + predMask, + pictureControlSetPtr, + candidateBuffer); - } - else{ + } + else{ - candidateBuffer->candidatePtr->predictionIsReadyLuma = EB_TRUE; + candidateBuffer->candidatePtr->predictionIsReadyLuma = EB_TRUE; PredictionFunTableCl[contextPtr->interpolationMethod][modeType]( - contextPtr, - useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK, - pictureControlSetPtr, - candidateBuffer); + contextPtr, + useChromaInformationInFastLoop ? PICTURE_BUFFER_DESC_FULL_MASK : PICTURE_BUFFER_DESC_LUMA_MASK, + pictureControlSetPtr, + candidateBuffer); - } + } } @@ -1711,10 +1711,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList0PosX = 0; EB_U32 refList0PosY = 0; - EB_U32 integPosL0x; - EB_U32 integPosL0y; - EB_U8 counter; - EB_U16 *src0Ptr; + EB_U32 integPosL0x; + EB_U32 integPosL0y; + EB_U8 counter; + EB_U16 *src0Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; @@ -1756,10 +1756,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList1PosX = 0; EB_U32 refList1PosY = 0; - EB_U32 integPosL1x; - EB_U32 integPosL1y; - EB_U8 counter; - EB_U16 *src1Ptr; + EB_U32 integPosL1x; + EB_U32 integPosL1y; + EB_U8 counter; + EB_U16 *src1Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList1 = (EbPictureBufferDesc_t*)referenceObject->referencePicture16bit; @@ -1806,10 +1806,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList0PosX = 0; EB_U32 refList0PosY = 0; - EB_U32 integPosL0x; - EB_U32 integPosL0y; - EB_U8 counter; - EB_U8 *src0Ptr; + EB_U32 integPosL0x; + EB_U32 integPosL0y; + EB_U8 counter; + EB_U8 *src0Ptr; referenceObject = (EbReferenceObject_t*)pictureControlSetPtr->refPicPtrArray[REF_LIST_0]->objectPtr; refPicList0 = (EbPictureBufferDesc_t*)referenceObject->referencePicture; @@ -1858,10 +1858,10 @@ void ModeDecisionPreFetchRef( EbReferenceObject_t *referenceObject; EB_U32 refList1PosX = 0; EB_U32 refList1PosY = 0; - EB_U32 integPosL1x; - EB_U32 integPosL1y; - EB_U8 counter; - EB_U8 *src1Ptr; + EB_U32 integPosL1x; + EB_U32 integPosL1y; + EB_U8 counter; + EB_U8 *src1Ptr; // List1 referenceObject = (EbReferenceObject_t *)pictureControlSetPtr->refPicPtrArray[REF_LIST_1]->objectPtr; @@ -1909,60 +1909,60 @@ void ModeDecisionPreFetchRef( } void ProductPerformFastLoop( - PictureControlSet_t *pictureControlSetPtr, - LargestCodingUnit_t *lcuPtr, - ModeDecisionContext_t *contextPtr, - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase, - ModeDecisionCandidate_t *fastCandidateArray, - EB_U32 fastCandidateTotalCount, - EbPictureBufferDesc_t *inputPicturePtr, - EB_U32 inputOriginIndex, - EB_U32 inputCbOriginIndex, - EB_U32 inputCrOriginIndex, - CodingUnit_t *cuPtr, - EB_U32 cuOriginIndex, - EB_U32 cuChromaOriginIndex, - EB_U32 maxBuffers, - EB_U32 *secondFastCostSearchCandidateTotalCount) { - - EB_S32 fastLoopCandidateIndex; - EB_U64 lumaFastDistortion; - EB_U64 chromaFastDistortion; - ModeDecisionCandidateBuffer_t *candidateBuffer; - const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - EB_U32 highestCostIndex; - EB_U64 highestCost; - EB_U32 isCandzz = 0; - const EB_U32 cuDepth = contextPtr->cuStats->depth; - const EB_U32 cuSize = contextPtr->cuStats->size; - EB_U32 firstFastCandidateTotalCount; - // Initialize first fast cost loop variables - EB_U64 bestFirstFastCostSearchCandidateCost = 0xFFFFFFFFFFFFFFFFull; - EB_S32 bestFirstFastCostSearchCandidateIndex = INVALID_FAST_CANDIDATE_INDEX; - SequenceControlSet_t *sequenceControlSetPtr = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr); - LcuBasedDetectors_t* mdPicLcuDetect = contextPtr->mdPicLcuDetect; - - if (contextPtr->singleFastLoopFlag == EB_FALSE) { - - firstFastCandidateTotalCount = 0; - // First Fast-Cost Search Candidate Loop - fastLoopCandidateIndex = fastCandidateTotalCount - 1; - do - { - lumaFastDistortion = 0; - - // Set the Candidate Buffer - candidateBuffer = candidateBufferPtrArrayBase[0]; - ModeDecisionCandidate_t *const candidatePtr = candidateBuffer->candidatePtr = &fastCandidateArray[fastLoopCandidateIndex]; - const unsigned distortionReady = candidatePtr->distortionReady; - - // Only check (src - src) candidates (Tier0 candidates) - if (!!distortionReady) - { - const EB_U32 type = candidatePtr->type; - - lumaFastDistortion = candidatePtr->meDistortion; - firstFastCandidateTotalCount++; + PictureControlSet_t *pictureControlSetPtr, + LargestCodingUnit_t *lcuPtr, + ModeDecisionContext_t *contextPtr, + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase, + ModeDecisionCandidate_t *fastCandidateArray, + EB_U32 fastCandidateTotalCount, + EbPictureBufferDesc_t *inputPicturePtr, + EB_U32 inputOriginIndex, + EB_U32 inputCbOriginIndex, + EB_U32 inputCrOriginIndex, + CodingUnit_t *cuPtr, + EB_U32 cuOriginIndex, + EB_U32 cuChromaOriginIndex, + EB_U32 maxBuffers, + EB_U32 *secondFastCostSearchCandidateTotalCount) { + + EB_S32 fastLoopCandidateIndex; + EB_U64 lumaFastDistortion; + EB_U64 chromaFastDistortion; + ModeDecisionCandidateBuffer_t *candidateBuffer; + const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + EB_U32 highestCostIndex; + EB_U64 highestCost; + EB_U32 isCandzz = 0; + const EB_U32 cuDepth = contextPtr->cuStats->depth; + const EB_U32 cuSize = contextPtr->cuStats->size; + EB_U32 firstFastCandidateTotalCount; + // Initialize first fast cost loop variables + EB_U64 bestFirstFastCostSearchCandidateCost = 0xFFFFFFFFFFFFFFFFull; + EB_S32 bestFirstFastCostSearchCandidateIndex = INVALID_FAST_CANDIDATE_INDEX; + SequenceControlSet_t *sequenceControlSetPtr = ((SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr); + LcuBasedDetectors_t* mdPicLcuDetect = contextPtr->mdPicLcuDetect; + + if (contextPtr->singleFastLoopFlag == EB_FALSE) { + + firstFastCandidateTotalCount = 0; + // First Fast-Cost Search Candidate Loop + fastLoopCandidateIndex = fastCandidateTotalCount - 1; + do + { + lumaFastDistortion = 0; + + // Set the Candidate Buffer + candidateBuffer = candidateBufferPtrArrayBase[0]; + ModeDecisionCandidate_t *const candidatePtr = candidateBuffer->candidatePtr = &fastCandidateArray[fastLoopCandidateIndex]; + const unsigned distortionReady = candidatePtr->distortionReady; + + // Only check (src - src) candidates (Tier0 candidates) + if (!!distortionReady) + { + const EB_U32 type = candidatePtr->type; + + lumaFastDistortion = candidatePtr->meDistortion; + firstFastCandidateTotalCount++; // Fast Cost Calc ProductFastCostFuncOptTable[type][sliceType]( @@ -1975,24 +1975,24 @@ void ProductPerformFastLoop( contextPtr->fastLambda, pictureControlSetPtr); - // Keep track of the candidate index of the best (src - src) candidate - if (*(candidateBuffer->fastCostPtr) <= bestFirstFastCostSearchCandidateCost) { - bestFirstFastCostSearchCandidateIndex = fastLoopCandidateIndex; - bestFirstFastCostSearchCandidateCost = *(candidateBuffer->fastCostPtr); - } + // Keep track of the candidate index of the best (src - src) candidate + if (*(candidateBuffer->fastCostPtr) <= bestFirstFastCostSearchCandidateCost) { + bestFirstFastCostSearchCandidateIndex = fastLoopCandidateIndex; + bestFirstFastCostSearchCandidateCost = *(candidateBuffer->fastCostPtr); + } - // Initialize Fast Cost - to do not interact with the second Fast-Cost Search - *(candidateBuffer->fastCostPtr) = 0xFFFFFFFFFFFFFFFFull; - } - } while (--fastLoopCandidateIndex >= 0); - } + // Initialize Fast Cost - to do not interact with the second Fast-Cost Search + *(candidateBuffer->fastCostPtr) = 0xFFFFFFFFFFFFFFFFull; + } + } while (--fastLoopCandidateIndex >= 0); + } - // Second Fast-Cost Search Candidate Loop - *secondFastCostSearchCandidateTotalCount = 0; - highestCostIndex = contextPtr->bufferDepthIndexStart[cuDepth]; - fastLoopCandidateIndex = fastCandidateTotalCount - 1; + // Second Fast-Cost Search Candidate Loop + *secondFastCostSearchCandidateTotalCount = 0; + highestCostIndex = contextPtr->bufferDepthIndexStart[cuDepth]; + fastLoopCandidateIndex = fastCandidateTotalCount - 1; - EB_U16 lcuAddr = lcuPtr->index; + EB_U16 lcuAddr = lcuPtr->index; do { @@ -2039,17 +2039,17 @@ void ProductPerformFastLoop( // Skip distortion computation if the candidate is MPM if (candidateBuffer->candidatePtr->mpmFlag == EB_FALSE) { - if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) - lumaFastDistortion = candidatePtr->meDistortion; - else - // Y - lumaFastDistortion += (NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3] ( - inputBufferY, - inputStrideY, - predBufferY, - MAX_LCU_SIZE , - cuSize, - cuSize)); + if (fastLoopCandidateIndex == bestFirstFastCostSearchCandidateIndex && candidatePtr->type == INTRA_MODE) + lumaFastDistortion = candidatePtr->meDistortion; + else + // Y + lumaFastDistortion += (NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 3] ( + inputBufferY, + inputStrideY, + predBufferY, + MAX_LCU_SIZE , + cuSize, + cuSize)); // Cb if (!!contextPtr->useChromaInformationInFastLoop) @@ -2057,13 +2057,13 @@ void ProductPerformFastLoop( EB_U8 * const inputBufferCb = inputPicturePtr->bufferCb + inputCbOriginIndex; EB_U8 * const predBufferCb = candidateBuffer->predictionPtr->bufferCb + cuChromaOriginIndex; - chromaFastDistortion += NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 4] ( - inputBufferCb, - inputPicturePtr->strideCb, - predBufferCb, - (MAX_LCU_SIZE >> 1) , - (cuSize >> 1) , - cuSize >> 1); + chromaFastDistortion += NxMSadKernel_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][cuSize >> 4] ( + inputBufferCb, + inputPicturePtr->strideCb, + predBufferCb, + (MAX_LCU_SIZE >> 1) , + (cuSize >> 1) , + cuSize >> 1); EB_U8 * const inputBufferCr = inputPicturePtr->bufferCr + inputCrOriginIndex; @@ -2095,15 +2095,15 @@ void ProductPerformFastLoop( candidateBuffer->weightChromaDistortion = EB_TRUE; } - ProductFastCostFuncOptTable[candidatePtr->type][sliceType]( - contextPtr, - cuPtr, - candidateBuffer, - cuPtr->qp, - lumaFastDistortion, - chromaFastDistortion, - contextPtr->fastLambda, - pictureControlSetPtr); + ProductFastCostFuncOptTable[candidatePtr->type][sliceType]( + contextPtr, + cuPtr, + candidateBuffer, + cuPtr->qp, + lumaFastDistortion, + chromaFastDistortion, + contextPtr->fastLambda, + pictureControlSetPtr); candidateBuffer->candidatePtr->fastLoopLumaDistortion = (EB_U32)lumaFastDistortion; if (contextPtr->useIntraInterBias){ @@ -2123,8 +2123,8 @@ void ProductPerformFastLoop( } } - } - } + } + } if (sequenceControlSetPtr->staticConfig.improveSharpness) ApplyMvOverBoundariesBias( @@ -2184,65 +2184,65 @@ void ProductPerformFastLoop( void ApplyIntraInterModeBias( EB_BOOL intraInterCond1, EB_BOOL intraInterCond2, - EB_BOOL intraInterCond3, - EB_U64 *fullCostPtr) + EB_BOOL intraInterCond3, + EB_U64 *fullCostPtr) { *fullCostPtr += intraInterCond1 ? (*fullCostPtr * 30) / 100 : 0; *fullCostPtr += intraInterCond2 ? (*fullCostPtr * 30) / 100 : 0; - *fullCostPtr = intraInterCond3 ? *fullCostPtr * 3 : *fullCostPtr; + *fullCostPtr = intraInterCond3 ? *fullCostPtr * 3 : *fullCostPtr; } extern void GenerateIntraChromaReferenceSamplesMd( - ModeDecisionContext_t *contextPtr, - EbPictureBufferDesc_t *inputPicturePtr) { + ModeDecisionContext_t *contextPtr, + EbPictureBufferDesc_t *inputPicturePtr) { if (contextPtr->useChromaInformationInFullLoop && contextPtr->intraMdOpenLoopFlag == EB_FALSE) { - GenerateChromaIntraReferenceSamplesEncodePass( - EB_FALSE, - EB_TRUE, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuSize, - contextPtr->lcuSize, - contextPtr->cuDepth, - contextPtr->modeTypeNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - contextPtr->intraRefPtr, + GenerateChromaIntraReferenceSamplesEncodePass( + EB_FALSE, + EB_TRUE, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuSize, + contextPtr->lcuSize, + contextPtr->cuDepth, + contextPtr->modeTypeNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + contextPtr->intraRefPtr, EB_YUV420, EB_FALSE, - EB_FALSE, - EB_FALSE, - EB_FALSE); + EB_FALSE, + EB_FALSE, + EB_FALSE); - contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; + contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; - } + } else { - UpdateChromaNeighborSamplesArrayOL( - contextPtr->intraRefPtr, - inputPicturePtr, - inputPicturePtr->strideY, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - inputPicturePtr->strideCb, - inputPicturePtr->strideCr, - contextPtr->cuChromaOriginX, - contextPtr->cuChromaOriginY, - contextPtr->cuSize >> 1, - contextPtr->lcuPtr); - - contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; - } + UpdateChromaNeighborSamplesArrayOL( + contextPtr->intraRefPtr, + inputPicturePtr, + inputPicturePtr->strideY, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + inputPicturePtr->strideCb, + inputPicturePtr->strideCr, + contextPtr->cuChromaOriginX, + contextPtr->cuChromaOriginY, + contextPtr->cuSize >> 1, + contextPtr->lcuPtr); + + contextPtr->chromaIntraRefSamplesGenDone = EB_TRUE; + } } void DerivePartialFrequencyN2Flag( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr) + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr) { if (contextPtr->pfMdLevel == 0) { contextPtr->pfMdMode = PF_OFF; @@ -2261,9 +2261,9 @@ void DerivePartialFrequencyN2Flag( void PerformIntraPrediction( - PictureControlSet_t *pictureControlSetPtr, - ModeDecisionContext_t *contextPtr, - ModeDecisionCandidateBuffer_t *candidateBuffer, + PictureControlSet_t *pictureControlSetPtr, + ModeDecisionContext_t *contextPtr, + ModeDecisionCandidateBuffer_t *candidateBuffer, ModeDecisionCandidate_t *candidatePtr) { if (contextPtr->intraMdOpenLoopFlag){ @@ -2276,10 +2276,10 @@ void PerformIntraPrediction( contextPtr->puPtr = &contextPtr->cuPtr->predictionUnitArray[puItr]; PredictionFunTableOl[contextPtr->interpolationMethod][candidatePtr->type]( - contextPtr, - PICTURE_BUFFER_DESC_LUMA_MASK, - pictureControlSetPtr, - candidateBuffer); + contextPtr, + PICTURE_BUFFER_DESC_LUMA_MASK, + pictureControlSetPtr, + candidateBuffer); } } else{ @@ -2298,7 +2298,7 @@ void SkipSmallCu( EB_U16 lcuAddr = contextPtr->lcuPtr->index; if (pictureControlSetPtr->lcuPtrArray[lcuAddr]->auraStatus == AURA_STATUS_0 && (pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuAddr]).stationaryEdgeOverTimeFlag == 0) { - if (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth == cuDepth && contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth == cuDepth && cuPtr->splitFlag == EB_TRUE){ + if (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth == cuDepth && contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth == cuDepth && cuPtr->splitFlag == EB_TRUE){ cuPtr->splitFlag = EB_FALSE; } } @@ -2306,64 +2306,64 @@ void SkipSmallCu( } void Intra4x4CodingLoopContextGeneration( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, - EB_U32 puOriginX, - EB_U32 puOriginY, - EB_U32 lcuSize, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray) + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, + EB_U32 puOriginX, + EB_U32 puOriginY, + EB_U32 lcuSize, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - puOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - puOriginX); - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaNeighborArray, - puOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaNeighborArray, - puOriginX); + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + puOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + puOriginX); + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaNeighborArray, + puOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaNeighborArray, + puOriginX); contextPtr->intraLumaLeftModeArray[puIndex] = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); contextPtr->intraLumaTopModeArray[puIndex] = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - ((puOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then - (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + ((puOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then + (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width - return; + return; } void Intra4x4VsIntra8x8( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr, EB_U8 *intra4x4LumaMode, - EB_U64 *intra4x4Cost, + EB_U64 *intra4x4Cost, EB_U64 *intra4x4FullDistortion, EB_BOOL useChromaInformationInFullLoop, - CodingUnit_t *cuPtr) + CodingUnit_t *cuPtr) { EB_U32 puIndex; if(cuPtr->predictionModeFlag!=INTRA_MODE) SVT_LOG("SVT [WARNING]: cuPtr->costLuma needs to be filled in inter case"); - if (*intra4x4Cost < contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma) { + if (*intra4x4Cost < contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma) { - if (useChromaInformationInFullLoop) { - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *intra4x4Cost; - } - else { - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma - *intra4x4Cost); - } + if (useChromaInformationInFullLoop) { + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = *intra4x4Cost; + } + else { + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost = contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].costLuma - *intra4x4Cost); + } - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = (EB_U32)*intra4x4FullDistortion; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].fullDistortion = (EB_U32)*intra4x4FullDistortion; cuPtr->predictionUnitArray->intraLumaMode = EB_INTRA_MODE_4x4; for (puIndex = 0; puIndex < 4; puIndex++) { @@ -2419,7 +2419,7 @@ EB_ERRORTYPE Intra4x4ModeDecisionControl( EB_U32 *bufferTotalCountPtr, EB_U32 *candidateTotalCountPtr, ModeDecisionCandidate_t **candidatePtrArray, - EB_U32 bestIntraMode) + EB_U32 bestIntraMode) { EB_ERRORTYPE return_error = EB_ErrorNone; @@ -2485,60 +2485,60 @@ EB_ERRORTYPE Intra4x4ModeDecisionControl( EB_ERRORTYPE Intra4x4PreModeDecision( - EB_U32 bufferTotalCount, - ModeDecisionCandidateBuffer_t **bufferPtrArray, - EB_U32 *fullCandidateTotalCountPtr, - EB_U8 *bestCandidateIndexArray) + EB_U32 bufferTotalCount, + ModeDecisionCandidateBuffer_t **bufferPtrArray, + EB_U32 *fullCandidateTotalCountPtr, + EB_U8 *bestCandidateIndexArray) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 fullCandidateIndex; - EB_U32 fullReconCandidateCount; - EB_U32 highestCostIndex; - EB_U64 highestCost; - EB_U32 candIndx = 0, i; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 fullCandidateIndex; + EB_U32 fullReconCandidateCount; + EB_U32 highestCostIndex; + EB_U64 highestCost; + EB_U32 candIndx = 0, i; - *fullCandidateTotalCountPtr = bufferTotalCount; + *fullCandidateTotalCountPtr = bufferTotalCount; - //Second, We substract one, because with N buffers we can determine the best N-1 candidates. - //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough - fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr) - 1); + //Second, We substract one, because with N buffers we can determine the best N-1 candidates. + //Note/TODO: in the case number of fast candidate is less or equal to the number of buffers, N buffers would be enough + fullReconCandidateCount = MAX(1, (*fullCandidateTotalCountPtr) - 1); - //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. - highestCost = *(bufferPtrArray[0]->fastCostPtr); - highestCostIndex = 0; + //With N buffers, we get here with the best N-1, plus the last candidate. We need to exclude the worst, and keep the best N-1. + highestCost = *(bufferPtrArray[0]->fastCostPtr); + highestCostIndex = 0; - if (bufferTotalCount > 1){ - for (i = 1; i < bufferTotalCount; i++) { + if (bufferTotalCount > 1){ + for (i = 1; i < bufferTotalCount; i++) { - if (*(bufferPtrArray[i]->fastCostPtr) >= highestCost){ - highestCost = *(bufferPtrArray[i]->fastCostPtr); - highestCostIndex = i; - } - } - for (i = 0; i < bufferTotalCount; i++) { + if (*(bufferPtrArray[i]->fastCostPtr) >= highestCost){ + highestCost = *(bufferPtrArray[i]->fastCostPtr); + highestCostIndex = i; + } + } + for (i = 0; i < bufferTotalCount; i++) { - if (i != highestCostIndex){ - bestCandidateIndexArray[candIndx++] = (EB_U8)i; - } - } - } - else - bestCandidateIndexArray[0] = 0; + if (i != highestCostIndex){ + bestCandidateIndexArray[candIndx++] = (EB_U8)i; + } + } + } + else + bestCandidateIndexArray[0] = 0; - // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount - (*fullCandidateTotalCountPtr) = fullReconCandidateCount; + // Set (*fullCandidateTotalCountPtr) to fullReconCandidateCount + (*fullCandidateTotalCountPtr) = fullReconCandidateCount; - for (i = 0; i < fullReconCandidateCount; ++i) { - fullCandidateIndex = bestCandidateIndexArray[i]; + for (i = 0; i < fullReconCandidateCount; ++i) { + fullCandidateIndex = bestCandidateIndexArray[i]; - // Next, Set the transformSize - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = TRANSFORM_MIN_SIZE; - bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = TRANSFORM_MIN_SIZE; + // Next, Set the transformSize + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformSize = TRANSFORM_MIN_SIZE; + bufferPtrArray[fullCandidateIndex]->candidatePtr->transformChromaSize = TRANSFORM_MIN_SIZE; - } + } - return return_error; + return return_error; } static void Intra4x4InitFastLoop( @@ -2547,7 +2547,7 @@ static void Intra4x4InitFastLoop( LargestCodingUnit_t *lcuPtr, EB_U32 partitionOriginX, EB_U32 partitionOriginY, - EB_BOOL useIntraChromaflag, + EB_BOOL useIntraChromaflag, EB_U32 puIndex) { @@ -2561,8 +2561,8 @@ static void Intra4x4InitFastLoop( MIN_PU_SIZE, MAX_LCU_SIZE, 3, - contextPtr->modeTypeNeighborArray, - contextPtr->lumaReconNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->lumaReconNeighborArray, (NeighborArrayUnit_t *) EB_NULL, (NeighborArrayUnit_t *) EB_NULL, contextPtr->intraRefPtr, @@ -2585,26 +2585,26 @@ static void Intra4x4InitFastLoop( lcuPtr); } - if (useIntraChromaflag){ - GenerateChromaIntraReferenceSamplesEncodePass( - EB_FALSE, - EB_TRUE, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuSize, - contextPtr->lcuSize, - contextPtr->cuDepth, - contextPtr->modeTypeNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - contextPtr->intraRefPtr, + if (useIntraChromaflag){ + GenerateChromaIntraReferenceSamplesEncodePass( + EB_FALSE, + EB_TRUE, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuSize, + contextPtr->lcuSize, + contextPtr->cuDepth, + contextPtr->modeTypeNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + contextPtr->intraRefPtr, EB_YUV420, EB_FALSE, - EB_FALSE, - EB_FALSE, - EB_FALSE); - } + EB_FALSE, + EB_FALSE, + EB_FALSE); + } // Generate Split, Skip and intra mode contexts for the rate estimation Intra4x4CodingLoopContextGeneration( contextPtr, @@ -2671,65 +2671,65 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( LargestCodingUnit_t *lcuPtr, CodingUnit_t *cuPtr, ModeDecisionContext_t *contextPtr, - EB_U32 bestIntraMode) + EB_U32 bestIntraMode) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - // Candidate Buffer - ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidate_t *candidatePtr; - EB_U32 candidateIndex = 0; - EB_U32 highestCostIndex; - EB_U32 bufferIndex; - EB_U32 bufferIndexEnd; - EB_U32 maxBuffers; - EB_U32 bufferTotalCount; - - - // Fast loop - EB_S32 fastLoopCandidateIndex; - EB_U32 fastCandidateTotalCount; - EB_U64 lumaFastDistortion; - //EB_U64 chromaFastDistortion; - EB_U64 highestCost; - - // Full Loop - EB_U32 fullLoopCandidateIndex; - EB_U32 fullCandidateTotalCount; - EB_U64 yFullDistortion[DIST_CALC_TOTAL]; - EB_U32 countNonZeroCoeffs; - EB_U64 yCoeffBits; - EB_U32 lumaShift; - - EbPictureBufferDesc_t *tuTransCoeffTmpPtr; - EbPictureBufferDesc_t *tuQuantCoeffTmpPtr; - EbPictureBufferDesc_t *transformBuffer; + EB_ERRORTYPE return_error = EB_ErrorNone; + + // Candidate Buffer + ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; + ModeDecisionCandidateBuffer_t *candidateBuffer; + ModeDecisionCandidate_t *candidatePtr; + EB_U32 candidateIndex = 0; + EB_U32 highestCostIndex; + EB_U32 bufferIndex; + EB_U32 bufferIndexEnd; + EB_U32 maxBuffers; + EB_U32 bufferTotalCount; + + + // Fast loop + EB_S32 fastLoopCandidateIndex; + EB_U32 fastCandidateTotalCount; + EB_U64 lumaFastDistortion; + //EB_U64 chromaFastDistortion; + EB_U64 highestCost; + + // Full Loop + EB_U32 fullLoopCandidateIndex; + EB_U32 fullCandidateTotalCount; + EB_U64 yFullDistortion[DIST_CALC_TOTAL]; + EB_U32 countNonZeroCoeffs; + EB_U64 yCoeffBits; + EB_U32 lumaShift; + + EbPictureBufferDesc_t *tuTransCoeffTmpPtr; + EbPictureBufferDesc_t *tuQuantCoeffTmpPtr; + EbPictureBufferDesc_t *transformBuffer; EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; EB_U32 inputOriginIndex; - EB_U32 puOriginIndex; + EB_U32 puOriginIndex; - EB_U8 intra4x4LumaMode[4]; - EB_U64 intra4x4Cost = 0; - EB_U64 intra4x4FullDistortion = 0; + EB_U8 intra4x4LumaMode[4]; + EB_U64 intra4x4Cost = 0; + EB_U64 intra4x4FullDistortion = 0; - EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; EB_U8 partitionIndex; - EB_BOOL use4x4ChromaInformation = EB_FALSE; - EB_U32 inputChromaOriginIndex; - EB_U32 puChromaOriginIndex; - EB_U64 chromaFastDistortion; - EB_U64 cbFullDistortion[DIST_CALC_TOTAL]; - EB_U32 cbCountNonZeroCoeffs; - EB_U64 cbCoeffBits; - EB_U64 crFullDistortion[DIST_CALC_TOTAL]; - EB_U32 crCountNonZeroCoeffs; - EB_U64 crCoeffBits; - EB_U32 chromaShift; + EB_BOOL use4x4ChromaInformation = EB_FALSE; + EB_U32 inputChromaOriginIndex; + EB_U32 puChromaOriginIndex; + EB_U64 chromaFastDistortion; + EB_U64 cbFullDistortion[DIST_CALC_TOTAL]; + EB_U32 cbCountNonZeroCoeffs; + EB_U64 cbCoeffBits; + EB_U64 crFullDistortion[DIST_CALC_TOTAL]; + EB_U32 crCountNonZeroCoeffs; + EB_U64 crCoeffBits; + EB_U32 chromaShift; if (contextPtr->coeffCabacUpdate) EB_MEMCPY(&(contextPtr->i4x4CoeffCtxModel), &(contextPtr->latestValidCoeffCtxModel), sizeof(CoeffCtxtMdl_t)); @@ -3566,23 +3566,23 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( } } } - // Update Neighbor Arrays - EB_U8 predictionModeFlag = (EB_U8)candidateBuffer->candidatePtr->type; - EB_U8 intraLumaMode = (EB_U8)candidateBuffer->candidatePtr->intraLumaMode; + // Update Neighbor Arrays + EB_U8 predictionModeFlag = (EB_U8)candidateBuffer->candidatePtr->type; + EB_U8 intraLumaMode = (EB_U8)candidateBuffer->candidatePtr->intraLumaMode; - NeighborArrayUnitModeTypeWrite( + NeighborArrayUnitModeTypeWrite( contextPtr->modeTypeNeighborArray, - &predictionModeFlag, - partitionOriginX, - partitionOriginY, - MIN_PU_SIZE); + &predictionModeFlag, + partitionOriginX, + partitionOriginY, + MIN_PU_SIZE); - NeighborArrayUnitIntraWrite( + NeighborArrayUnitIntraWrite( contextPtr->intraLumaModeNeighborArray, - &intraLumaMode, - partitionOriginX, - partitionOriginY, - MIN_PU_SIZE); + &intraLumaMode, + partitionOriginX, + partitionOriginY, + MIN_PU_SIZE); if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) { @@ -3598,37 +3598,37 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( MIN_PU_SIZE, NEIGHBOR_ARRAY_UNIT_FULL_MASK); - if (use4x4ChromaInformation) { - // Recon Samples - Cb - NeighborArrayUnitSampleWrite( - contextPtr->cbReconNeighborArray, - candidateBuffer->reconPtr->bufferCb, - candidateBuffer->reconPtr->strideCb, - partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginX >> 1, - partitionOriginY >> 1, - MIN_PU_SIZE, - MIN_PU_SIZE, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - // Recon Samples - Cr - NeighborArrayUnitSampleWrite( - contextPtr->crReconNeighborArray, - candidateBuffer->reconPtr->bufferCr, - candidateBuffer->reconPtr->strideCr, - partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, - partitionOriginX >> 1, - partitionOriginY >> 1, - MIN_PU_SIZE, - MIN_PU_SIZE, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - } + if (use4x4ChromaInformation) { + // Recon Samples - Cb + NeighborArrayUnitSampleWrite( + contextPtr->cbReconNeighborArray, + candidateBuffer->reconPtr->bufferCb, + candidateBuffer->reconPtr->strideCb, + partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginX >> 1, + partitionOriginY >> 1, + MIN_PU_SIZE, + MIN_PU_SIZE, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + // Recon Samples - Cr + NeighborArrayUnitSampleWrite( + contextPtr->crReconNeighborArray, + candidateBuffer->reconPtr->bufferCr, + candidateBuffer->reconPtr->strideCr, + partitionOriginX & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginY & (MAX_LCU_SIZE - 1) >> 1, + partitionOriginX >> 1, + partitionOriginY >> 1, + MIN_PU_SIZE, + MIN_PU_SIZE, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + } } - } + } if (contextPtr->useIntraInterBias){ ApplyIntraInterModeBias( @@ -3638,74 +3638,74 @@ EB_EXTERN EB_ERRORTYPE PerformIntra4x4Search( &intra4x4Cost); } - Intra4x4VsIntra8x8( - contextPtr, + Intra4x4VsIntra8x8( + contextPtr, lcuPtr, - &(intra4x4LumaMode[0]), - &intra4x4Cost, - &intra4x4FullDistortion, - contextPtr->use4x4ChromaInformationInFullLoop, - cuPtr); + &(intra4x4LumaMode[0]), + &intra4x4Cost, + &intra4x4FullDistortion, + contextPtr->use4x4ChromaInformationInFullLoop, + cuPtr); - return return_error; + return return_error; } void ModeDecisionRefinementUpdateNeighborArrays( ModeDecisionContext_t *contextPtr, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *intraLumaModeNeighborArray, - NeighborArrayUnit_t *lumaReconSampleNeighborArray, - EB_BOOL intra4x4Selected, - EB_U8 *modeType, - EB_U8 *lumaMode, - EB_U32 originX, - EB_U32 originY, - EB_U32 size) + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *intraLumaModeNeighborArray, + NeighborArrayUnit_t *lumaReconSampleNeighborArray, + EB_BOOL intra4x4Selected, + EB_U8 *modeType, + EB_U8 *lumaMode, + EB_U32 originX, + EB_U32 originY, + EB_U32 size) { - if (intra4x4Selected == EB_FALSE){ - - NeighborArrayUnitModeTypeWrite( - modeTypeNeighborArray, - (EB_U8*)modeType, - originX, - originY, - size); - - NeighborArrayUnitIntraWrite( - intraLumaModeNeighborArray, - (EB_U8*)lumaMode, - originX, - originY, - size); - - // Recon Samples - Luma - NeighborArrayUnitSampleWrite( - lumaReconSampleNeighborArray, - contextPtr->mdReconBuffer->bufferY, - contextPtr->mdReconBuffer->strideY, - originX & (MAX_LCU_SIZE - 1), - originY & (MAX_LCU_SIZE - 1), - originX, - originY, - size, - size, - NEIGHBOR_ARRAY_UNIT_FULL_MASK); - - } - - return; + if (intra4x4Selected == EB_FALSE){ + + NeighborArrayUnitModeTypeWrite( + modeTypeNeighborArray, + (EB_U8*)modeType, + originX, + originY, + size); + + NeighborArrayUnitIntraWrite( + intraLumaModeNeighborArray, + (EB_U8*)lumaMode, + originX, + originY, + size); + + // Recon Samples - Luma + NeighborArrayUnitSampleWrite( + lumaReconSampleNeighborArray, + contextPtr->mdReconBuffer->bufferY, + contextPtr->mdReconBuffer->strideY, + originX & (MAX_LCU_SIZE - 1), + originY & (MAX_LCU_SIZE - 1), + originX, + originY, + size, + size, + NEIGHBOR_ARRAY_UNIT_FULL_MASK); + + } + + return; } void UpdateMdNeighborArrays( PictureControlSet_t *pictureControlSetPtr, ModeDecisionContext_t *contextPtr, - EbPictureBufferDesc_t *reconBuffer, - EB_U32 lcuSize, - EB_U8 *depth, + EbPictureBufferDesc_t *reconBuffer, + EB_U32 lcuSize, + EB_U8 *depth, EB_U8 *modeType, EB_U8 *lumaMode, MvUnit_t *mvUnit, @@ -4120,39 +4120,39 @@ void UpdateMdReconBuffer( EbPictureBufferDesc_t *reconSrcPtr, EbPictureBufferDesc_t *reconDstPtr, ModeDecisionContext_t *contextPtr, - LargestCodingUnit_t *lcuPtr) + LargestCodingUnit_t *lcuPtr) { - if ((contextPtr->cuStats->size >> 3) < 9) { - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][contextPtr->cuStats->size >> 3]( - &(reconSrcPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconSrcPtr->strideY]), - reconSrcPtr->strideY, - &(reconDstPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconDstPtr->strideY]), - reconDstPtr->strideY, - contextPtr->cuStats->size, - contextPtr->cuStats->size); - - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL) { - EB_U8 chromaSize = contextPtr->cuStats->size >> 1; - EB_U16 chromaOriginX = contextPtr->cuStats->originX >> 1; - EB_U16 chromaOriginY = contextPtr->cuStats->originY >> 1; - - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( - &(reconSrcPtr->bufferCb[chromaOriginX + chromaOriginY * reconSrcPtr->strideCb]), - reconSrcPtr->strideCb, - &(reconDstPtr->bufferCb[chromaOriginX + chromaOriginY * reconDstPtr->strideCb]), - reconDstPtr->strideCb, - chromaSize, - chromaSize); - - PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( - &(reconSrcPtr->bufferCr[chromaOriginX + chromaOriginY * reconSrcPtr->strideCr]), - reconSrcPtr->strideCr, - &(reconDstPtr->bufferCr[chromaOriginX + chromaOriginY * reconDstPtr->strideCr]), - reconDstPtr->strideCr, - chromaSize, - chromaSize); - } - } + if ((contextPtr->cuStats->size >> 3) < 9) { + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][contextPtr->cuStats->size >> 3]( + &(reconSrcPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconSrcPtr->strideY]), + reconSrcPtr->strideY, + &(reconDstPtr->bufferY[contextPtr->cuStats->originX + contextPtr->cuStats->originY * reconDstPtr->strideY]), + reconDstPtr->strideY, + contextPtr->cuStats->size, + contextPtr->cuStats->size); + + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_FULL) { + EB_U8 chromaSize = contextPtr->cuStats->size >> 1; + EB_U16 chromaOriginX = contextPtr->cuStats->originX >> 1; + EB_U16 chromaOriginY = contextPtr->cuStats->originY >> 1; + + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( + &(reconSrcPtr->bufferCb[chromaOriginX + chromaOriginY * reconSrcPtr->strideCb]), + reconSrcPtr->strideCb, + &(reconDstPtr->bufferCb[chromaOriginX + chromaOriginY * reconDstPtr->strideCb]), + reconDstPtr->strideCb, + chromaSize, + chromaSize); + + PicCopyKernel_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][chromaSize >> 3]( + &(reconSrcPtr->bufferCr[chromaOriginX + chromaOriginY * reconSrcPtr->strideCr]), + reconSrcPtr->strideCr, + &(reconDstPtr->bufferCr[chromaOriginX + chromaOriginY * reconDstPtr->strideCr]), + reconDstPtr->strideCr, + chromaSize, + chromaSize); + } + } } void AddChromaEncDec( @@ -4163,7 +4163,7 @@ void AddChromaEncDec( EncDecContext_t *contextPtrED, EbPictureBufferDesc_t *inputPicturePtr, EB_U32 inputCbOriginIndex, - EB_U32 cuChromaOriginIndex, + EB_U32 cuChromaOriginIndex, EB_U32 candIdxInput) { @@ -4174,8 +4174,8 @@ void AddChromaEncDec( EB_U64 crFullDistortion[DIST_CALC_TOTAL]; EB_U64 yCoeffBits; - EB_U64 cbCoeffBits = 0; - EB_U64 crCoeffBits = 0; + EB_U64 cbCoeffBits = 0; + EB_U64 crCoeffBits = 0; const CodedUnitStats_t *cuStatsPtr = contextPtrED->cuStats; @@ -4205,31 +4205,31 @@ void AddChromaEncDec( if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_0) { //EB_MEMCPY(&candidatePtr->MVsL0,&puPtr->mv[REF_LIST_0].x,4); - candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; - candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; + candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; + candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; - } + } - if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) - { - //EB_MEMCPY(&candidatePtr->MVsL1,&puPtr->mv[REF_LIST_1].x,4); - candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; - candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; - } + if (puPtr->interPredDirectionIndex == UNI_PRED_LIST_1) + { + //EB_MEMCPY(&candidatePtr->MVsL1,&puPtr->mv[REF_LIST_1].x,4); + candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; + candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; + } - if (puPtr->interPredDirectionIndex == BI_PRED) - { - candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; - candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; - candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; - candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; + if (puPtr->interPredDirectionIndex == BI_PRED) + { + candidatePtr->motionVector_x_L0 = puPtr->mv[REF_LIST_0].x; + candidatePtr->motionVector_y_L0 = puPtr->mv[REF_LIST_0].y; + candidatePtr->motionVector_x_L1 = puPtr->mv[REF_LIST_1].x; + candidatePtr->motionVector_y_L1 = puPtr->mv[REF_LIST_1].y; - } + } // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); candidatePtr->yCbf = contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf; @@ -4343,8 +4343,8 @@ void AddChromaEncDec( transChromaformSize, pictureControlSetPtr); - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *candidateBuffer->fullCostMergePtr; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *candidateBuffer->fullCostSkipPtr; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].mergeCost = *candidateBuffer->fullCostMergePtr; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].skipCost = *candidateBuffer->fullCostSkipPtr; } @@ -4356,25 +4356,25 @@ static void PerformFullLoop( EbPictureBufferDesc_t *inputPicturePtr, EB_U32 inputOriginIndex, EB_U32 inputCbOriginIndex, - EB_U32 cuOriginIndex, - EB_U32 cuChromaOriginIndex, + EB_U32 cuOriginIndex, + EB_U32 cuChromaOriginIndex, EB_U32 fullCandidateTotalCount) { - EB_U32 prevRootCbf; + EB_U32 prevRootCbf; EB_U64 bestfullCost; - EB_U32 fullLoopCandidateIndex; + EB_U32 fullLoopCandidateIndex; EB_U8 candidateIndex; - EB_U64 yFullDistortion[DIST_CALC_TOTAL]; - EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU]; + EB_U64 yFullDistortion[DIST_CALC_TOTAL]; + EB_U32 countNonZeroCoeffs[3][MAX_NUM_OF_TU_PER_CU]; EB_U64 cbFullDistortion[DIST_CALC_TOTAL]; - EB_U64 crFullDistortion[DIST_CALC_TOTAL]; + EB_U64 crFullDistortion[DIST_CALC_TOTAL]; - EB_U64 yCoeffBits; - EB_U64 cbCoeffBits = 0; - EB_U64 crCoeffBits = 0; + EB_U64 yCoeffBits; + EB_U64 cbCoeffBits = 0; + EB_U64 crCoeffBits = 0; LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->ParentPcsPtr->lcuStatArray[lcuPtr->index]); const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(contextPtr->cuPtr->leafIndex); @@ -4382,10 +4382,10 @@ static void PerformFullLoop( prevRootCbf = 1; bestfullCost = 0xFFFFFFFFull; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidate_t *candidatePtr; + ModeDecisionCandidate_t *candidatePtr; for (fullLoopCandidateIndex = 0; fullLoopCandidateIndex < fullCandidateTotalCount; ++fullLoopCandidateIndex) { @@ -4550,8 +4550,8 @@ static void PerformFullLoop( EB_U32 N4_TH[NUM_QPS] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; EB_U32 N2_TH[NUM_QPS] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - // EB_U32 tuSize = candidatePtr->transformSize; - // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; + // EB_U32 tuSize = candidatePtr->transformSize; + // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; EB_U32 correctedPFMode = contextPtr->pfMdMode; EB_U8 Weight; @@ -4604,8 +4604,8 @@ static void PerformFullLoop( EB_U32 N4_TH[NUM_QPS] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; EB_U32 N2_TH[NUM_QPS] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - // EB_U32 tuSize = candidatePtr->transformSize; - // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; + // EB_U32 tuSize = candidatePtr->transformSize; + // EB_U32 chromatTuSize = candidatePtr->transformChromaSize; EB_U32 correctedPFMode = contextPtr->pfMdMode; EB_U8 Weight; @@ -4668,7 +4668,7 @@ static void PerformFullLoop( } } - if (contextPtr->fullLoopEscape) + if (contextPtr->fullLoopEscape) if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { if (candidatePtr->type == INTER_MODE) { @@ -4689,54 +4689,54 @@ static void PerformFullLoop( * performs CL (LCU) *******************************************/ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureControlSet_t *pictureControlSetPtr, - const MdcLcuData_t * const mdcResultTbPtr, - LargestCodingUnit_t *lcuPtr, - EB_U16 lcuOriginX, - EB_U16 lcuOriginY, - EB_U32 lcuAddr, - ModeDecisionContext_t *contextPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, + const MdcLcuData_t * const mdcResultTbPtr, + LargestCodingUnit_t *lcuPtr, + EB_U16 lcuOriginX, + EB_U16 lcuOriginY, + EB_U32 lcuAddr, + ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - // CU - EB_U32 cuIdx; + // CU + EB_U32 cuIdx; - // Input + // Input EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; EB_U16 tileIdx = contextPtr->tileIndex; - // Mode Decision Candidate Buffers - EB_U32 bufferTotalCount; - ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; + // Mode Decision Candidate Buffers + EB_U32 bufferTotalCount; + ModeDecisionCandidateBuffer_t *candidateBuffer; + ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; - // Mode Decision Search Candidates - EB_U8 candidateIndex; - EB_U32 fastCandidateTotalCount; - EB_U32 fullCandidateTotalCount; + // Mode Decision Search Candidates + EB_U8 candidateIndex; + EB_U32 fastCandidateTotalCount; + EB_U32 fullCandidateTotalCount; - EB_U32 secondFastCostSearchCandidateTotalCount; + EB_U32 secondFastCostSearchCandidateTotalCount; - // CTB merge - EB_U32 lastCuIndex; + // CTB merge + EB_U32 lastCuIndex; - // Pre Intra Search - const EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, (EB_U32)(sequenceControlSetPtr->lumaHeight - lcuOriginY)); - const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; - const EB_U32 leafCount = mdcResultTbPtr->leafCount; - const EbMdcLeafData_t *const leafDataArray = mdcResultTbPtr->leafDataArray; - ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; + // Pre Intra Search + const EB_U32 lcuHeight = MIN(MAX_LCU_SIZE, (EB_U32)(sequenceControlSetPtr->lumaHeight - lcuOriginY)); + const EB_PICTURE sliceType = pictureControlSetPtr->sliceType; + const EB_U32 leafCount = mdcResultTbPtr->leafCount; + const EbMdcLeafData_t *const leafDataArray = mdcResultTbPtr->leafDataArray; + ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - EB_U32 maxBuffers; + EB_U32 maxBuffers; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuAddr]; // enableExitPartitioning derivation @ ModeDecisionLcu() EB_BOOL enableExitPartitioning; @@ -4753,16 +4753,16 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } // Keep track of the LCU Ptr - contextPtr->lcuPtr = lcuPtr; + contextPtr->lcuPtr = lcuPtr; - contextPtr->groupOf8x8BlocksCount = 0; - contextPtr->groupOf16x16BlocksCount = 0; + contextPtr->groupOf8x8BlocksCount = 0; + contextPtr->groupOf16x16BlocksCount = 0; - ConstructMdCuArray( - contextPtr, - sequenceControlSetPtr, - lcuPtr, - mdcResultTbPtr); + ConstructMdCuArray( + contextPtr, + sequenceControlSetPtr, + lcuPtr, + mdcResultTbPtr); // Mode Decision Neighbor Arrays contextPtr->intraLumaModeNeighborArray = pictureControlSetPtr->mdIntraLumaModeNeighborArray[MD_NEIGHBOR_ARRAY_INDEX][tileIdx]; @@ -4775,25 +4775,25 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->crReconNeighborArray = pictureControlSetPtr->mdCrReconNeighborArray[MD_NEIGHBOR_ARRAY_INDEX][tileIdx]; contextPtr->edgeBlockNumFlag = (EB_BOOL)pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuAddr].edgeBlockNum; // First CU Loop - cuIdx = 0; - do - { - // Assign CU data - const EB_U8 leafIndex = leafDataArray[cuIdx].leafIndex; + cuIdx = 0; + do + { + // Assign CU data + const EB_U8 leafIndex = leafDataArray[cuIdx].leafIndex; - CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; + CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; - const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); + const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuOriginX = lcuOriginX + cuStatsPtr->originX; - contextPtr->cuOriginY = lcuOriginY + cuStatsPtr->originY; - const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); - const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); - const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); - const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; - const EbMdcLeafData_t * const leafDataPtr = &mdcResultTbPtr->leafDataArray[cuIdx]; + contextPtr->cuOriginY = lcuOriginY + cuStatsPtr->originY; + const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); + const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); + const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); + const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; + const EbMdcLeafData_t * const leafDataPtr = &mdcResultTbPtr->leafDataArray[cuIdx]; //need these for L7 Chroma: TBCleaned. contextPtr->cuDepth = cuStatsPtr->depth; @@ -4802,10 +4802,10 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->lcuChromaSize = contextPtr->lcuSize >> 1; contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; - contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; - contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; - cuPtr->leafIndex = leafIndex; - cuPtr->splitFlag = (EB_U16)( + contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; + contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; + cuPtr->leafIndex = leafIndex; + cuPtr->splitFlag = (EB_U16)( (sliceType == EB_I_PICTURE) && (cuStatsPtr->depth == 0) ? EB_TRUE : leafDataPtr->splitFlag); cuPtr->qp = contextPtr->qp; @@ -4813,17 +4813,17 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); - // Initialize Fast Loop - EbHevcProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray - contextPtr, + // Initialize Fast Loop + EbHevcProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray + contextPtr, contextPtr->intraLumaModeNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->leafDepthNeighborArray); + contextPtr->skipFlagNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->leafDepthNeighborArray); if ( (pictureControlSetPtr->ParentPcsPtr->depthMode >= PICT_OPEN_LOOP_DEPTH_MODE || @@ -4860,7 +4860,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -4871,32 +4871,32 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->mostProbableModeArray); //if we want to recon N candidate, we would need N+1 buffers - maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); - - ProductPerformFastLoop( - pictureControlSetPtr, - lcuPtr, - contextPtr, - candidateBufferPtrArrayBase, - fastCandidateArray, - fastCandidateTotalCount, - inputPicturePtr, - inputOriginIndex, - inputCbOriginIndex, + maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); + + ProductPerformFastLoop( + pictureControlSetPtr, + lcuPtr, + contextPtr, + candidateBufferPtrArrayBase, + fastCandidateArray, + fastCandidateTotalCount, + inputPicturePtr, + inputOriginIndex, + inputCbOriginIndex, inputCbOriginIndex, cuPtr, - cuOriginIndex, - cuChromaOriginIndex, - maxBuffers, - &secondFastCostSearchCandidateTotalCount); + cuOriginIndex, + cuChromaOriginIndex, + maxBuffers, + &secondFastCostSearchCandidateTotalCount); - // Make sure bufferTotalCount is not larger than the number of fast modes - bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); + // Make sure bufferTotalCount is not larger than the number of fast modes + bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); - // PreModeDecision - // -Input is the buffers - // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + // PreModeDecision + // -Input is the buffers + // -Output is list of buffers for full reconstruction + EB_U8 disableMergeIndex = 0; PreModeDecision( @@ -4905,7 +4905,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -4920,19 +4920,19 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( cuChromaOriginIndex, MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process - // Full Mode Decision (choose the best mode) - candidateIndex = ProductFullModeDecision( + // Full Mode Decision (choose the best mode) + candidateIndex = ProductFullModeDecision( contextPtr, - cuPtr, + cuPtr, contextPtr->cuStats->size, - candidateBufferPtrArray, - fullCandidateTotalCount, - contextPtr->bestCandidateIndexArray, - &bestIntraMode); + candidateBufferPtrArray, + fullCandidateTotalCount, + contextPtr->bestCandidateIndexArray, + &bestIntraMode); - // Set Candidate Buffer to the selected mode - // If Intra 4x4 is selected then candidateBuffer for depth 3 is not going to get used - // No MD-Recon: iTransform Loop + Recon, and no lumaReconSampleNeighborArray update + // Set Candidate Buffer to the selected mode + // If Intra 4x4 is selected then candidateBuffer for depth 3 is not going to get used + // No MD-Recon: iTransform Loop + Recon, and no lumaReconSampleNeighborArray update if (lcuPtr->intra4x4SearchMethod == INTRA4x4_INLINE_SEARCH) { @@ -4952,7 +4952,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } - candidateBuffer = candidateBufferPtrArray[candidateIndex]; + candidateBuffer = candidateBufferPtrArray[candidateIndex]; bestCandidateBuffers[contextPtr->cuStats->depth] = candidateBuffer; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; @@ -4965,7 +4965,7 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) { contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; @@ -4975,9 +4975,9 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } - EB_U8 parentLeafIndex; + EB_U8 parentLeafIndex; - EB_BOOL exitPartition = EB_FALSE; + EB_BOOL exitPartition = EB_FALSE; contextPtr->mdLocalCuUnit[leafIndex].mdcArrayIndex = (EB_U8)cuIdx; CheckHighCostPartition( @@ -4989,26 +4989,26 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( enableExitPartitioning, &exitPartition); - if (exitPartition) - { - //Reset the CU-Loop to the parent CU. - cuStatsPtr = GetCodedUnitStats(parentLeafIndex); - cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; - cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; - cuPtr->splitFlag = EB_FALSE; - - lastCuIndex = ExitInterDepthDecision( - contextPtr, - parentLeafIndex, - lcuPtr, - lcuAddr, - lcuOriginX, - lcuOriginY, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - pictureControlSetPtr); - - } + if (exitPartition) + { + //Reset the CU-Loop to the parent CU. + cuStatsPtr = GetCodedUnitStats(parentLeafIndex); + cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; + cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; + cuPtr->splitFlag = EB_FALSE; + + lastCuIndex = ExitInterDepthDecision( + contextPtr, + parentLeafIndex, + lcuPtr, + lcuAddr, + lcuOriginX, + lcuOriginY, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + pictureControlSetPtr); + + } else { PerformInverseTransformRecon( @@ -5034,83 +5034,83 @@ EB_EXTERN EB_ERRORTYPE ModeDecisionLcu( } - if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) - { - // Update the CU Stats - contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); - contextPtr->cuOriginX = lcuOriginX + contextPtr->cuStats->originX; - contextPtr->cuOriginY = lcuOriginY + contextPtr->cuStats->originY; + if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) + { + // Update the CU Stats + contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); + contextPtr->cuOriginX = lcuOriginX + contextPtr->cuStats->originX; + contextPtr->cuOriginY = lcuOriginY + contextPtr->cuStats->originY; - // Set the MvUnit - contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; - contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; - contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; + // Set the MvUnit + contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; + contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; + contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; - // Set the candidate buffer - contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; - candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; + // Set the candidate buffer + contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; + candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; if (contextPtr->coeffCabacUpdate) EB_MEMCPY(&(contextPtr->latestValidCoeffCtxModel), &(candidateBuffer->candBuffCoeffCtxModel), sizeof(CoeffCtxtMdl_t)); - // Update Neighbor Arrays - { - EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; - EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; - EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; - - ModeDecisionUpdateNeighborArrays( - contextPtr->leafDepthNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->intraLumaModeNeighborArray, - contextPtr->mvNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - candidateBuffer->reconPtr, + // Update Neighbor Arrays + { + EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; + EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; + EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; + + ModeDecisionUpdateNeighborArrays( + contextPtr->leafDepthNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->intraLumaModeNeighborArray, + contextPtr->mvNeighborArray, + contextPtr->skipFlagNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + candidateBuffer->reconPtr, MAX_LCU_SIZE, contextPtr->intraMdOpenLoopFlag, (cuPtr->predictionModeFlag == INTRA_MODE && contextPtr->cuStats->size == MIN_CU_SIZE && cuPtr->predictionUnitArray->intraLumaMode == EB_INTRA_MODE_4x4), (EB_U8*)&contextPtr->cuStats->depth, - &predictionModeFlag, - &intraLumaMode, - &contextPtr->mvUnit, - &skipFlag, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuStats->size, + &predictionModeFlag, + &intraLumaMode, + &contextPtr->mvUnit, + &skipFlag, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - } - - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); - } - - } - - if (cuPtr->splitFlag == EB_TRUE){ - cuIdx++; - } - else if ( lcuHeight < MAX_LCU_SIZE) { - cuIdx++; - } - else{ - cuIdx += CalculateNextCuIndex( - leafDataArray, - cuIdx, - leafCount, + } + + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); + } + + } + + if (cuPtr->splitFlag == EB_TRUE){ + cuIdx++; + } + else if ( lcuHeight < MAX_LCU_SIZE) { + cuIdx++; + } + else{ + cuIdx += CalculateNextCuIndex( + leafDataArray, + cuIdx, + leafCount, cuStatsPtr->depth); } - } while (cuIdx < leafCount);// End of CU loop - return return_error; + } while (cuIdx < leafCount);// End of CU loop + return return_error; } void ConstructPillarCuArray( @@ -5132,19 +5132,19 @@ void ConstructPillarCuArray( splitFlag = EB_TRUE; cuPtr->splitFlag = EB_TRUE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; if (lcuParamPtr->rasterScanCuValidity[MD_SCAN_TO_RASTER_SCAN[cuIndex]]) { if (cuStatsPtr->depth == 0) { splitFlag = EB_TRUE; - cuPtr->splitFlag = EB_TRUE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; } else if (cuStatsPtr->depth == 1 && contextPtr->depthRefinment < 2 && pictureControlSetPtr->ParentPcsPtr->complexLcuArray[lcuPtr->index] != LCU_COMPLEXITY_STATUS_2) { splitFlag = EB_TRUE; - cuPtr->splitFlag = EB_TRUE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_TRUE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; contextPtr->pillarCuArray.leafDataArray[contextPtr->pillarCuArray.leafCount] = cuIndex; contextPtr->pillarCuArray.leafCount++; @@ -5152,16 +5152,16 @@ void ConstructPillarCuArray( else if (cuStatsPtr->depth == 2) { splitFlag = EB_FALSE; - cuPtr->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; contextPtr->pillarCuArray.leafDataArray[contextPtr->pillarCuArray.leafCount] = cuIndex; contextPtr->pillarCuArray.leafCount++; } else if (cuStatsPtr->depth == 3) { splitFlag = EB_FALSE; - cuPtr->splitFlag = EB_FALSE; - contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; + cuPtr->splitFlag = EB_FALSE; + contextPtr->mdLocalCuUnit[cuIndex].testedCuFlag = EB_FALSE; contextPtr->pillarCuArray.leafDataArray[contextPtr->pillarCuArray.leafCount] = cuIndex; contextPtr->pillarCuArray.leafCount++; @@ -5179,43 +5179,43 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( PictureControlSet_t *pictureControlSetPtr, LcuParams_t *lcuParamPtr, LargestCodingUnit_t *lcuPtr, - EB_U16 lcuAddr, + EB_U16 lcuAddr, ModeDecisionContext_t *contextPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - // CU - EB_U32 cuIdx; + // CU + EB_U32 cuIdx; - // Input + // Input EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->chromaDownSamplePicturePtr; EB_U16 tileIdx = lcuPtr->lcuEdgeInfoPtr->tileIndexInRaster; - // Mode Decision Candidate Buffers - EB_U32 bufferTotalCount; - ModeDecisionCandidateBuffer_t *candidateBuffer; - ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; + // Mode Decision Candidate Buffers + EB_U32 bufferTotalCount; + ModeDecisionCandidateBuffer_t *candidateBuffer; + ModeDecisionCandidateBuffer_t *bestCandidateBuffers[EB_MAX_LCU_DEPTH]; - // Mode Decision Search Candidates - EB_U8 candidateIndex; - EB_U32 fastCandidateTotalCount; - EB_U32 fullCandidateTotalCount; + // Mode Decision Search Candidates + EB_U8 candidateIndex; + EB_U32 fastCandidateTotalCount; + EB_U32 fullCandidateTotalCount; - EB_U32 secondFastCostSearchCandidateTotalCount; + EB_U32 secondFastCostSearchCandidateTotalCount; - // CTB merge - EB_U32 lastCuIndex; + // CTB merge + EB_U32 lastCuIndex; - // Pre Intra Search + // Pre Intra Search - ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; - ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; + ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; - EB_U32 maxBuffers; + EB_U32 maxBuffers; // enableExitPartitioning derivation @ BdpPillar() @@ -5230,10 +5230,10 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->cu8x8RefinementOnFlag = EB_FALSE; // Keep track of the LCU Ptr - contextPtr->lcuPtr = lcuPtr; + contextPtr->lcuPtr = lcuPtr; - contextPtr->groupOf8x8BlocksCount = 0; - contextPtr->groupOf16x16BlocksCount = 0; + contextPtr->groupOf8x8BlocksCount = 0; + contextPtr->groupOf16x16BlocksCount = 0; // Mode Decision Neighbor Arrays contextPtr->intraLumaModeNeighborArray = pictureControlSetPtr->mdIntraLumaModeNeighborArray[PILLAR_NEIGHBOR_ARRAY_INDEX][tileIdx]; @@ -5248,25 +5248,25 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->edgeBlockNumFlag = (EB_BOOL)pictureControlSetPtr->ParentPcsPtr->edgeResultsPtr[lcuAddr].edgeBlockNum; // First CU Loop - cuIdx = 0; - do - { - // Assign CU data + cuIdx = 0; + do + { + // Assign CU data const EB_U8 leafIndex = contextPtr->pillarCuArray.leafDataArray[cuIdx]; - CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; + CodingUnit_t * cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[leafIndex]; - const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); + const CodedUnitStats_t *cuStatsPtr = contextPtr->cuStats = GetCodedUnitStats(leafIndex); contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuOriginX = lcuParamPtr->originX + cuStatsPtr->originX; - contextPtr->cuOriginY = lcuParamPtr->originY + cuStatsPtr->originY; - const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); - const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); - const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); - const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; + contextPtr->cuOriginY = lcuParamPtr->originY + cuStatsPtr->originY; + const EB_U32 inputOriginIndex = (contextPtr->cuOriginY + inputPicturePtr->originY) * inputPicturePtr->strideY + (contextPtr->cuOriginX + inputPicturePtr->originX); + const EB_U32 inputCbOriginIndex = ((contextPtr->cuOriginY>>1) + (inputPicturePtr->originY >> 1)) * inputPicturePtr->strideCb + ((contextPtr->cuOriginX >>1) + (inputPicturePtr->originX >> 1)); + const EB_U32 cuOriginIndex = ((contextPtr->cuOriginY & 63) * 64) + (contextPtr->cuOriginX & 63); + const EB_U32 cuChromaOriginIndex = (((contextPtr->cuOriginY & 63) * 32) + (contextPtr->cuOriginX & 63)) >> 1; //need these for L7 Chroma: TBCleaned. contextPtr->cuDepth = cuStatsPtr->depth; @@ -5275,32 +5275,32 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->lcuChromaSize = contextPtr->lcuSize >> 1; contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; - contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; - contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; - cuPtr->leafIndex = leafIndex; + contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; + contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; + cuPtr->leafIndex = leafIndex; cuPtr->qp = contextPtr->qp; candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); - // Initialize Fast Loop - EbHevcProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray - contextPtr, + // Initialize Fast Loop + EbHevcProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray + contextPtr, contextPtr->intraLumaModeNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->leafDepthNeighborArray); + contextPtr->skipFlagNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->leafDepthNeighborArray); - // Perform MPM search - if (contextPtr->mpmSearch) { + // Perform MPM search + if (contextPtr->mpmSearch) { DeriveMpmModes( // HT done contextPtr, cuPtr); - } + } SetNmm( contextPtr, @@ -5314,47 +5314,47 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->conformantMvMergeTable = EB_TRUE; - ProductGenerateAmvpMergeInterIntraMdCandidatesCU( - lcuPtr, - contextPtr, - leafIndex, - lcuAddr, - &bufferTotalCount, - &fastCandidateTotalCount, - (void*)contextPtr->interPredictionContext, - pictureControlSetPtr, - contextPtr->mpmSearch, - contextPtr->mpmSearchCandidate, - contextPtr->mostProbableModeArray); + ProductGenerateAmvpMergeInterIntraMdCandidatesCU( + lcuPtr, + contextPtr, + leafIndex, + lcuAddr, + &bufferTotalCount, + &fastCandidateTotalCount, + (void*)contextPtr->interPredictionContext, + pictureControlSetPtr, + contextPtr->mpmSearch, + contextPtr->mpmSearchCandidate, + contextPtr->mostProbableModeArray); //if we want to recon N candidate, we would need N+1 buffers - maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); - - ProductPerformFastLoop( - pictureControlSetPtr, - lcuPtr, - contextPtr, - candidateBufferPtrArrayBase, - fastCandidateArray, - fastCandidateTotalCount, - inputPicturePtr, - inputOriginIndex, - inputCbOriginIndex, + maxBuffers = MIN((bufferTotalCount + 1), contextPtr->bufferDepthIndexWidth[cuStatsPtr->depth]); + + ProductPerformFastLoop( + pictureControlSetPtr, + lcuPtr, + contextPtr, + candidateBufferPtrArrayBase, + fastCandidateArray, + fastCandidateTotalCount, + inputPicturePtr, + inputOriginIndex, + inputCbOriginIndex, inputCbOriginIndex, cuPtr, - cuOriginIndex, - cuChromaOriginIndex, - maxBuffers, - &secondFastCostSearchCandidateTotalCount); + cuOriginIndex, + cuChromaOriginIndex, + maxBuffers, + &secondFastCostSearchCandidateTotalCount); - // Make sure bufferTotalCount is not larger than the number of fast modes - bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); + // Make sure bufferTotalCount is not larger than the number of fast modes + bufferTotalCount = MIN(secondFastCostSearchCandidateTotalCount, bufferTotalCount); - // PreModeDecision - // -Input is the buffers - // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + // PreModeDecision + // -Input is the buffers + // -Output is list of buffers for full reconstruction + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -5362,10 +5362,10 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only - PerformFullLoop( + PerformFullLoop( pictureControlSetPtr, lcuPtr, cuPtr, @@ -5377,17 +5377,17 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( cuChromaOriginIndex, MIN(fullCandidateTotalCount, bufferTotalCount)); // fullCandidateTotalCount to number of buffers to process - // Full Mode Decision (choose the best mode) - candidateIndex = ProductFullModeDecision( + // Full Mode Decision (choose the best mode) + candidateIndex = ProductFullModeDecision( contextPtr, - cuPtr, + cuPtr, contextPtr->cuStats->size, - candidateBufferPtrArray, - fullCandidateTotalCount, - contextPtr->bestCandidateIndexArray, - &bestIntraMode); + candidateBufferPtrArray, + fullCandidateTotalCount, + contextPtr->bestCandidateIndexArray, + &bestIntraMode); - candidateBuffer = candidateBufferPtrArray[candidateIndex]; + candidateBuffer = candidateBufferPtrArray[candidateIndex]; bestCandidateBuffers[contextPtr->cuStats->depth] = candidateBuffer; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; @@ -5409,11 +5409,11 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; } - EB_U8 parentLeafIndex; - EB_BOOL exitPartition = EB_FALSE; - contextPtr->mdLocalCuUnit[leafIndex].mdcArrayIndex = (EB_U8)cuIdx; + EB_U8 parentLeafIndex; + EB_BOOL exitPartition = EB_FALSE; + contextPtr->mdLocalCuUnit[leafIndex].mdcArrayIndex = (EB_U8)cuIdx; - CheckHighCostPartition( + CheckHighCostPartition( sequenceControlSetPtr, contextPtr, lcuPtr, @@ -5422,123 +5422,123 @@ EB_EXTERN EB_ERRORTYPE BdpPillar( enableExitPartitioning, &exitPartition); - if (exitPartition) - { - //Reset the CU-Loop to the parent CU. - cuStatsPtr = GetCodedUnitStats(parentLeafIndex); - cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; - cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; - cuPtr->splitFlag = EB_FALSE; - - lastCuIndex = ExitInterDepthDecision( - contextPtr, - parentLeafIndex, - lcuPtr, - lcuAddr, - lcuParamPtr->originX, - lcuParamPtr->originY, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - pictureControlSetPtr); - - } - else{ + if (exitPartition) + { + //Reset the CU-Loop to the parent CU. + cuStatsPtr = GetCodedUnitStats(parentLeafIndex); + cuPtr = contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[parentLeafIndex]; + cuIdx = contextPtr->mdLocalCuUnit[parentLeafIndex].mdcArrayIndex; + cuPtr->splitFlag = EB_FALSE; + + lastCuIndex = ExitInterDepthDecision( + contextPtr, + parentLeafIndex, + lcuPtr, + lcuAddr, + lcuParamPtr->originX, + lcuParamPtr->originY, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + pictureControlSetPtr); + + } + else{ PerformInverseTransformRecon( contextPtr, candidateBuffer, cuPtr, contextPtr->cuStats); - // Inter Depth Decision - lastCuIndex = PillarInterDepthDecision( - contextPtr, - leafIndex, - lcuPtr, - lcuParamPtr->originX, - lcuParamPtr->originY, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - pictureControlSetPtr); - } - - if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) - { - // Update the CU Stats - contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); - contextPtr->cuOriginX = lcuParamPtr->originX + contextPtr->cuStats->originX; - contextPtr->cuOriginY = lcuParamPtr->originY + contextPtr->cuStats->originY; - - // Set the MvUnit - contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; - contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; - contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; - - // Set the candidate buffer - contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; - candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; - - // Update Neighbor Arrays - { - EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; - EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; - EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; - - ModeDecisionUpdateNeighborArrays( - contextPtr->leafDepthNeighborArray, - contextPtr->modeTypeNeighborArray, - contextPtr->intraLumaModeNeighborArray, - contextPtr->mvNeighborArray, - contextPtr->skipFlagNeighborArray, - contextPtr->lumaReconNeighborArray, - contextPtr->cbReconNeighborArray, - contextPtr->crReconNeighborArray, - candidateBuffer->reconPtr, + // Inter Depth Decision + lastCuIndex = PillarInterDepthDecision( + contextPtr, + leafIndex, + lcuPtr, + lcuParamPtr->originX, + lcuParamPtr->originY, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + pictureControlSetPtr); + } + + if (lcuPtr->codedLeafArrayPtr[lastCuIndex]->splitFlag == EB_FALSE) + { + // Update the CU Stats + contextPtr->cuStats = GetCodedUnitStats(lastCuIndex); + contextPtr->cuOriginX = lcuParamPtr->originX + contextPtr->cuStats->originX; + contextPtr->cuOriginY = lcuParamPtr->originY + contextPtr->cuStats->originY; + + // Set the MvUnit + contextPtr->mvUnit.predDirection = (EB_U8)(&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->interPredDirectionIndex; + contextPtr->mvUnit.mv[REF_LIST_0].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_0].mvUnion; + contextPtr->mvUnit.mv[REF_LIST_1].mvUnion = (&lcuPtr->codedLeafArrayPtr[lastCuIndex]->predictionUnitArray[0])->mv[REF_LIST_1].mvUnion; + + // Set the candidate buffer + contextPtr->cuPtr = lcuPtr->codedLeafArrayPtr[lastCuIndex]; + candidateBuffer = bestCandidateBuffers[contextPtr->cuStats->depth]; + + // Update Neighbor Arrays + { + EB_U8 predictionModeFlag = (EB_U8)contextPtr->cuPtr->predictionModeFlag; + EB_U8 intraLumaMode = (EB_U8)(&contextPtr->cuPtr->predictionUnitArray[0])->intraLumaMode; + EB_U8 skipFlag = (EB_U8)contextPtr->cuPtr->skipFlag; + + ModeDecisionUpdateNeighborArrays( + contextPtr->leafDepthNeighborArray, + contextPtr->modeTypeNeighborArray, + contextPtr->intraLumaModeNeighborArray, + contextPtr->mvNeighborArray, + contextPtr->skipFlagNeighborArray, + contextPtr->lumaReconNeighborArray, + contextPtr->cbReconNeighborArray, + contextPtr->crReconNeighborArray, + candidateBuffer->reconPtr, MAX_LCU_SIZE, contextPtr->intraMdOpenLoopFlag, EB_FALSE, - (EB_U8*)&contextPtr->cuStats->depth, - &predictionModeFlag, - &intraLumaMode, - &contextPtr->mvUnit, - &skipFlag, - contextPtr->cuOriginX, - contextPtr->cuOriginY, - contextPtr->cuStats->size, + (EB_U8*)&contextPtr->cuStats->depth, + &predictionModeFlag, + &intraLumaMode, + &contextPtr->mvUnit, + &skipFlag, + contextPtr->cuOriginX, + contextPtr->cuOriginY, + contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - } + } - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->pillarReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->pillarReconBuffer, + contextPtr, + lcuPtr); + } + } - if (exitPartition == EB_FALSE){ - cuIdx++; - } - else{ - cuIdx += BdpCalculateNextCuIndex( - contextPtr->pillarCuArray.leafDataArray, - cuIdx, - contextPtr->pillarCuArray.leafCount, - cuStatsPtr->depth); - } + if (exitPartition == EB_FALSE){ + cuIdx++; + } + else{ + cuIdx += BdpCalculateNextCuIndex( + contextPtr->pillarCuArray.leafDataArray, + cuIdx, + contextPtr->pillarCuArray.leafCount, + cuStatsPtr->depth); + } - } while (cuIdx < contextPtr->pillarCuArray.leafCount); + } while (cuIdx < contextPtr->pillarCuArray.leafCount); - return return_error; + return return_error; } void SplitParentCu( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, LargestCodingUnit_t *lcuPtr, EB_U8 parentLeafIndex, EB_U64 totalChildCost, @@ -5554,13 +5554,13 @@ void SplitParentCu( // Copy the Mode & Depth of the Top-Left N+1 block to the N block for the SplitContext calculation // This needs to be done in the case that the N block was initially not calculated. - contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborMode; - contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborDepth; - contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborMode; - contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborDepth; + contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborMode; + contextPtr->mdLocalCuUnit[parentLeafIndex].leftNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].leftNeighborDepth; + contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborMode = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborMode; + contextPtr->mdLocalCuUnit[parentLeafIndex].topNeighborDepth = contextPtr->mdLocalCuUnit[parentLeafIndex + 1].topNeighborDepth; // Compute depth N cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, lcuPtr->codedLeafArrayPtr[parentLeafIndex], 0, &depthNRate, @@ -5568,10 +5568,10 @@ void SplitParentCu( mdRateEstimationPtr, 3); //tbMaxDepth); - *depthNCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; + *depthNCost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depthNRate; // Compute depth N+1 cost - SplitFlagRate( - contextPtr, + SplitFlagRate( + contextPtr, lcuPtr->codedLeafArrayPtr[parentLeafIndex], 1, &depthNPlusOneRate, @@ -5610,7 +5610,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; EB_U32 maxBuffers; @@ -5654,9 +5654,9 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); // Initialize Fast Loop EbHevcProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray @@ -5688,7 +5688,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -5724,7 +5724,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( // PreModeDecision // -Input is the buffers // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -5732,7 +5732,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -5769,7 +5769,7 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) { contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; @@ -5786,10 +5786,10 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( EB_U64 depthNCost = 0; EB_U64 depthNPlusOneCost = 0; - EB_U64 totalChildCost = contextPtr->mdLocalCuUnit[1].cost + contextPtr->mdLocalCuUnit[22].cost + contextPtr->mdLocalCuUnit[43].cost + contextPtr->mdLocalCuUnit[64].cost; + EB_U64 totalChildCost = contextPtr->mdLocalCuUnit[1].cost + contextPtr->mdLocalCuUnit[22].cost + contextPtr->mdLocalCuUnit[43].cost + contextPtr->mdLocalCuUnit[64].cost; - SplitParentCu( - contextPtr, + SplitParentCu( + contextPtr, lcuPtr, 0, totalChildCost, @@ -5844,15 +5844,15 @@ EB_EXTERN EB_ERRORTYPE Bdp64x64vs32x32RefinementProcess( contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->pillarReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->pillarReconBuffer, + contextPtr, + lcuPtr); + } + } return return_error; @@ -5890,13 +5890,13 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; EB_U32 maxBuffers; - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuPtr->index]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuPtr->index]; // enableExitPartitioning derivation @ Bdp16x16vs8x8RefinementProcess() EB_BOOL enableExitPartitioning = (contextPtr->enableExitPartitioning && lcuParams->isCompleteLcu) ? EB_TRUE : EB_FALSE; @@ -5924,7 +5924,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( EB_U8 childDepthOffset = DepthOffset[GetCodedUnitStats(parentLeafIndex)->depth + 1]; EB_BOOL cu16x16RefinementFlag; - if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LIGHT_BDP_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_LIGHT_BDP_DEPTH_MODE))){ + if (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LIGHT_BDP_DEPTH_MODE || (pictureControlSetPtr->ParentPcsPtr->depthMode == PICT_LCU_SWITCH_DEPTH_MODE && (pictureControlSetPtr->ParentPcsPtr->lcuMdModeArray[lcuAddr] == LCU_LIGHT_BDP_DEPTH_MODE))){ cu16x16RefinementFlag = GetCodedUnitStats(parentLeafIndex)->size == 16 && (lcuPtr->codedLeafArrayPtr[parentLeafIndex]->predictionModeFlag == INTRA_MODE || contextPtr->depthRefinment > 0); @@ -5949,22 +5949,22 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( leafIndexArray[3] = parentLeafIndex + 1 + childDepthOffset * 3; - EB_BOOL exitPartition = EB_FALSE; - EB_U64 cu16x16Cost = MAX_CU_COST; - if (enableExitPartitioning) - { - EB_U64 depth2Rate; - SplitFlagRate( - contextPtr, - lcuPtr->codedLeafArrayPtr[parentLeafIndex], - 0, - &depth2Rate, - contextPtr->fullLambda, - contextPtr->mdRateEstimationPtr, - 3); //tbMaxDepth); //CHKN THIS SHOULD BE 4 - keep 3 to be consistent with BDP usage + EB_BOOL exitPartition = EB_FALSE; + EB_U64 cu16x16Cost = MAX_CU_COST; + if (enableExitPartitioning) + { + EB_U64 depth2Rate; + SplitFlagRate( + contextPtr, + lcuPtr->codedLeafArrayPtr[parentLeafIndex], + 0, + &depth2Rate, + contextPtr->fullLambda, + contextPtr->mdRateEstimationPtr, + 3); //tbMaxDepth); //CHKN THIS SHOULD BE 4 - keep 3 to be consistent with BDP usage - cu16x16Cost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depth2Rate; - } + cu16x16Cost = contextPtr->mdLocalCuUnit[parentLeafIndex].cost + depth2Rate; + } for (leafCount = 0; leafCount < totalLeafCount; leafCount++) { @@ -5992,15 +5992,15 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; - contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; + contextPtr->mdLocalCuUnit[leafIndex].testedCuFlag = EB_TRUE; cuPtr->leafIndex = leafIndex; cuPtr->qp = contextPtr->qp; candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); - // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + // Set PF Mode - should be done per TU (and not per CU) to avoid the correction + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); // Initialize Fast Loop EbHevcProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray @@ -6031,7 +6031,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -6068,7 +6068,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( // PreModeDecision // -Input is the buffers // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -6076,7 +6076,7 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -6113,35 +6113,35 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) - { - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; - } - - PerformInverseTransformRecon( - contextPtr, - candidateBuffer, - cuPtr, - contextPtr->cuStats); + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + { + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; + } + + PerformInverseTransformRecon( + contextPtr, + candidateBuffer, + cuPtr, + contextPtr->cuStats); if (leafCount < 4) { - totalChildCost += contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost; + totalChildCost += contextPtr->mdLocalCuUnit[cuPtr->leafIndex].cost; neighborLeafIndex = leafIndex; } - if (enableExitPartitioning){ - if (leafCount < 3 && totalChildCost > cu16x16Cost && lcuParams->isCompleteLcu) - { - exitPartition = EB_TRUE; - neighborLeafIndex = parentLeafIndex; - } - } + if (enableExitPartitioning){ + if (leafCount < 3 && totalChildCost > cu16x16Cost && lcuParams->isCompleteLcu) + { + exitPartition = EB_TRUE; + neighborLeafIndex = parentLeafIndex; + } + } if (leafCount == (totalLeafCount - 1)){ @@ -6149,10 +6149,10 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( EB_U64 depthNCost = 0; EB_U64 depthNPlusOneCost = 0; - parentLeafIndex = (parentLeafIndex == (CU_MAX_COUNT - 1)) ? CU_MAX_COUNT - 5 : parentLeafIndex; + parentLeafIndex = (parentLeafIndex == (CU_MAX_COUNT - 1)) ? CU_MAX_COUNT - 5 : parentLeafIndex; - SplitParentCu( - contextPtr, + SplitParentCu( + contextPtr, lcuPtr, parentLeafIndex, totalChildCost, @@ -6226,20 +6226,20 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( contextPtr->cuStats->size, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - reconBuffer, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + reconBuffer, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); + } + } - if (exitPartition == EB_TRUE){ - break; - } + if (exitPartition == EB_TRUE){ + break; + } } @@ -6291,15 +6291,15 @@ EB_EXTERN EB_ERRORTYPE Bdp16x16vs8x8RefinementProcess( tileIdx, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { - UpdateMdReconBuffer( - contextPtr->pillarReconBuffer, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); - } - } + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { + UpdateMdReconBuffer( + contextPtr->pillarReconBuffer, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); + } + } parentLeafIndex += parentDepthOffset; @@ -6340,7 +6340,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( ModeDecisionCandidate_t *fastCandidateArray = contextPtr->fastCandidateArray; ModeDecisionCandidateBuffer_t **candidateBufferPtrArrayBase = contextPtr->candidateBufferPtrArray; - EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; + EB_U32 bestIntraMode = EB_INTRA_MODE_INVALID; ModeDecisionCandidateBuffer_t **candidateBufferPtrArray; EB_U32 maxBuffers; @@ -6388,15 +6388,15 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( contextPtr->lcuChromaSize = contextPtr->lcuSize >> 1; contextPtr->cuSizeLog2 = cuStatsPtr->sizeLog2; contextPtr->cuChromaOriginX = contextPtr->cuOriginX >> 1; - contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; + contextPtr->cuChromaOriginY = contextPtr->cuOriginY >> 1; cuPtr->leafIndex = leafIndex; cuPtr->qp = contextPtr->qp; candidateBufferPtrArray = &(candidateBufferPtrArrayBase[contextPtr->bufferDepthIndexStart[cuStatsPtr->depth]]); - // Set PF Mode - should be done per TU (and not per CU) to avoid the correction - DerivePartialFrequencyN2Flag( - pictureControlSetPtr, - contextPtr); + // Set PF Mode - should be done per TU (and not per CU) to avoid the correction + DerivePartialFrequencyN2Flag( + pictureControlSetPtr, + contextPtr); // Initialize Fast Loop EbHevcProductCodingLoopInitFastLoop( // HT to be rechecked especially for fullCostArray @@ -6413,8 +6413,8 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( cuPtr); } - SetNmm( - contextPtr, + SetNmm( + contextPtr, BDP_MVMERGE_STAGE); SetNfl( @@ -6428,7 +6428,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( ProductGenerateAmvpMergeInterIntraMdCandidatesCU( lcuPtr, contextPtr, - leafIndex, + leafIndex, lcuAddr, &bufferTotalCount, &fastCandidateTotalCount, @@ -6465,7 +6465,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( // PreModeDecision // -Input is the buffers // -Output is list of buffers for full reconstruction - EB_U8 disableMergeIndex = 0; + EB_U8 disableMergeIndex = 0; PreModeDecision( cuPtr, @@ -6473,7 +6473,7 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( candidateBufferPtrArray, &fullCandidateTotalCount, contextPtr->bestCandidateIndexArray, - &disableMergeIndex, + &disableMergeIndex, (EB_BOOL)(secondFastCostSearchCandidateTotalCount == bufferTotalCount)); // The fast loop bug fix is now added to 4K only PerformFullLoop( @@ -6512,14 +6512,14 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[2] = candidateBuffer->yCountNonZeroCoeffs[2]; contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCountNonZeroCoeffs[3] = candidateBuffer->yCountNonZeroCoeffs[3]; - if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) - { - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; - contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; - } + if (lcuPtr->chromaEncodeMode == CHROMA_MODE_BEST && candidateBuffer->candidatePtr->type == INTER_MODE && candidateBuffer->candidatePtr->mergeFlag == EB_TRUE) + { + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCoeffBits = candidateBuffer->yCoeffBits; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_RESIDUAL] = candidateBuffer->yFullDistortion[DIST_CALC_RESIDUAL]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yFullDistortion[DIST_CALC_PREDICTION] = candidateBuffer->yFullDistortion[DIST_CALC_PREDICTION]; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].yCbf = candidateBuffer->candidatePtr->yCbf ; + contextPtr->mdEpPipeLcu[cuPtr->leafIndex].fastLumaRate = candidateBuffer->candidatePtr->fastLumaRate; + } PerformInverseTransformRecon( contextPtr, @@ -6570,18 +6570,18 @@ EB_EXTERN EB_ERRORTYPE BdpMvMergePass( tileIdx, contextPtr->useChromaInformationInFullLoop ? EB_TRUE : EB_FALSE); - if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) - { + if (contextPtr->intraMdOpenLoopFlag == EB_FALSE) + { - UpdateMdReconBuffer( - candidateBuffer->reconPtr, - contextPtr->mdReconBuffer, - contextPtr, - lcuPtr); + UpdateMdReconBuffer( + candidateBuffer->reconPtr, + contextPtr->mdReconBuffer, + contextPtr, + lcuPtr); - } + } - } + } else { // Update the CU Stats diff --git a/Source/Lib/Codec/EbRateControlProcess.c b/Source/Lib/Codec/EbRateControlProcess.c index 6d0f89f40..0d3488327 100644 --- a/Source/Lib/Codec/EbRateControlProcess.c +++ b/Source/Lib/Codec/EbRateControlProcess.c @@ -157,11 +157,11 @@ static void RateControlLayerReset( rateControlLayerPtr->previousFrameQuantizedCoeffBitActual = 1000; rateControlLayerPtr->previousFrameSadMe = 10000000; pictureControlSetPtr->ParentPcsPtr->targetBits = 10000; - rateControlLayerPtr->previousFrameQp = pictureControlSetPtr->pictureQp; + rateControlLayerPtr->previousFrameQp = pictureControlSetPtr->pictureQp; rateControlLayerPtr->deltaQpFraction = 0; - rateControlLayerPtr->previousFrameAverageQp = pictureControlSetPtr->pictureQp; - rateControlLayerPtr->previousCalculatedFrameQp = pictureControlSetPtr->pictureQp; - rateControlLayerPtr->calculatedFrameQp = pictureControlSetPtr->pictureQp; + rateControlLayerPtr->previousFrameAverageQp = pictureControlSetPtr->pictureQp; + rateControlLayerPtr->previousCalculatedFrameQp = pictureControlSetPtr->pictureQp; + rateControlLayerPtr->calculatedFrameQp = pictureControlSetPtr->pictureQp; rateControlLayerPtr->criticalStates = 0; } else{ @@ -186,7 +186,7 @@ static void RateControlLayerResetPart2( rateControlLayerPtr->previousFrameAverageQp = rateControlLayerPtr->maxQp; rateControlLayerPtr->previousCalculatedFrameQp = rateControlLayerPtr->maxQp; rateControlLayerPtr->calculatedFrameQp = rateControlLayerPtr->maxQp; - + } static EB_ERRORTYPE HighLevelRateControlContextCtor( @@ -369,9 +369,9 @@ static void HighLevelRcInputPictureMode2( #if RC_UPDATE_TARGET_RATE EB_U32 selectedOrgRefQp; #endif - EB_U32 previousSelectedRefQp = encodeContextPtr->previousSelectedRefQp; - EB_U64 maxCodedPoc = encodeContextPtr->maxCodedPoc; - EB_U32 maxCodedPocSelectedRefQp = encodeContextPtr->maxCodedPocSelectedRefQp; + EB_U32 previousSelectedRefQp = encodeContextPtr->previousSelectedRefQp; + EB_U64 maxCodedPoc = encodeContextPtr->maxCodedPoc; + EB_U32 maxCodedPocSelectedRefQp = encodeContextPtr->maxCodedPocSelectedRefQp; EB_U32 refQpIndex; @@ -389,9 +389,9 @@ static void HighLevelRcInputPictureMode2( EB_U64 bitConstraintPerSw= 0; - RateControlTables_t *rateControlTablesPtr; - EB_Bit_Number *sadBitsArrayPtr; - EB_Bit_Number *intraSadBitsArrayPtr; + RateControlTables_t *rateControlTablesPtr; + EB_Bit_Number *sadBitsArrayPtr; + EB_Bit_Number *intraSadBitsArrayPtr; EB_U32 predBitsRefQp; for (temporalLayerIndex = 0; temporalLayerIndex< EB_MAX_TEMPORAL_LAYERS; temporalLayerIndex++){ @@ -433,7 +433,7 @@ static void HighLevelRcInputPictureMode2( selectedRefQp = maxCodedPocSelectedRefQp; - // Update the QP for the sliding window based on the status of RC + // Update the QP for the sliding window based on the status of RC if ((contextPtr->extraBitsGen >(EB_S64)(contextPtr->virtualBufferSize << 3))){ selectedRefQp = (EB_U32)MAX((EB_S32)selectedRefQp -2, 0); } @@ -544,7 +544,7 @@ static void HighLevelRcInputPictureMode2( bitConstraintPerSw = highLevelRateControlPtr->bitConstraintPerSw * pictureControlSetPtr->framesInSw / (sequenceControlSetPtr->staticConfig.lookAheadDistance + 1); - // Update the target rate for the sliding window based on the status of RC + // Update the target rate for the sliding window based on the status of RC if ((contextPtr->extraBitsGen >(EB_S64)(contextPtr->virtualBufferSize * 10))){ bitConstraintPerSw = bitConstraintPerSw * 130 / 100; } @@ -962,7 +962,7 @@ static void FrameLevelRcInputPictureMode2( else{ pictureControlSetPtr->ParentPcsPtr->firstFrameInTemporalLayer = 0; } - if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { + if (pictureControlSetPtr->sliceType != EB_I_PICTURE) { if (rateControlLayerPtr->firstNonIntraFrame == 1){ rateControlLayerPtr->firstNonIntraFrame = 0; pictureControlSetPtr->ParentPcsPtr->firstNonIntraFrameInTemporalLayer = 1; @@ -984,7 +984,7 @@ static void FrameLevelRcInputPictureMode2( lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuPtr->originX >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaWidth - lcuPtr->originX; lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuPtr->originY >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaHeight - lcuPtr->originY; - // This is because of the tile boundry LCUs which do not have correct SAD from ME. + // This is because of the tile boundry LCUs which do not have correct SAD from ME. if ((lcuWidth == MAX_LCU_SIZE) && (lcuHeight == MAX_LCU_SIZE)){ // add the area of one LCU (64x64=4096) to the area of the tile areaInPixel += 4096; @@ -1019,7 +1019,7 @@ static void FrameLevelRcInputPictureMode2( rateControlParamPtr->lastPoc = MAX(rateControlParamPtr->firstPoc + pictureControlSetPtr->ParentPcsPtr->framesInSw - 1, rateControlParamPtr->firstPoc); rateControlParamPtr->lastGop = EB_TRUE; } - + if ((contextPtr->extraBits > (EB_S64)(contextPtr->virtualBufferSize >> 8)) || (contextPtr->extraBits < -(EB_S64)(contextPtr->virtualBufferSize >> 8))){ @@ -1096,7 +1096,7 @@ static void FrameLevelRcInputPictureMode2( pictureControlSetPtr->ParentPcsPtr->sadMe = 0; // Finding the QP of the Intra frame by using variance tables - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { EB_U32 selectedRefQp; if (sequenceControlSetPtr->staticConfig.lookAheadDistance == 0){ @@ -1155,7 +1155,7 @@ static void FrameLevelRcInputPictureMode2( lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuCodingOrder]; lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuPtr->originX >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaWidth - lcuPtr->originX; lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuPtr->originY >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaHeight - lcuPtr->originY; - // This is because of the tile boundry LCUs which do not have correct SAD from ME. + // This is because of the tile boundry LCUs which do not have correct SAD from ME. // ME doesn't know about Tile Boundries if ((lcuWidth == MAX_LCU_SIZE) && (lcuHeight == MAX_LCU_SIZE)){ numOfFullLcus++; @@ -1179,83 +1179,83 @@ static void FrameLevelRcInputPictureMode2( } if (!sequenceControlSetPtr->encodeContextPtr->rateControlTablesArrayUpdated) { - pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)selectedRefQp - (EB_S32)1, 0); + pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)selectedRefQp - (EB_S32)1, 0); rateControlLayerPtr->calculatedFrameQp = (EB_U8)MAX((EB_S32)selectedRefQp - (EB_S32)1, 0); - pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; + pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; } else{ - pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; + pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; rateControlLayerPtr->calculatedFrameQp = (EB_U8)selectedRefQp; - pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; - pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( + pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; + pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( (EB_U32)MAX((EB_S32)contextPtr->baseLayerFramesAvgQp - (EB_S32)3, 0), contextPtr->baseLayerFramesAvgQp, - pictureControlSetPtr->pictureQp); - pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( + pictureControlSetPtr->pictureQp); + pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( (EB_U32)MAX((EB_S32)contextPtr->baseLayerIntraFramesAvgQp - (EB_S32)5, 0), contextPtr->baseLayerIntraFramesAvgQp + 2, - pictureControlSetPtr->pictureQp); + pictureControlSetPtr->pictureQp); } } else{ selectedRefQp = pictureControlSetPtr->ParentPcsPtr->bestPredQp; - pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; - pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; + pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; + pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; if (rateControlParamPtr->firstPoc == 0){ - pictureControlSetPtr->pictureQp++; + pictureControlSetPtr->pictureQp++; } } // Update the QP based on the VB if (pictureControlSetPtr->ParentPcsPtr->endOfSequenceRegion){ if (rateControlParamPtr->virtualBufferLevel >= contextPtr->vbFillThreshold2 << 1){ - pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD2QPINCREASE + 2; + pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD2QPINCREASE + 2; } else if (rateControlParamPtr->virtualBufferLevel >= contextPtr->vbFillThreshold2){ - pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD2QPINCREASE; + pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD2QPINCREASE; } else if (rateControlParamPtr->virtualBufferLevel >= contextPtr->vbFillThreshold1 && rateControlParamPtr->virtualBufferLevel < contextPtr->vbFillThreshold2){ - pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD1QPINCREASE; + pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD1QPINCREASE; } if (rateControlParamPtr->virtualBufferLevel <= -(contextPtr->vbFillThreshold2 << 2)) - pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE - (EB_S32)2, 0); + pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE - (EB_S32)2, 0); else if (rateControlParamPtr->virtualBufferLevel <= -(contextPtr->vbFillThreshold2 << 1)) - pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE - (EB_S32)1, 0); + pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE - (EB_S32)1, 0); else if (rateControlParamPtr->virtualBufferLevel <= 0) - pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE, 0); + pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE, 0); } else{ if (rateControlParamPtr->virtualBufferLevel >= contextPtr->vbFillThreshold2){ - pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD2QPINCREASE; + pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + (EB_U8)THRESHOLD2QPINCREASE; } if (rateControlParamPtr->virtualBufferLevel <= -(contextPtr->vbFillThreshold2 << 2)) - pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp - (EB_U8)THRESHOLD2QPINCREASE - (EB_S32)2; + pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp - (EB_U8)THRESHOLD2QPINCREASE - (EB_S32)2; else if (rateControlParamPtr->virtualBufferLevel <= - (contextPtr->vbFillThreshold2<<1)) - pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp - (EB_U8)THRESHOLD2QPINCREASE - (EB_S32)1; + pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp - (EB_U8)THRESHOLD2QPINCREASE - (EB_S32)1; else if (rateControlParamPtr->virtualBufferLevel <= 0) - pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE, 0); + pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)pictureControlSetPtr->pictureQp - (EB_S32)THRESHOLD2QPINCREASE, 0); } - pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( + pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( sequenceControlSetPtr->staticConfig.minQpAllowed, sequenceControlSetPtr->staticConfig.maxQpAllowed, - pictureControlSetPtr->pictureQp); + pictureControlSetPtr->pictureQp); } else{ - // LCU Loop + // LCU Loop for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuCodingOrder]; lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuPtr->originX >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaWidth - lcuPtr->originX; lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuPtr->originY >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaHeight - lcuPtr->originY; - // This is because of the tile boundry LCUs which do not have correct SAD from ME. + // This is because of the tile boundry LCUs which do not have correct SAD from ME. // ME doesn't know about Tile Boundries if ((lcuWidth == MAX_LCU_SIZE) && (lcuHeight == MAX_LCU_SIZE)){ - pictureControlSetPtr->ParentPcsPtr->sadMe += pictureControlSetPtr->ParentPcsPtr->rcMEdistortion[lcuCodingOrder]; + pictureControlSetPtr->ParentPcsPtr->sadMe += pictureControlSetPtr->ParentPcsPtr->rcMEdistortion[lcuCodingOrder]; } } @@ -1267,7 +1267,7 @@ static void FrameLevelRcInputPictureMode2( } - tempQp = pictureControlSetPtr->pictureQp; + tempQp = pictureControlSetPtr->pictureQp; if (pictureControlSetPtr->pictureNumber == rateControlParamPtr->firstPoc){ EB_U32 temporalLayerIdex; @@ -1280,8 +1280,8 @@ static void FrameLevelRcInputPictureMode2( } if (pictureControlSetPtr->pictureNumber == 0){ - contextPtr->baseLayerFramesAvgQp = pictureControlSetPtr->pictureQp + 1; - contextPtr->baseLayerIntraFramesAvgQp = pictureControlSetPtr->pictureQp; + contextPtr->baseLayerFramesAvgQp = pictureControlSetPtr->pictureQp + 1; + contextPtr->baseLayerIntraFramesAvgQp = pictureControlSetPtr->pictureQp; } } else{ @@ -1289,7 +1289,7 @@ static void FrameLevelRcInputPictureMode2( pictureControlSetPtr->ParentPcsPtr->sadMe = 0; // if the pixture is an I slice, for now we set the QP as the QP of the previous frame - if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { + if (pictureControlSetPtr->sliceType == EB_I_PICTURE) { EB_U32 selectedRefQp; if (sequenceControlSetPtr->staticConfig.lookAheadDistance == 0) @@ -1331,7 +1331,7 @@ static void FrameLevelRcInputPictureMode2( lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuCodingOrder]; lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuPtr->originX >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaWidth - lcuPtr->originX; lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuPtr->originY >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaHeight - lcuPtr->originY; - // This is because of the tile boundry LCUs which do not have correct SAD from ME. + // This is because of the tile boundry LCUs which do not have correct SAD from ME. // ME doesn't know about Tile Boundries if ((lcuWidth == MAX_LCU_SIZE) && (lcuHeight == MAX_LCU_SIZE)){ numOfFullLcus++; @@ -1351,36 +1351,36 @@ static void FrameLevelRcInputPictureMode2( } } if (!sequenceControlSetPtr->encodeContextPtr->rateControlTablesArrayUpdated) { - pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)selectedRefQp - (EB_S32)1, 0); + pictureControlSetPtr->pictureQp = (EB_U8)MAX((EB_S32)selectedRefQp - (EB_S32)1, 0); rateControlLayerPtr->calculatedFrameQp = (EB_U8)MAX((EB_S32)selectedRefQp - (EB_S32)1, 0); - pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; + pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; } else{ - pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; + pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; rateControlLayerPtr->calculatedFrameQp = (EB_U8)selectedRefQp; - pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; - pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( + pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; + pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( (EB_U32)MAX((EB_S32)contextPtr->baseLayerFramesAvgQp - (EB_S32)3, 0), contextPtr->baseLayerFramesAvgQp + 1, - pictureControlSetPtr->pictureQp); - pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( + pictureControlSetPtr->pictureQp); + pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( (EB_U32)MAX((EB_S32)contextPtr->baseLayerIntraFramesAvgQp - (EB_S32)5, 0), contextPtr->baseLayerIntraFramesAvgQp + 2, - pictureControlSetPtr->pictureQp); + pictureControlSetPtr->pictureQp); } } else{ selectedRefQp = pictureControlSetPtr->ParentPcsPtr->bestPredQp; - pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; - pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; + pictureControlSetPtr->pictureQp = (EB_U8)selectedRefQp; + pictureControlSetPtr->ParentPcsPtr->calculatedQp = pictureControlSetPtr->pictureQp; } - pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( + pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( sequenceControlSetPtr->staticConfig.minQpAllowed, sequenceControlSetPtr->staticConfig.maxQpAllowed, - pictureControlSetPtr->pictureQp); + pictureControlSetPtr->pictureQp); - tempQp = pictureControlSetPtr->pictureQp; + tempQp = pictureControlSetPtr->pictureQp; } @@ -1396,16 +1396,16 @@ static void FrameLevelRcInputPictureMode2( pictureControlSetPtr->ParentPcsPtr->targetBitsRc = rateControlLayerPtr->ecBitConstraint; } - // LCU Loop + // LCU Loop for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuCodingOrder]; lcuWidth = (sequenceControlSetPtr->lumaWidth - lcuPtr->originX >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaWidth - lcuPtr->originX; lcuHeight = (sequenceControlSetPtr->lumaHeight - lcuPtr->originY >= (EB_U16)MAX_LCU_SIZE) ? lcuPtr->size : sequenceControlSetPtr->lumaHeight - lcuPtr->originY; - // This is because of the tile boundry LCUs which do not have correct SAD from ME. + // This is because of the tile boundry LCUs which do not have correct SAD from ME. // ME doesn't know about Tile Boundries if ((lcuWidth == MAX_LCU_SIZE) && (lcuHeight == MAX_LCU_SIZE)){ - pictureControlSetPtr->ParentPcsPtr->sadMe += pictureControlSetPtr->ParentPcsPtr->rcMEdistortion[lcuCodingOrder]; + pictureControlSetPtr->ParentPcsPtr->sadMe += pictureControlSetPtr->ParentPcsPtr->rcMEdistortion[lcuCodingOrder]; } } @@ -1439,7 +1439,7 @@ static void FrameLevelRcInputPictureMode2( } tempQp += rateControlLayerPtr->deltaQpFraction; - pictureControlSetPtr->pictureQp = (EB_U8)((tempQp + RC_PRECISION_OFFSET) >> RC_PRECISION); + pictureControlSetPtr->pictureQp = (EB_U8)((tempQp + RC_PRECISION_OFFSET) >> RC_PRECISION); // Use the QP of HLRC instead of calculated one in FLRC if (pictureControlSetPtr->ParentPcsPtr->hierarchicalLevels > 1){ pictureControlSetPtr->pictureQp = pictureControlSetPtr->ParentPcsPtr->bestPredQp; @@ -1447,12 +1447,12 @@ static void FrameLevelRcInputPictureMode2( } if (sequenceControlSetPtr->intraPeriodLength != -1 && rateControlParamPtr->firstPoc == 0){ pictureControlSetPtr->ParentPcsPtr->bestPredQp++; - pictureControlSetPtr->pictureQp++; - pictureControlSetPtr->ParentPcsPtr->calculatedQp++; + pictureControlSetPtr->pictureQp++; + pictureControlSetPtr->ParentPcsPtr->calculatedQp++; } } if (pictureControlSetPtr->ParentPcsPtr->firstNonIntraFrameInTemporalLayer && pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ - pictureControlSetPtr->pictureQp = (EB_U8)rateControlParamPtr->intraFramesQp + 1; + pictureControlSetPtr->pictureQp = (EB_U8)rateControlParamPtr->intraFramesQp + 1; } if (!rateControlLayerPtr->feedbackArrived && pictureControlSetPtr->sliceType != EB_I_PICTURE){ @@ -1524,13 +1524,13 @@ static void FrameLevelRcInputPictureMode2( } else{ pictureControlSetPtr->pictureQp = (EB_U8)CLIP3( - (EB_U32)MAX((EB_S32)pictureControlSetPtr->ParentPcsPtr->bestPredQp - 8, 0), + (EB_U32)MAX((EB_S32)pictureControlSetPtr->ParentPcsPtr->bestPredQp - 8, 0), (EB_U32)pictureControlSetPtr->ParentPcsPtr->bestPredQp + 8, (EB_U32)pictureControlSetPtr->pictureQp); } } - if (pictureControlSetPtr->pictureNumber != rateControlParamPtr->firstPoc && + if (pictureControlSetPtr->pictureNumber != rateControlParamPtr->firstPoc && pictureControlSetPtr->pictureQp == pictureControlSetPtr->ParentPcsPtr->bestPredQp && rateControlParamPtr->virtualBufferLevel > contextPtr->vbFillThreshold1){ if (rateControlParamPtr->extraApBitRatioI > 200){ pictureControlSetPtr->pictureQp = pictureControlSetPtr->pictureQp + 3; @@ -1545,7 +1545,7 @@ static void FrameLevelRcInputPictureMode2( //Limiting the QP based on the QP of the Reference frame { EB_U32 refQp; - + if (!pictureControlSetPtr->ParentPcsPtr->endOfSequenceRegion){ if (contextPtr->framesInInterval[pictureControlSetPtr->temporalLayerIndex]< 5){ if ((EB_S32)pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ @@ -1611,7 +1611,7 @@ static void FrameLevelRcInputPictureMode2( } } } - + if ((EB_S32)pictureControlSetPtr->temporalLayerIndex == 2){ refQp = 0; if (pictureControlSetPtr->refSliceTypeArray[0] != EB_I_PICTURE){ @@ -1796,7 +1796,7 @@ static void FrameLevelRcFeedbackPictureMode2( } rateControlLayerPtr->kCoeff = MIN(rateControlLayerPtr->kCoeff, rateControlLayerPtr->previousKCoeff * 4); rateControlLayerPtr->cCoeff = MIN(rateControlLayerPtr->cCoeff, rateControlLayerPtr->previousCCoeff * 4); - if (parentPictureControlSetPtr->sliceType != EB_I_PICTURE) { + if (parentPictureControlSetPtr->sliceType != EB_I_PICTURE) { rateControlLayerPtr->previousFrameSadMe = parentPictureControlSetPtr->sadMe; } else{ @@ -1815,7 +1815,7 @@ static void FrameLevelRcFeedbackPictureMode2( } } - + { EB_U64 previousFrameEcBits = 0; EB_BOOL pictureMinQpAllowed = EB_TRUE; @@ -1824,9 +1824,9 @@ static void FrameLevelRcFeedbackPictureMode2( previousFrameEcBits += rateControlLayerPtr->previousFrameBitActual; if (rateControlLayerPtr->sameSADCount == 0 || parentPictureControlSetPtr->pictureQp != sequenceControlSetPtr->staticConfig.minQpAllowed){ - pictureMinQpAllowed = EB_FALSE; + pictureMinQpAllowed = EB_FALSE; } - if (pictureMinQpAllowed) + if (pictureMinQpAllowed) rateControlLayerPtr->frameSameSADMinQpCount++; else rateControlLayerPtr->frameSameSADMinQpCount = 0; @@ -1876,8 +1876,8 @@ static void FrameLevelRcFeedbackPictureMode2( MIN((EB_S64)parentPictureControlSetPtr->targetBitRate * 3 / 4, (EB_S64)(parentPictureControlSetPtr->totalNumBits*contextPtr->frameRate / (sequenceControlSetPtr->staticConfig.intraPeriodLength + 1)) >> RC_PRECISION)) *parentPictureControlSetPtr->bitsPerSwPerLayer[temporalLayerIdex] / sumBitsPerSw; } -#endif - // update this based on temporal layers +#endif + // update this based on temporal layers if (temporalLayerIdex == 0) channelBitRate = (((targetBitRate << (2 * RC_PRECISION)) / MAX(1, rateControlLayerTempPtr->frameRate - (1 * contextPtr->frameRate / (sequenceControlSetPtr->staticConfig.intraPeriodLength + 1)))) + RC_PRECISION_OFFSET) >> RC_PRECISION; else @@ -1920,7 +1920,7 @@ static void FrameLevelRcFeedbackPictureMode2( rateControlLayerPtr->previousBitConstraint = (EB_S64)rateControlLayerPtr->channelBitRate; rateControlParamPtr->virtualBufferLevel = ((EB_S64)contextPtr->virtualBufferSize >> 1); } - // Updating bit difference + // Updating bit difference rateControlLayerPtr->bitDiff = (EB_S64)rateControlParamPtr->virtualBufferLevel //- ((EB_S64)contextPtr->virtualBufferSize>>1); - ((EB_S64)rateControlLayerPtr->channelBitRate >> 1); @@ -1934,7 +1934,7 @@ static void FrameLevelRcFeedbackPictureMode2( // Limiting the bitConstraint if (parentPictureControlSetPtr->temporalLayerIndex == 0){ - rateControlLayerPtr->bitConstraint = CLIP3(rateControlLayerPtr->channelBitRate >> 2, + rateControlLayerPtr->bitConstraint = CLIP3(rateControlLayerPtr->channelBitRate >> 2, rateControlLayerPtr->channelBitRate * 200 / 100, rateControlLayerPtr->bitConstraint); } @@ -2148,10 +2148,10 @@ static void HighLevelRcFeedBackPicture( EB_U32 queueEntryIndexHeadTemp; - //SVT_LOG("\nOut:%d Slidings: ",pictureControlSetPtr->pictureNumber); + //SVT_LOG("\nOut:%d Slidings: ",pictureControlSetPtr->pictureNumber); if (sequenceControlSetPtr->staticConfig.lookAheadDistance != 0){ - // Update the coded rate in the histogram queue + // Update the coded rate in the histogram queue if (pictureControlSetPtr->pictureNumber >= sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueue[sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber){ queueEntryIndexHeadTemp = (EB_S32)(pictureControlSetPtr->pictureNumber - sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueue[sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber); queueEntryIndexHeadTemp += sequenceControlSetPtr->encodeContextPtr->hlRateControlHistorgramQueueHeadIndex; @@ -2176,145 +2176,145 @@ static EB_U64 predictBits(SequenceControlSet_t *sequenceControlSetPtr, EncodeContext_t *encodeContextPtr, HlRateControlHistogramEntry_t *hlRateControlHistogramPtrTemp, EB_U32 qp) { - EB_U64 totalBits = 0; - if (hlRateControlHistogramPtrTemp->isCoded) { - // If the frame is already coded, use the actual number of bits - totalBits = hlRateControlHistogramPtrTemp->totalNumBitsCoded; - } - else { - RateControlTables_t *rateControlTablesPtr = &encodeContextPtr->rateControlTablesArray[qp]; - EB_Bit_Number *sadBitsArrayPtr = rateControlTablesPtr->sadBitsArray[hlRateControlHistogramPtrTemp->temporalLayerIndex]; - EB_Bit_Number *intraSadBitsArrayPtr = rateControlTablesPtr->intraSadBitsArray[0]; - EB_U32 predBitsRefQp = 0; - EB_U32 numOfFullLcus = 0; - EB_U32 areaInPixel = sequenceControlSetPtr->lumaWidth * sequenceControlSetPtr->lumaHeight; - - if (hlRateControlHistogramPtrTemp->sliceType == EB_I_PICTURE) { - // Loop over block in the frame and calculated the predicted bits at reg QP - EB_U32 i; - EB_U32 accum = 0; - for (i = 0; i < NUMBER_OF_INTRA_SAD_INTERVALS; ++i) - { - accum += (EB_U32)(hlRateControlHistogramPtrTemp->oisDistortionHistogram[i] * intraSadBitsArrayPtr[i]); - } - - predBitsRefQp = accum; - numOfFullLcus = hlRateControlHistogramPtrTemp->fullLcuCount; - totalBits += predBitsRefQp; - } - else { - EB_U32 i; - EB_U32 accum = 0; - EB_U32 accumIntra = 0; - for (i = 0; i < NUMBER_OF_SAD_INTERVALS; ++i) - { - accum += (EB_U32)(hlRateControlHistogramPtrTemp->meDistortionHistogram[i] * sadBitsArrayPtr[i]); - accumIntra += (EB_U32)(hlRateControlHistogramPtrTemp->oisDistortionHistogram[i] * intraSadBitsArrayPtr[i]); - - } - if (accum > accumIntra * 3) - predBitsRefQp = accumIntra; - else - predBitsRefQp = accum; - numOfFullLcus = hlRateControlHistogramPtrTemp->fullLcuCount; - totalBits += predBitsRefQp; - } - - // Scale for in complete LCSs - // predBitsRefQp is normalized based on the area because of the LCUs at the picture boundries - totalBits = totalBits * (EB_U64)areaInPixel / (numOfFullLcus << 12); - } - hlRateControlHistogramPtrTemp->predBitsRefQp[qp] = totalBits; - return totalBits; + EB_U64 totalBits = 0; + if (hlRateControlHistogramPtrTemp->isCoded) { + // If the frame is already coded, use the actual number of bits + totalBits = hlRateControlHistogramPtrTemp->totalNumBitsCoded; + } + else { + RateControlTables_t *rateControlTablesPtr = &encodeContextPtr->rateControlTablesArray[qp]; + EB_Bit_Number *sadBitsArrayPtr = rateControlTablesPtr->sadBitsArray[hlRateControlHistogramPtrTemp->temporalLayerIndex]; + EB_Bit_Number *intraSadBitsArrayPtr = rateControlTablesPtr->intraSadBitsArray[0]; + EB_U32 predBitsRefQp = 0; + EB_U32 numOfFullLcus = 0; + EB_U32 areaInPixel = sequenceControlSetPtr->lumaWidth * sequenceControlSetPtr->lumaHeight; + + if (hlRateControlHistogramPtrTemp->sliceType == EB_I_PICTURE) { + // Loop over block in the frame and calculated the predicted bits at reg QP + EB_U32 i; + EB_U32 accum = 0; + for (i = 0; i < NUMBER_OF_INTRA_SAD_INTERVALS; ++i) + { + accum += (EB_U32)(hlRateControlHistogramPtrTemp->oisDistortionHistogram[i] * intraSadBitsArrayPtr[i]); + } + + predBitsRefQp = accum; + numOfFullLcus = hlRateControlHistogramPtrTemp->fullLcuCount; + totalBits += predBitsRefQp; + } + else { + EB_U32 i; + EB_U32 accum = 0; + EB_U32 accumIntra = 0; + for (i = 0; i < NUMBER_OF_SAD_INTERVALS; ++i) + { + accum += (EB_U32)(hlRateControlHistogramPtrTemp->meDistortionHistogram[i] * sadBitsArrayPtr[i]); + accumIntra += (EB_U32)(hlRateControlHistogramPtrTemp->oisDistortionHistogram[i] * intraSadBitsArrayPtr[i]); + + } + if (accum > accumIntra * 3) + predBitsRefQp = accumIntra; + else + predBitsRefQp = accum; + numOfFullLcus = hlRateControlHistogramPtrTemp->fullLcuCount; + totalBits += predBitsRefQp; + } + + // Scale for in complete LCSs + // predBitsRefQp is normalized based on the area because of the LCUs at the picture boundries + totalBits = totalBits * (EB_U64)areaInPixel / (numOfFullLcus << 12); + } + hlRateControlHistogramPtrTemp->predBitsRefQp[qp] = totalBits; + return totalBits; } static EB_U8 Vbv_Buf_Calc(PictureControlSet_t *pictureControlSetPtr, SequenceControlSet_t *sequenceControlSetPtr, EncodeContext_t *encodeContextPtr) { - EB_S32 loopTerminate = 0; - EB_U32 q = pictureControlSetPtr->pictureQp; - EB_U32 q0 = pictureControlSetPtr->pictureQp; - // Queue variables - EB_U32 queueEntryIndexTemp; - EB_U32 queueEntryIndexTemp2; - EB_U32 queueEntryIndexHeadTemp; - HlRateControlHistogramEntry_t *hlRateControlHistogramPtrTemp; - EB_BOOL bitrateFlag; - - /* Lookahead VBV: If lookahead is done, raise the quantizer as necessary - * such that no frames in the lookahead overflow and such that the buffer - * is in a reasonable state by the end of the lookahead. */ - - queueEntryIndexHeadTemp = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->hlRateControlHistorgramQueue[encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber); - queueEntryIndexHeadTemp += encodeContextPtr->hlRateControlHistorgramQueueHeadIndex; - queueEntryIndexHeadTemp = (queueEntryIndexHeadTemp > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? - queueEntryIndexHeadTemp - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : - queueEntryIndexHeadTemp; - - queueEntryIndexTemp = queueEntryIndexHeadTemp; - bitrateFlag = encodeContextPtr->vbvMaxrate <= encodeContextPtr->availableTargetBitRate; - EB_S32 currentInd = (queueEntryIndexTemp > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : queueEntryIndexTemp; - - - /* Avoid an infinite loop. */ - for (EB_S32 iterations = 0; iterations < 1000 && loopTerminate != 3; iterations++) - { - hlRateControlHistogramPtrTemp = (encodeContextPtr->hlRateControlHistorgramQueue[currentInd]); - double curBits = (double)predictBits(sequenceControlSetPtr, encodeContextPtr, hlRateControlHistogramPtrTemp, q); - double bufferFillCur = encodeContextPtr->bufferFill - curBits; - double targetFill; - double fps = 1.0 / (sequenceControlSetPtr->frameRate >> RC_PRECISION); - double totalDuration = fps; - queueEntryIndexTemp = currentInd; - - /* Loop over the planned future frames. */ - for (EB_S32 j = 0; bufferFillCur >= 0; j++) - { - queueEntryIndexTemp2 = (queueEntryIndexTemp > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : queueEntryIndexTemp; - hlRateControlHistogramPtrTemp = (encodeContextPtr->hlRateControlHistorgramQueue[queueEntryIndexTemp2]); - - if ((queueEntryIndexTemp >= (currentInd + sequenceControlSetPtr->staticConfig.lookAheadDistance)) || - (queueEntryIndexTemp >= sequenceControlSetPtr->staticConfig.framesToBeEncoded) - || (totalDuration >= 1.0)) - break; - - totalDuration += fps; - double wantedFrameSize = encodeContextPtr->vbvMaxrate * fps; - if (bufferFillCur + wantedFrameSize <= encodeContextPtr->vbvBufsize) - bufferFillCur += wantedFrameSize; - curBits = (double)predictBits(sequenceControlSetPtr, encodeContextPtr, hlRateControlHistogramPtrTemp, q); - bufferFillCur -= curBits; - queueEntryIndexTemp++; - } - - targetFill = MIN(encodeContextPtr->bufferFill + totalDuration * encodeContextPtr->vbvMaxrate * 0.5, encodeContextPtr->vbvBufsize * (1 - 0.5)); - if (bufferFillCur < targetFill) - { - q++; - q = CLIP3( - sequenceControlSetPtr->staticConfig.minQpAllowed, - sequenceControlSetPtr->staticConfig.maxQpAllowed, - q); - loopTerminate |= 1; - continue; - } - - targetFill = CLIP3(encodeContextPtr->vbvBufsize * (1 - 0.05), encodeContextPtr->vbvBufsize, encodeContextPtr->bufferFill - totalDuration * encodeContextPtr->vbvMaxrate * 0.5); - if ((bitrateFlag) && (bufferFillCur > targetFill)) - { - q--; - q = CLIP3( - sequenceControlSetPtr->staticConfig.minQpAllowed, - sequenceControlSetPtr->staticConfig.maxQpAllowed, - q); - loopTerminate |= 2; - continue; - } - break; - } - q = MAX(q0 / 2, q); - return (EB_U8)q; + EB_S32 loopTerminate = 0; + EB_U32 q = pictureControlSetPtr->pictureQp; + EB_U32 q0 = pictureControlSetPtr->pictureQp; + // Queue variables + EB_U32 queueEntryIndexTemp; + EB_U32 queueEntryIndexTemp2; + EB_U32 queueEntryIndexHeadTemp; + HlRateControlHistogramEntry_t *hlRateControlHistogramPtrTemp; + EB_BOOL bitrateFlag; + + /* Lookahead VBV: If lookahead is done, raise the quantizer as necessary + * such that no frames in the lookahead overflow and such that the buffer + * is in a reasonable state by the end of the lookahead. */ + + queueEntryIndexHeadTemp = (EB_S32)(pictureControlSetPtr->pictureNumber - encodeContextPtr->hlRateControlHistorgramQueue[encodeContextPtr->hlRateControlHistorgramQueueHeadIndex]->pictureNumber); + queueEntryIndexHeadTemp += encodeContextPtr->hlRateControlHistorgramQueueHeadIndex; + queueEntryIndexHeadTemp = (queueEntryIndexHeadTemp > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? + queueEntryIndexHeadTemp - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : + queueEntryIndexHeadTemp; + + queueEntryIndexTemp = queueEntryIndexHeadTemp; + bitrateFlag = encodeContextPtr->vbvMaxrate <= encodeContextPtr->availableTargetBitRate; + EB_S32 currentInd = (queueEntryIndexTemp > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : queueEntryIndexTemp; + + + /* Avoid an infinite loop. */ + for (EB_S32 iterations = 0; iterations < 1000 && loopTerminate != 3; iterations++) + { + hlRateControlHistogramPtrTemp = (encodeContextPtr->hlRateControlHistorgramQueue[currentInd]); + double curBits = (double)predictBits(sequenceControlSetPtr, encodeContextPtr, hlRateControlHistogramPtrTemp, q); + double bufferFillCur = encodeContextPtr->bufferFill - curBits; + double targetFill; + double fps = 1.0 / (sequenceControlSetPtr->frameRate >> RC_PRECISION); + double totalDuration = fps; + queueEntryIndexTemp = currentInd; + + /* Loop over the planned future frames. */ + for (EB_S32 j = 0; bufferFillCur >= 0; j++) + { + queueEntryIndexTemp2 = (queueEntryIndexTemp > HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH - 1) ? queueEntryIndexTemp - HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH : queueEntryIndexTemp; + hlRateControlHistogramPtrTemp = (encodeContextPtr->hlRateControlHistorgramQueue[queueEntryIndexTemp2]); + + if ((queueEntryIndexTemp >= (currentInd + sequenceControlSetPtr->staticConfig.lookAheadDistance)) || + (queueEntryIndexTemp >= sequenceControlSetPtr->staticConfig.framesToBeEncoded) + || (totalDuration >= 1.0)) + break; + + totalDuration += fps; + double wantedFrameSize = encodeContextPtr->vbvMaxrate * fps; + if (bufferFillCur + wantedFrameSize <= encodeContextPtr->vbvBufsize) + bufferFillCur += wantedFrameSize; + curBits = (double)predictBits(sequenceControlSetPtr, encodeContextPtr, hlRateControlHistogramPtrTemp, q); + bufferFillCur -= curBits; + queueEntryIndexTemp++; + } + + targetFill = MIN(encodeContextPtr->bufferFill + totalDuration * encodeContextPtr->vbvMaxrate * 0.5, encodeContextPtr->vbvBufsize * (1 - 0.5)); + if (bufferFillCur < targetFill) + { + q++; + q = CLIP3( + sequenceControlSetPtr->staticConfig.minQpAllowed, + sequenceControlSetPtr->staticConfig.maxQpAllowed, + q); + loopTerminate |= 1; + continue; + } + + targetFill = CLIP3(encodeContextPtr->vbvBufsize * (1 - 0.05), encodeContextPtr->vbvBufsize, encodeContextPtr->bufferFill - totalDuration * encodeContextPtr->vbvMaxrate * 0.5); + if ((bitrateFlag) && (bufferFillCur > targetFill)) + { + q--; + q = CLIP3( + sequenceControlSetPtr->staticConfig.minQpAllowed, + sequenceControlSetPtr->staticConfig.maxQpAllowed, + q); + loopTerminate |= 2; + continue; + } + break; + } + q = MAX(q0 / 2, q); + return (EB_U8)q; } void* RateControlKernel(void *inputPtr) @@ -2430,8 +2430,8 @@ void* RateControlKernel(void *inputPtr) contextPtr, contextPtr->highLevelRateControlPtr); - } - + } + // Frame level RC if (sequenceControlSetPtr->intraPeriodLength == -1 || sequenceControlSetPtr->staticConfig.rateControlMode == 0){ rateControlParamPtr = contextPtr->rateControlParamQueue[0]; @@ -2473,7 +2473,7 @@ void* RateControlKernel(void *inputPtr) // ***Rate Control*** //SVT_LOG("\nRate Control Thread %d\n", (int) pictureControlSetPtr->ParentPcsPtr->pictureNumber); if (sequenceControlSetPtr->staticConfig.rateControlMode == 0){ - // if RC mode is 0, fixed QP is used + // if RC mode is 0, fixed QP is used // QP scaling based on POC number for Flat IPPP structure if (sequenceControlSetPtr->enableQpScalingFlag && pictureControlSetPtr->ParentPcsPtr->qpOnTheFly == EB_FALSE){ @@ -2573,7 +2573,7 @@ void* RateControlKernel(void *inputPtr) (EB_U32)MAX((EB_S32)rateControlParamPtr->firstPicActualQp - (EB_S32)4, 0), (EB_U32)rateControlParamPtr->firstPicActualQp + 8, pictureControlSetPtr->pictureQp); - + } } @@ -2609,7 +2609,7 @@ void* RateControlKernel(void *inputPtr) if (pictureControlSetPtr->ParentPcsPtr->temporalLayerIndex == 0 && sequenceControlSetPtr->staticConfig.lookAheadDistance != 0){ contextPtr->baseLayerFramesAvgQp = (3 * contextPtr->baseLayerFramesAvgQp + pictureControlSetPtr->pictureQp + 2) >> 2; } - if (pictureControlSetPtr->sliceType == EB_I_PICTURE){ + if (pictureControlSetPtr->sliceType == EB_I_PICTURE){ if (pictureControlSetPtr->pictureNumber == rateControlParamPtr->firstPoc){ rateControlParamPtr->firstPicPredQp = (EB_U16) pictureControlSetPtr->ParentPcsPtr->bestPredQp; rateControlParamPtr->firstPicActualQp = (EB_U16) pictureControlSetPtr->pictureQp; @@ -2630,9 +2630,9 @@ void* RateControlKernel(void *inputPtr) } } } - pictureControlSetPtr->ParentPcsPtr->averageQp = 0; + pictureControlSetPtr->ParentPcsPtr->averageQp = 0; - for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { + for (lcuCodingOrder = 0; lcuCodingOrder < lcuTotalCount; ++lcuCodingOrder) { lcuPtr = pictureControlSetPtr->lcuPtrArray[lcuCodingOrder]; lcuPtr->qp = (EB_U8)pictureControlSetPtr->pictureQp; @@ -2661,7 +2661,7 @@ void* RateControlKernel(void *inputPtr) case RC_PACKETIZATION_FEEDBACK_RESULT: //loopCount++; - //SVT_LOG("Rate Control Thread FeedBack %d\n", (int) loopCount); + //SVT_LOG("Rate Control Thread FeedBack %d\n", (int) loopCount); parentPictureControlSetPtr = (PictureParentControlSet_t*)rateControlTasksPtr->pictureControlSetWrapperPtr->objectPtr; sequenceControlSetPtr = (SequenceControlSet_t*)parentPictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; @@ -2723,7 +2723,7 @@ void* RateControlKernel(void *inputPtr) sequenceControlSetPtr, contextPtr); if (parentPictureControlSetPtr->pictureNumber == rateControlParamPtr->firstPoc){ - rateControlParamPtr->firstPicPredBits = parentPictureControlSetPtr->targetBitsBestPredQp; + rateControlParamPtr->firstPicPredBits = parentPictureControlSetPtr->targetBitsBestPredQp; rateControlParamPtr->firstPicActualBits = parentPictureControlSetPtr->totalNumBits; { EB_S16 deltaApQp = (EB_S16)rateControlParamPtr->firstPicActualQp - (EB_S16)rateControlParamPtr->firstPicPredQp; @@ -2732,7 +2732,7 @@ void* RateControlKernel(void *inputPtr) 0; rateControlParamPtr->extraApBitRatioI += (EB_S64)deltaApQp * 15; } - + } @@ -2741,7 +2741,7 @@ void* RateControlKernel(void *inputPtr) // Queue variables #if OVERSHOOT_STAT_PRINT if (sequenceControlSetPtr->intraPeriodLength != -1){ - + EB_S32 queueEntryIndex; EB_U32 queueEntryIndexTemp; EB_U32 queueEntryIndexTemp2; @@ -2750,7 +2750,7 @@ void* RateControlKernel(void *inputPtr) EB_BOOL endOfSequenceFlag = EB_TRUE; EB_U32 framesInSw; - // Determine offset from the Head Ptr + // Determine offset from the Head Ptr queueEntryIndex = (EB_S32)(parentPictureControlSetPtr->pictureNumber - contextPtr->codedFramesStatQueue[contextPtr->codedFramesStatQueueHeadIndex]->pictureNumber); queueEntryIndex += contextPtr->codedFramesStatQueueHeadIndex; queueEntryIndex = (queueEntryIndex > CODED_FRAMES_STAT_QUEUE_MAX_DEPTH - 1) ? queueEntryIndex - CODED_FRAMES_STAT_QUEUE_MAX_DEPTH : queueEntryIndex; @@ -2855,14 +2855,14 @@ void* RateControlKernel(void *inputPtr) totalNumberOfFbFrames++; - // Release the SequenceControlSet - EbReleaseObject(parentPictureControlSetPtr->sequenceControlSetWrapperPtr); + // Release the SequenceControlSet + EbReleaseObject(parentPictureControlSetPtr->sequenceControlSetWrapperPtr); // Release the input buffer EbReleaseObject(parentPictureControlSetPtr->ebInputWrapperPtr); // Release the ParentPictureControlSet - EbReleaseObject(rateControlTasksPtr->pictureControlSetWrapperPtr); + EbReleaseObject(rateControlTasksPtr->pictureControlSetWrapperPtr); - // Release Rate Control Tasks + // Release Rate Control Tasks EbReleaseObject(rateControlTasksWrapperPtr); break; @@ -2870,7 +2870,7 @@ void* RateControlKernel(void *inputPtr) // Extract bits-per-lcu-row - // Release Rate Control Tasks + // Release Rate Control Tasks EbReleaseObject(rateControlTasksWrapperPtr); break; @@ -2880,7 +2880,7 @@ void* RateControlKernel(void *inputPtr) sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; //encodeContextPtr = sequenceControlSetPtr->encodeContextPtr; //CHECK_REPORT_ERROR_NC( - // encodeContextPtr->appCallbackPtr, + // encodeContextPtr->appCallbackPtr, // EB_ENC_RC_ERROR1); break; diff --git a/Source/Lib/Codec/EbRateControlProcess.h b/Source/Lib/Codec/EbRateControlProcess.h index f517e82ce..fc55aa5a7 100644 --- a/Source/Lib/Codec/EbRateControlProcess.h +++ b/Source/Lib/Codec/EbRateControlProcess.h @@ -17,7 +17,7 @@ extern "C" { #define CCOEFF_INIT_FACT 2 #define SAD_CLIP_COEFF 5 // 88 + 3*16*8 -#define SLICE_HEADER_BITS_NUM 104 +#define SLICE_HEADER_BITS_NUM 104 #define PPS_BITS_NUM 80 #define SPS_BITS_NUM 296 #define RC_PRECISION 16 @@ -39,7 +39,7 @@ extern "C" { #define RC_NEW_EXTRA_BITS 1 #define RC_UPDATE_TARGET_RATE 1 -#define RC_QPMOD_MAXQP 42 +#define RC_QPMOD_MAXQP 42 static const EB_U8 MOD_QP_OFFSET_LAYER_ARRAY[MAX_HIERARCHICAL_LEVEL][MAX_TEMPORAL_LAYERS] = { // [Highest Temporal Layer] [Temporal Layer Index] @@ -87,15 +87,15 @@ static const EB_U64 TWO_TO_POWER_QP_OVER_THREE[] = { }; // range is from -51 to 51 (0 to 102) static const EB_U64 TWO_TO_POWER_X_OVER_SIX[] = { - 0xB5, 0xCB, 0xE4, 0xFF, 0x11F, 0x142, - 0x16A, 0x196, 0x1C8, 0x1FF, 0x23E, 0x285, - 0x2D4, 0x32C, 0x390, 0x3FF, 0x47D, 0x50A, - 0x5A8, 0x659, 0x720, 0x7FF, 0x8FA, 0xA14, - 0xB50, 0xCB2, 0xE41, 0xFFF, 0x11F5, 0x1428, - 0x16A0, 0x1965, 0x1C82, 0x1FFF, 0x23EB, 0x2851, - 0x2D41, 0x32CB, 0x3904, 0x3FFF, 0x47D6, 0x50A2, - 0x5A82, 0x6597, 0x7208, 0x7FFF, 0x8FAC, 0xA144, - 0xB504, 0xCB2F, 0xE411, 0xFFFF, 0x11F58, 0x14288, + 0xB5, 0xCB, 0xE4, 0xFF, 0x11F, 0x142, + 0x16A, 0x196, 0x1C8, 0x1FF, 0x23E, 0x285, + 0x2D4, 0x32C, 0x390, 0x3FF, 0x47D, 0x50A, + 0x5A8, 0x659, 0x720, 0x7FF, 0x8FA, 0xA14, + 0xB50, 0xCB2, 0xE41, 0xFFF, 0x11F5, 0x1428, + 0x16A0, 0x1965, 0x1C82, 0x1FFF, 0x23EB, 0x2851, + 0x2D41, 0x32CB, 0x3904, 0x3FFF, 0x47D6, 0x50A2, + 0x5A82, 0x6597, 0x7208, 0x7FFF, 0x8FAC, 0xA144, + 0xB504, 0xCB2F, 0xE411, 0xFFFF, 0x11F58, 0x14288, 0x16A08, 0x1965E, 0x1C822, 0x1FFFE, 0x23EB1, 0x28511, 0x2D410, 0x32CBC, 0x39044, 0x3FFFC, 0x47D62, 0x50A23, 0x5A821, 0x65979, 0x72088, 0x7FFF8, 0x8FAC4, 0xA1447, @@ -104,7 +104,7 @@ static const EB_U64 TWO_TO_POWER_X_OVER_SIX[] = { 0x2D410F, 0x32CBCA, 0x390443, 0x3FFFC0, 0x47D623, 0x50A23B, 0x5A821F, 0x659794, 0x720886, 0x7FFF80, 0x8FAC46, 0xA14476, 0xB5043E, 0xCB2F29, 0xE4110C, 0xFFFF00, 0x11F588C, 0x14288ED, - 0x16A087C + 0x16A087C }; /************************************** * Input Port Types @@ -129,23 +129,23 @@ typedef struct RateControlPorts_s { * Coded Frames Stats **************************************/ typedef struct CodedFramesStatsEntry_s { - EB_U64 pictureNumber; + EB_U64 pictureNumber; EB_S64 frameTotalBitActual; EB_BOOL endOfSequenceFlag; -} CodedFramesStatsEntry_t; +} CodedFramesStatsEntry_t; /************************************** * Context **************************************/ -typedef struct RateControlLayerContext_s +typedef struct RateControlLayerContext_s { - EB_U64 previousFrameSadMe; + EB_U64 previousFrameSadMe; EB_U64 previousFrameBitActual; EB_U64 previousFrameQuantizedCoeffBitActual; EB_BOOL feedbackArrived; EB_U64 targetBitRate; - EB_U64 frameRate; - EB_U64 channelBitRate; + EB_U64 frameRate; + EB_U64 channelBitRate; EB_U64 previousBitConstraint; EB_U64 bitConstraint; @@ -155,11 +155,11 @@ typedef struct RateControlLayerContext_s EB_S64 prevDifTotalAndEcBits; EB_S64 bitDiff; - EB_U32 coeffAveragingWeight1; + EB_U32 coeffAveragingWeight1; EB_U32 coeffAveragingWeight2; // coeffAveragingWeight2 = 16- coeffAveragingWeight1 //Ccoeffs have 2*RC_PRECISION precision EB_S64 cCoeff; - EB_S64 previousCCoeff; + EB_S64 previousCCoeff; //Kcoeffs have RC_PRECISION precision EB_U64 kCoeff; EB_U64 previousKCoeff; @@ -175,7 +175,7 @@ typedef struct RateControlLayerContext_s //totalMad has RC_PRECISION precision EB_U64 totalMad; - + EB_U32 firstFrame; EB_U32 firstNonIntraFrame; EB_U32 sameSADCount; @@ -184,18 +184,18 @@ typedef struct RateControlLayerContext_s EB_U32 maxQp; EB_U32 temporalIndex; - + EB_U64 alpha; - + } RateControlLayerContext_t; typedef struct RateControlIntervalParamContext_s { - EB_U64 firstPoc; - EB_U64 lastPoc; - EB_BOOL inUse; - EB_BOOL wasUsed; - EB_U64 processedFramesNumber; + EB_U64 firstPoc; + EB_U64 lastPoc; + EB_BOOL inUse; + EB_BOOL wasUsed; + EB_U64 processedFramesNumber; EB_BOOL lastGop; RateControlLayerContext_t **rateControlLayerArray; @@ -213,17 +213,17 @@ typedef struct RateControlIntervalParamContext_s EB_BOOL sceneChangeInGop; EB_BOOL minTargetRateAssigned; EB_S64 extraApBitRatioI; - + } RateControlIntervalParamContext_t; typedef struct HighLevelRateControlContext_s -{ +{ EB_U64 targetBitsPerSlidingWindow; EB_U64 targetBitRate; - EB_U64 frameRate; - EB_U64 channelBitRatePerFrame; - EB_U64 channelBitRatePerSw; + EB_U64 frameRate; + EB_U64 channelBitRatePerFrame; + EB_U64 channelBitRatePerSw; EB_U64 bitConstraintPerSw; EB_U64 predBitsRefQpPerSw[MAX_REF_QP_NUM]; #if RC_UPDATE_TARGET_RATE @@ -231,23 +231,23 @@ typedef struct HighLevelRateControlContext_s EB_U32 prevIntraOrgSelectedRefQp; EB_U64 previousUpdatedBitConstraintPerSw; #endif - + } HighLevelRateControlContext_t; typedef struct RateControlContext_s { - EbFifo_t *rateControlInputTasksFifoPtr; + EbFifo_t *rateControlInputTasksFifoPtr; EbFifo_t *rateControlOutputResultsFifoPtr; HighLevelRateControlContext_t *highLevelRateControlPtr; RateControlIntervalParamContext_t **rateControlParamQueue; - EB_U64 rateControlParamQueueHeadIndex; + EB_U64 rateControlParamQueueHeadIndex; - EB_U64 frameRate; + EB_U64 frameRate; - EB_U64 virtualBufferSize; + EB_U64 virtualBufferSize; EB_S64 virtualBufferLevelInitialValue; EB_S64 previousVirtualBufferLevel; @@ -279,14 +279,14 @@ typedef struct RateControlContext_s EB_BOOL endOfSequenceRegion; EB_U32 intraCoefRate; - EB_U32 nonPeriodicIntraCoefRate; + EB_U32 nonPeriodicIntraCoefRate; EB_U64 framesInInterval [EB_MAX_TEMPORAL_LAYERS]; - EB_S64 extraBits; + EB_S64 extraBits; EB_S64 extraBitsGen; EB_S16 maxRateAdjustDeltaQP; - - + + } RateControlContext_t; @@ -297,7 +297,7 @@ typedef struct RateControlContext_s extern EB_ERRORTYPE RateControlLayerContextCtor( RateControlLayerContext_t **entryDblPtr); - + extern EB_ERRORTYPE RateControlIntervalParamContextCtor( RateControlIntervalParamContext_t **entryDblPtr); @@ -315,9 +315,9 @@ extern EB_ERRORTYPE RateControlContextCtor( EbFifo_t *rateControlInputTasksFifoPtr, EbFifo_t *rateControlOutputResultsFifoPtr, EB_S32 intraPeriodLength); - - - + + + extern void* RateControlKernel(void *inputPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbRateControlResults.h b/Source/Lib/Codec/EbRateControlResults.h index fc82ed909..aa1ab12c4 100644 --- a/Source/Lib/Codec/EbRateControlResults.h +++ b/Source/Lib/Codec/EbRateControlResults.h @@ -18,7 +18,7 @@ extern "C" { typedef struct RateControlResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; - + } RateControlResults_t; typedef struct RateControlResultsInitData_s @@ -30,7 +30,7 @@ typedef struct RateControlResultsInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE RateControlResultsCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); diff --git a/Source/Lib/Codec/EbRateControlTables.c b/Source/Lib/Codec/EbRateControlTables.c index 9be010a5c..d2893cd7a 100644 --- a/Source/Lib/Codec/EbRateControlTables.c +++ b/Source/Lib/Codec/EbRateControlTables.c @@ -4,1863 +4,1863 @@ */ #include "EbRateControlTables.h" -static const EB_Bit_Number initialRateControlSad64x64Tables[] = { - // QP = 0 NEW - 0, 0, 0, 0, - 0, 0, 19064, 21410, - 21781, 22938, 23734, 24222, - 24242, 24233, 24377, 26487, - 26950, 28615, 29670, 29941, - 29857, 29336, 29130, 29572, - 29583, 29507, 29359, 29711, - 29789, 29753, 29766, 29528, - 29487, 29511, 29611, 29756, - 29758, 29933, 30202, 30579, - 30618, 30870, 31006, 31339, - 31364, 31566, 31687, 31982, - 32063, 32155, 32396, 32551, - 32640, 32651, 32787, 32978, - 32923, 33063, 33139, 33235, - 33288, 33350, 33382, 34440, - // QP = 1 NEW - 0, 0, 0, 0, - 0, 0, 18221, 20496, - 20860, 21997, 22789, 23260, - 23283, 23277, 23417, 25456, - 25906, 27517, 28544, 28819, - 28739, 28240, 28046, 28479, - 28492, 28419, 28277, 28619, - 28697, 28662, 28675, 28443, - 28404, 28427, 28526, 28669, - 28671, 28841, 29104, 29474, - 29512, 29758, 29891, 30218, - 30243, 30439, 30558, 30847, - 30927, 31019, 31253, 31404, - 31492, 31504, 31635, 31824, - 31767, 31908, 31983, 32076, - 32126, 32187, 32217, 33261, - // QP = 2 NEW - 0, 0, 0, 0, - 0, 0, 17109, 19287, - 19632, 20731, 21499, 21947, - 21966, 21954, 22094, 24133, - 24583, 26189, 27209, 27477, - 27395, 26896, 26700, 27132, - 27142, 27071, 26926, 27266, - 27342, 27305, 27318, 27087, - 27048, 27072, 27169, 27312, - 27313, 27485, 27746, 28114, - 28151, 28395, 28528, 28851, - 28878, 29072, 29189, 29478, - 29557, 29647, 29879, 30031, - 30118, 30128, 30259, 30446, - 30389, 30528, 30601, 30694, - 30746, 30806, 30837, 31865, - // QP = 3 NEW - 0, 0, 0, 0, - 0, 0, 16145, 18267, - 18604, 19688, 20447, 20882, - 20904, 20894, 21032, 23054, - 23498, 25089, 26096, 26357, - 26277, 25781, 25590, 26017, - 26029, 25959, 25818, 26156, - 26232, 26196, 26208, 25979, - 25939, 25963, 26059, 26201, - 26202, 26371, 26629, 26993, - 27030, 27271, 27404, 27723, - 27751, 27942, 28058, 28343, - 28421, 28510, 28740, 28892, - 28977, 28987, 29117, 29301, - 29246, 29381, 29456, 29546, - 29596, 29656, 29687, 30703, - // QP = 4 NEW - 0, 0, 0, 0, - 0, 0, 14466, 16764, - 17121, 18263, 19044, 19493, - 19515, 19505, 19640, 21686, - 22138, 23742, 24755, 25011, - 24929, 24429, 24236, 24666, - 24677, 24609, 24468, 24812, - 24888, 24855, 24869, 24642, - 24603, 24628, 24726, 24869, - 24871, 25041, 25302, 25665, - 25703, 25944, 26077, 26400, - 26424, 26617, 26734, 27020, - 27096, 27186, 27416, 27566, - 27651, 27663, 27794, 27979, - 27922, 28058, 28132, 28222, - 28273, 28332, 28363, 29381, - // QP = 5 NEW - 0, 0, 0, 0, - 0, 0, 13448, 15643, - 16002, 17119, 17892, 18326, - 18349, 18336, 18472, 20515, - 20962, 22564, 23574, 23823, - 23740, 23238, 23043, 23466, - 23475, 23407, 23267, 23607, - 23683, 23650, 23666, 23441, - 23404, 23430, 23527, 23671, - 23673, 23842, 24099, 24461, - 24497, 24738, 24869, 25189, - 25214, 25405, 25520, 25804, - 25880, 25970, 26197, 26346, - 26430, 26441, 26571, 26752, - 26698, 26831, 26906, 26996, - 27046, 27104, 27136, 28145, - // QP = 6 - 0, 0, 0, 0, - 0, 0, 11823, 14174, - 14548, 15711, 16489, 16927, - 16944, 16927, 17066, 19162, - 19624, 21263, 22292, 22541, - 22456, 21939, 21736, 22163, - 22174, 22098, 21956, 22298, - 22374, 22342, 22357, 22134, - 22094, 22122, 22222, 22367, - 22370, 22543, 22805, 23170, - 23208, 23451, 23584, 23907, - 23931, 24126, 24243, 24529, - 24606, 24694, 24925, 25075, - 25161, 25172, 25302, 25486, - 25428, 25564, 25640, 25729, - 25779, 25838, 25869, 26882, - // QP = 7 NEW - 0, 0, 0, 0, - 0, 0, 11047, 13263, - 13626, 14758, 15535, 15968, - 15989, 15973, 16111, 18171, - 18622, 20229, 21240, 21487, - 21403, 20895, 20697, 21116, - 21125, 21054, 20913, 21248, - 21322, 21290, 21305, 21086, - 21049, 21078, 21178, 21322, - 21325, 21495, 21752, 22112, - 22148, 22387, 22519, 22836, - 22860, 23051, 23166, 23447, - 23522, 23611, 23836, 23984, - 24068, 24079, 24208, 24387, - 24332, 24466, 24537, 24627, - 24677, 24735, 24764, 25766, - // QP = 8 NEW - 0, 0, 0, 0, - 0, 0, 9513, 11784, - 12142, 13291, 14070, 14500, - 14519, 14503, 14642, 16742, - 17200, 18832, 19854, 20099, - 20014, 19498, 19297, 19720, - 19731, 19657, 19515, 19853, - 19926, 19893, 19907, 19687, - 19649, 19679, 19780, 19927, - 19930, 20102, 20362, 20726, - 20763, 21005, 21136, 21458, - 21482, 21675, 21791, 22074, - 22150, 22239, 22467, 22616, - 22699, 22712, 22840, 23022, - 22965, 23100, 23173, 23262, - 23313, 23371, 23401, 24404, - // QP = 9 - 0, 0, 0, 0, - 0, 0, 8757, 10863, - 11200, 12284, 13028, 13441, - 13460, 13449, 13589, 15669, - 16127, 17751, 18769, 19008, - 18923, 18408, 18205, 18625, - 18634, 18561, 18418, 18753, - 18828, 18795, 18807, 18587, - 18548, 18575, 18676, 18822, - 18826, 18997, 19255, 19619, - 19654, 19896, 20028, 20348, - 20372, 20564, 20679, 20963, - 21037, 21126, 21353, 21502, - 21584, 21596, 21725, 21906, - 21850, 21983, 22057, 22147, - 22195, 22254, 22284, 23283, - // QP = 10 NEW - - 0, 0, 0, 0, - 0, 0, 7397, 9510, - 9849, 10958, 11724, 12152, - 12174, 12162, 12304, 14418, - 14880, 16525, 17551, 17785, - 17697, 17172, 16963, 17382, - 17391, 17317, 17173, 17510, - 17585, 17553, 17566, 17348, - 17308, 17339, 17440, 17588, - 17592, 17764, 18025, 18389, - 18425, 18667, 18799, 19121, - 19145, 19337, 19453, 19735, - 19811, 19901, 20127, 20276, - 20361, 20370, 20500, 20680, - 20624, 20757, 20830, 20920, - 20969, 21028, 21057, 22059, - // QP = 11 NEW - 0, 0, 0, 0, - 0, 0, 6115, 8119, - 8448, 9531, 10277, 10703, - 10726, 10716, 10862, 13003, - 13473, 15143, 16186, 16425, - 16335, 15800, 15587, 16006, - 16015, 15936, 15787, 16125, - 16201, 16167, 16181, 15959, - 15919, 15949, 16052, 16201, - 16205, 16379, 16643, 17012, - 17049, 17293, 17427, 17753, - 17775, 17971, 18089, 18375, - 18449, 18540, 18769, 18922, - 19006, 19015, 19146, 19329, - 19273, 19408, 19481, 19571, - 19620, 19679, 19709, 20724, - - // QP = 12 NEW - 0, 0, 0, 0, - 0, 0, 5252, 7138, - 7459, 8506, 9229, 9649, - 9671, 9663, 9813, 11944, - 12414, 14077, 15119, 15365, - 15276, 14745, 14532, 14951, - 14960, 14880, 14730, 15065, - 15140, 15105, 15117, 14895, - 14855, 14885, 14988, 15136, - 15139, 15314, 15578, 15944, - 15982, 16227, 16360, 16686, - 16709, 16904, 17022, 17309, - 17384, 17473, 17705, 17854, - 17939, 17949, 18080, 18263, - 18206, 18341, 18416, 18505, - 18554, 18613, 18644, 19661, - - // QP = 13 NEW - 0, 0, 0, 0, - 0, 0, 4362, 6083, - 6381, 7376, 8070, 8477, - 8501, 8497, 8654, 10759, - 11223, 12872, 13908, 14159, - 14073, 13550, 13343, 13759, - 13770, 13689, 13539, 13871, - 13947, 13909, 13919, 13694, - 13653, 13681, 13782, 13927, - 13931, 14103, 14365, 14731, - 14769, 15011, 15144, 15469, - 15492, 15686, 15803, 16089, - 16164, 16254, 16483, 16634, - 16717, 16728, 16860, 17041, - 16982, 17119, 17193, 17282, - 17332, 17391, 17421, 18442, - - // QP = 14 - 0, 0, 0, 0, - 0, 0, 3448, 4986, - 5252, 6165, 6825, 7218, - 7242, 7246, 7404, 9462, - 9917, 11539, 12565, 12826, - 12742, 12232, 12031, 12452, - 12461, 12382, 12233, 12563, - 12640, 12601, 12608, 12376, - 12336, 12360, 12457, 12598, - 12601, 12771, 13030, 13394, - 13431, 13673, 13805, 14127, - 14150, 14343, 14461, 14745, - 14820, 14910, 15139, 15289, - 15374, 15384, 15515, 15699, - 15639, 15774, 15848, 15939, - 15987, 16047, 16078, 17105, - - // QP = 15 NEW - 0, 0, 0, 0, - 0, 0, 2694, 4201, - 4438, 5283, 5894, 6259, - 6284, 6296, 6451, 8442, - 8883, 10461, 11463, 11729, - 11648, 11161, 10973, 11386, - 11395, 11322, 11178, 11505, - 11581, 11542, 11548, 11314, - 11274, 11293, 11386, 11519, - 11521, 11687, 11940, 12297, - 12333, 12569, 12698, 13016, - 13037, 13227, 13343, 13622, - 13696, 13784, 14012, 14158, - 14243, 14251, 14381, 14562, - 14505, 14639, 14712, 14801, - 14852, 14909, 14940, 15967, - - // QP = 16 NEW - 0, 0, 0, 0, - 0, 0, 1798, 3038, - 3259, 4010, 4575, 4973, - 4994, 5035, 5185, 7159, - 7590, 9156, 10154, 10429, - 10350, 9874, 9691, 10106, - 10117, 10042, 9903, 10231, - 10305, 10266, 10272, 10034, - 9993, 10009, 10099, 10226, - 10228, 10391, 10643, 10994, - 11032, 11267, 11395, 11711, - 11732, 11922, 12035, 12315, - 12389, 12476, 12701, 12849, - 12935, 12942, 13073, 13253, - 13195, 13329, 13403, 13490, - 13543, 13600, 13631, 14672, - - // QP = 17 NEW - 0, 0, 0, 0, - 0, 0, 1179, 2079, - 2231, 2726, 2954, 3449, - 3505, 3620, 3838, 5806, - 6225, 7771, 8751, 9036, - 8968, 8503, 8335, 8755, - 8770, 8701, 8566, 8899, - 8970, 8941, 8944, 8707, - 8666, 8679, 8764, 8885, - 8887, 9045, 9293, 9637, - 9670, 9900, 10027, 10336, - 10357, 10544, 10655, 10929, - 11002, 11089, 11309, 11456, - 11541, 11547, 11679, 11858, - 11797, 11931, 12005, 12092, - 12145, 12201, 12232, 13285, - - // QP = 18 NEW - 0, 0, 0, 0, - 0, 0, 916, 1661, - 1767, 2096, 2049, 2022, - 2028, 2223, 2513, 4678, - 5145, 6780, 7769, 8045, - 7974, 7493, 7307, 7726, - 7747, 7679, 7536, 7890, - 7964, 7952, 7967, 7769, - 7725, 7758, 7857, 7998, - 8009, 8165, 8412, 8769, - 8795, 9028, 9151, 9460, - 9477, 9664, 9771, 10042, - 10110, 10199, 10413, 10558, - 10642, 10650, 10778, 10951, - 10893, 11025, 11095, 11183, - 11234, 11290, 11319, 12364, - - // QP = 19 NEW - 0, 0, 0, 0, - 0, 0, 542, 1148, - 1245, 1526, 1487, 1384, - 1361, 1477, 1698, 3622, - 4078, 5620, 6583, 6847, - 6773, 6303, 6124, 6529, - 6546, 6467, 6333, 6655, - 6731, 6712, 6712, 6514, - 6461, 6494, 6610, 6750, - 6765, 6927, 7178, 7536, - 7557, 7807, 7933, 8242, - 8252, 8442, 8548, 8811, - 8887, 8972, 9181, 9327, - 9410, 9414, 9543, 9715, - 9661, 9792, 9859, 9950, - 9996, 10055, 10084, 11139, - - // QP = 20 NEW - 0, 0, 0, 0, - 0, 0, 452, 957, - 729, 949, 1036, 1145, - 1146, 1291, 1514, 2966, - 3294, 4394, 5166, 5627, - 5612, 5435, 5459, 6029, - 6061, 6081, 6062, 6392, - 6459, 6467, 6465, 6331, - 6293, 6334, 6437, 6570, - 6584, 6724, 6941, 7248, - 7265, 7475, 7587, 7836, - 7859, 8017, 8103, 8324, - 8377, 8457, 8620, 8752, - 8813, 8825, 8918, 9078, - 9040, 9138, 9204, 9280, - 9310, 9358, 9389, 10165, - - // QP = 21 NEW - 0, 0, 0, 0, - 0, 0, 376, 797, - 426, 590, 722, 947, - 965, 1129, 1350, 2429, - 2660, 3435, 4054, 4625, - 4649, 4687, 4867, 5566, - 5612, 5719, 5802, 6139, - 6197, 6231, 6226, 6153, - 6129, 6178, 6269, 6395, - 6408, 6527, 6712, 6970, - 6984, 7158, 7255, 7450, - 7484, 7613, 7680, 7863, - 7897, 7972, 8093, 8213, - 8254, 8273, 8334, 8483, - 8459, 8527, 8593, 8655, - 8670, 8709, 8741, 9277, - - // QP = 22 NEW - 0, 0, 0, 0, - 0, 0, 314, 664, - 249, 366, 503, 783, - 812, 987, 1204, 1989, - 2149, 2685, 3182, 3801, - 3852, 4041, 4339, 5140, - 5196, 5378, 5553, 5896, - 5947, 6003, 5997, 5980, - 5969, 6026, 6105, 6224, - 6236, 6336, 6490, 6704, - 6713, 6854, 6939, 7084, - 7128, 7229, 7280, 7429, - 7444, 7515, 7598, 7707, - 7731, 7755, 7788, 7928, - 7915, 7958, 8022, 8072, - 8075, 8105, 8138, 8466, - - // QP = 23 NEW - 0, 0, 0, 0, - 0, 0, 261, 554, - 146, 228, 350, 648, - 684, 863, 1074, 1629, - 1735, 2099, 2497, 3124, - 3192, 3485, 3868, 4746, - 4811, 5057, 5315, 5662, - 5706, 5784, 5776, 5812, - 5814, 5877, 5946, 6058, - 6069, 6151, 6276, 6447, - 6454, 6563, 6636, 6735, - 6788, 6865, 6901, 7018, - 7017, 7084, 7134, 7233, - 7240, 7270, 7278, 7408, - 7407, 7426, 7489, 7529, - 7520, 7543, 7577, 7726, - - // QP = 24 NEW - 0, 0, 0, 0, - 0, 0, 218, 461, - 85, 142, 244, 536, - 576, 755, 958, 1334, - 1402, 1641, 1960, 2567, - 2644, 3005, 3448, 4382, - 4455, 4756, 5087, 5438, - 5475, 5573, 5563, 5649, - 5662, 5732, 5790, 5896, - 5907, 5971, 6068, 6200, - 6204, 6284, 6346, 6403, - 6465, 6519, 6541, 6630, - 6614, 6678, 6697, 6787, - 6781, 6815, 6801, 6923, - 6930, 6930, 6991, 7022, - 7004, 7020, 7055, 7050, - - // QP = 25 NEW - 0, 0, 0, 0, - 0, 7, 19, 48, - 50, 88, 170, 443, - 485, 660, 854, 1092, - 1132, 1283, 1538, 2110, - 2191, 2591, 3074, 4046, - 4125, 4472, 4869, 5223, - 5254, 5369, 5358, 5490, - 5515, 5591, 5639, 5739, - 5749, 5796, 5868, 5963, - 5964, 6017, 6069, 6088, - 6157, 6191, 6200, 6263, - 6235, 6295, 6288, 6369, - 6351, 6389, 6356, 6469, - 6485, 6467, 6527, 6549, - 6523, 6533, 6568, 6434, - - // QP = 26 NEW - 0, 0, 0, 0, - 0, 2, 12, 29, - 30, 53, 105, 283, - 312, 427, 547, 665, - 688, 779, 939, 1306, - 1368, 1691, 2049, 2499, - 2514, 2684, 3153, 3834, - 3904, 4189, 4290, 4491, - 4525, 4616, 4670, 4774, - 4786, 4830, 4900, 4991, - 4994, 5042, 5092, 5118, - 5181, 5213, 5226, 5284, - 5262, 5315, 5314, 5395, - 5375, 5408, 5390, 5488, - 5504, 5491, 5546, 5570, - 5553, 5558, 5590, 5504, - - // QP = 27 NEW - 0, 0, 0, 0, - 0, 2, 9, 20, - 20, 35, 70, 190, - 209, 286, 359, 385, - 384, 393, 484, 662, - 712, 968, 1221, 1573, - 1587, 1801, 2134, 2454, - 2505, 2685, 2843, 3315, - 3389, 3633, 3793, 3968, - 3984, 4036, 4110, 4205, - 4205, 4255, 4304, 4332, - 4386, 4419, 4433, 4492, - 4477, 4522, 4530, 4603, - 4583, 4616, 4602, 4693, - 4707, 4702, 4745, 4770, - 4759, 4766, 4795, 4750, - - // QP = 28 NEW - 0, 0, 0, 0, - 0, 1, 7, 15, - 15, 24, 49, 132, - 145, 197, 245, 248, - 243, 230, 276, 379, - 412, 570, 733, 1049, - 1069, 1175, 1285, 1532, - 1586, 1759, 1918, 2225, - 2276, 2507, 2752, 3096, - 3114, 3240, 3344, 3460, - 3463, 3518, 3571, 3606, - 3650, 3684, 3704, 3760, - 3746, 3788, 3800, 3872, - 3854, 3885, 3877, 3961, - 3973, 3972, 4010, 4031, - 4032, 4037, 4067, 4060, - - // QP = 29 NEW - 0, 0, 0, 0, - 0, 2, 6, 11, - 11, 18, 36, 94, - 103, 139, 171, 169, - 165, 151, 179, 245, - 263, 363, 462, 673, - 696, 790, 868, 1058, - 1097, 1227, 1368, 1612, - 1652, 1818, 2013, 2315, - 2335, 2471, 2595, 2743, - 2753, 2818, 2881, 2923, - 2963, 2994, 3022, 3074, - 3067, 3105, 3120, 3186, - 3167, 3199, 3201, 3272, - 3283, 3287, 3321, 3340, - 3348, 3350, 3377, 3410, - - // QP = 30 NEW - 0, 0, 0, 0, - 0, 0, 5, 9, - 9, 14, 28, 71, - 77, 104, 126, 123, - 120, 108, 128, 176, - 188, 257, 322, 473, - 496, 555, 585, 737, - 775, 902, 1049, 1262, - 1293, 1425, 1590, 1842, - 1865, 1994, 2118, 2279, - 2297, 2371, 2451, 2514, - 2548, 2589, 2620, 2679, - 2677, 2714, 2729, 2789, - 2777, 2809, 2809, 2881, - 2887, 2891, 2920, 2936, - 2958, 2954, 2978, 3037, - - // QP = 31 NEW - 0, 0, 0, 0, - 0, 1, 4, 8, - 7, 11, 21, 52, - 57, 75, 91, 87, - 85, 76, 90, 122, - 129, 175, 219, 328, - 346, 395, 404, 511, - 537, 628, 759, 937, - 968, 1073, 1197, 1400, - 1418, 1520, 1622, 1771, - 1783, 1855, 1933, 2004, - 2030, 2070, 2114, 2175, - 2177, 2210, 2232, 2289, - 2277, 2305, 2313, 2378, - 2384, 2390, 2414, 2428, - 2454, 2450, 2475, 2562, - - // QP = 32 NEW - 0, 0, 0, 0, - 0, 0, 3, 6, - 6, 9, 16, 39, - 42, 55, 66, 63, - 61, 55, 65, 87, - 92, 123, 154, 234, - 247, 285, 289, 367, - 386, 456, 563, 704, - 728, 808, 906, 1061, - 1083, 1160, 1245, 1369, - 1376, 1443, 1516, 1590, - 1611, 1650, 1694, 1756, - 1763, 1793, 1815, 1870, - 1861, 1887, 1899, 1955, - 1959, 1968, 1986, 2004, - 2031, 2027, 2048, 2152, - - // QP = 33 NEW - 0, 0, 0, 0, - 0, 1, 3, 5, - 5, 7, 13, 30, - 32, 42, 50, 47, - 45, 41, 48, 65, - 68, 90, 113, 172, - 183, 211, 212, 271, - 285, 338, 426, 533, - 557, 619, 696, 818, - 835, 898, 966, 1067, - 1077, 1131, 1195, 1273, - 1286, 1329, 1381, 1443, - 1454, 1486, 1507, 1561, - 1553, 1580, 1592, 1641, - 1646, 1656, 1671, 1688, - 1713, 1712, 1733, 1841, - - // QP = 34 NEW - 0, 0, 0, 0, - 0, 0, 2, 4, - 4, 6, 10, 23, - 25, 32, 38, 35, - 34, 31, 36, 49, - 52, 68, 85, 130, - 139, 161, 161, 205, - 216, 258, 330, 414, - 435, 482, 546, 642, - 654, 705, 757, 840, - 847, 894, 949, 1017, - 1028, 1074, 1118, 1195, - 1199, 1239, 1262, 1318, - 1315, 1339, 1352, 1398, - 1402, 1410, 1425, 1440, - 1467, 1466, 1483, 1591, - - // QP = 35 NEW - 0, 0, 0, 0, - 0, 0, 2, 3, - 3, 5, 8, 19, - 20, 25, 30, 27, - 26, 23, 28, 38, - 41, 53, 66, 101, - 107, 125, 124, 160, - 169, 203, 262, 331, - 348, 387, 441, 523, - 529, 569, 616, 685, - 692, 729, 774, 838, - 841, 877, 925, 995, - 1004, 1051, 1076, 1132, - 1137, 1164, 1180, 1223, - 1228, 1237, 1249, 1266, - 1293, 1288, 1309, 1419, - - // QP = 36 NEW - 0, 0, 0, 0, - 0, 1, 1, 3, - 3, 4, 7, 15, - 16, 20, 23, 21, - 20, 18, 22, 30, - 32, 41, 51, 77, - 82, 96, 95, 124, - 130, 158, 204, 261, - 275, 307, 353, 422, - 428, 465, 503, 562, - 568, 601, 641, 700, - 700, 733, 772, 835, - 842, 887, 911, 961, - 972, 994, 1015, 1056, - 1060, 1072, 1083, 1099, - 1124, 1125, 1142, 1246, - - // QP = 37 NEW - 0, 0, 0, 0, - 0, 1, 1, 2, - 2, 3, 6, 12, - 13, 16, 19, 17, - 16, 15, 17, 24, - 26, 33, 41, 62, - 66, 77, 76, 98, - 104, 127, 165, 211, - 223, 250, 290, 349, - 356, 388, 422, 474, - 483, 511, 547, 604, - 602, 632, 668, 725, - 735, 772, 796, 840, - 853, 874, 894, 929, - 937, 951, 960, 977, - 999, 1001, 1018, 1120, - - // QP = 38 NEW - 0, 0, 0, 0, - 0, 0, 1, 2, - 2, 3, 5, 10, - 11, 13, 15, 14, - 13, 12, 14, 19, - 20, 26, 33, 48, - 51, 59, 58, 76, - 80, 98, 127, 163, - 174, 195, 229, 277, - 283, 310, 339, 383, - 392, 417, 448, 499, - 497, 524, 556, 605, - 615, 646, 669, 706, - 718, 736, 757, 787, - 795, 808, 816, 833, - 852, 853, 871, 965, - - // QP = 39 NEW - 0, 0, 0, 0, - 0, 1, 1, 2, - 2, 2, 4, 8, - 9, 11, 12, 11, - 11, 9, 11, 16, - 17, 21, 26, 39, - 41, 47, 46, 60, - 63, 77, 101, 130, - 137, 154, 183, 225, - 230, 252, 278, 317, - 326, 351, 376, 427, - 424, 447, 479, 524, - 534, 562, 583, 618, - 630, 647, 668, 698, - 703, 718, 727, 745, - 761, 763, 779, 873, - - // QP = 40 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 2, 3, 7, - 7, 9, 10, 9, - 8, 8, 9, 13, - 14, 17, 21, 30, - 32, 37, 36, 46, - 48, 59, 77, 99, - 105, 119, 141, 175, - 178, 200, 220, 251, - 261, 280, 301, 348, - 344, 365, 395, 432, - 440, 464, 488, 517, - 528, 544, 563, 592, - 597, 610, 620, 637, - 652, 655, 671, 759, - - // QP = 41 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 2, 3, 6, - 6, 7, 8, 7, - 7, 6, 7, 10, - 11, 14, 17, 25, - 26, 30, 29, 36, - 38, 46, 61, 77, - 82, 92, 111, 137, - 141, 157, 174, 201, - 209, 227, 243, 286, - 280, 299, 326, 359, - 368, 390, 408, 437, - 446, 461, 481, 511, - 515, 529, 539, 556, - 571, 577, 591, 679, - - // QP = 42 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 5, - 5, 6, 7, 6, - 6, 5, 6, 8, - 9, 11, 14, 20, - 20, 23, 22, 28, - 29, 35, 47, 58, - 63, 70, 85, 105, - 108, 122, 133, 156, - 162, 177, 188, 225, - 220, 235, 259, 286, - 296, 314, 328, 353, - 363, 375, 395, 421, - 426, 440, 448, 469, - 478, 490, 500, 588, - - // QP = 43 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 4, - 4, 5, 6, 5, - 5, 4, 5, 7, - 7, 9, 11, 16, - 17, 19, 18, 23, - 24, 28, 38, 46, - 49, 55, 67, 83, - 85, 97, 105, 123, - 128, 141, 149, 180, - 176, 188, 209, 230, - 239, 256, 268, 290, - 297, 311, 328, 349, - 356, 367, 377, 396, - 404, 418, 430, 521, - - // QP = 44 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 3, - 3, 4, 5, 4, - 4, 3, 4, 6, - 6, 8, 9, 13, - 13, 15, 14, 18, - 19, 22, 29, 36, - 38, 43, 51, 64, - 66, 75, 82, 96, - 100, 110, 115, 140, - 137, 146, 163, 180, - 189, 200, 211, 228, - 234, 247, 261, 279, - 282, 295, 301, 320, - 328, 341, 349, 437, - - // QP = 45 NEW - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 1, 3, - 3, 3, 4, 3, - 3, 3, 3, 5, - 5, 6, 7, 10, - 10, 12, 11, 14, - 14, 17, 23, 28, - 29, 33, 40, 49, - 51, 59, 63, 74, - 78, 85, 89, 110, - 106, 114, 128, 141, - 147, 157, 166, 180, - 186, 196, 208, 223, - 226, 238, 242, 260, - 266, 278, 288, 371, - - // QP = 46 NEW - 0, 0, 0, 0, - 0, 0, 0, 1, - 1, 1, 1, 2, - 2, 3, 3, 3, - 3, 2, 3, 4, - 4, 5, 6, 8, - 8, 10, 9, 11, - 12, 14, 18, 22, - 23, 26, 31, 39, - 41, 46, 50, 57, - 61, 67, 70, 86, - 84, 91, 102, 111, - 117, 125, 131, 143, - 149, 157, 167, 179, - 180, 191, 197, 212, - 215, 226, 235, 312, - - // QP = 47 NEW - 0, 0, 0, 0, - 0, 0, 0, 1, - 0, 1, 1, 2, - 2, 2, 3, 2, - 2, 2, 2, 3, - 3, 4, 5, 7, - 7, 8, 7, 9, - 9, 11, 15, 18, - 18, 20, 25, 31, - 32, 36, 39, 46, - 48, 52, 55, 68, - 66, 71, 80, 88, - 92, 97, 103, 113, - 117, 123, 133, 143, - 145, 154, 158, 170, - 174, 184, 189, 260, - - // QP = 48 NEW - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 1, 1, 2, - 2, 2, 2, 2, - 2, 2, 2, 3, - 3, 3, 4, 5, - 5, 6, 6, 7, - 8, 9, 12, 14, - 15, 16, 20, 24, - 25, 29, 31, 36, - 38, 41, 44, 54, - 52, 56, 64, 70, - 73, 77, 82, 91, - 94, 100, 106, 115, - 116, 124, 129, 138, - 141, 150, 155, 218, - - // QP = 49 NEW - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 2, 2, 2, - 1, 1, 2, 2, - 2, 3, 3, 4, - 4, 5, 5, 6, - 6, 7, 9, 11, - 12, 13, 16, 19, - 20, 23, 25, 29, - 30, 33, 35, 43, - 41, 45, 50, 55, - 59, 61, 65, 73, - 76, 80, 86, 92, - 93, 99, 104, 112, - 114, 121, 127, 181, - - // QP = 50 - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 1, - 1, 1, 2, 1, - 1, 1, 1, 2, - 2, 2, 3, 4, - 4, 4, 4, 5, - 5, 6, 8, 9, - 10, 11, 13, 16, - 16, 18, 20, 23, - 24, 26, 28, 35, - 32, 35, 40, 44, - 46, 48, 52, 57, - 60, 64, 67, 73, - 74, 79, 83, 90, - 91, 97, 102, 148, - - // QP = 51 - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 1, - 1, 1, 1, 1, - 1, 1, 1, 2, - 2, 2, 2, 3, - 3, 4, 3, 4, - 4, 5, 6, 7, - 8, 9, 11, 13, - 14, 15, 16, 19, - 20, 21, 22, 28, - 26, 29, 32, 35, - 38, 39, 42, 46, - 49, 52, 54, 60, - 61, 64, 67, 73, - 73, 77, 83, 122, -}; - - - -static const EB_Bit_Number initialRateControlIntraSad64x64Tables[] = { - // QP = 0 NEW - 0, 0, 0, 0, - 0, 0, 0, 22636, - 22804, 23718, 23852, 24210, - 23882, 24027, 24723, 25937, - 24896, 27051, 30603, 31453, - 30784, 29404, 30546, 31836, - 32090, 31576, 31532, 32354, - 31761, 32869, 32349, 31100, - 32368, 32773, 31148, 31299, - 32400, 31203, 32530, 33114, - 31942, 32664, 33074, 32774, - 32967, 33796, 34026, 33873, - 34018, 33566, 33505, 33776, - 34656, 33412, 33047, 34654, - 34543, 33790, 34751, 34184, - 34744, 34563, 34510, 35474, - // QP = 1 NEW - 0, 0, 0, 0, - 0, 0, 0, 21659, - 21816, 22686, 22860, 23146, - 22961, 22904, 23810, 24897, - 23850, 26033, 29440, 30276, - 29599, 28297, 29378, 30650, - 30930, 30445, 30407, 31191, - 30586, 31676, 31198, 30016, - 31223, 31615, 30048, 30194, - 31185, 30078, 31338, 31915, - 30882, 31510, 31926, 31660, - 31791, 32623, 32868, 32707, - 32824, 32408, 32327, 32611, - 33459, 32300, 31943, 33432, - 33331, 32635, 33511, 33026, - 33511, 33404, 33292, 34267, - // QP = 2 - 0, 0, 0, 0, - 0, 0, 0, 20399, - 20567, 21406, 21530, 21929, - 21604, 21684, 22474, 23556, - 22611, 24706, 28076, 28899, - 28275, 26929, 28047, 29297, - 29548, 29095, 29020, 29833, - 29249, 30324, 29833, 28626, - 29780, 30181, 28604, 28818, - 29824, 28750, 29998, 30512, - 29412, 30121, 30537, 30248, - 30429, 31252, 31414, 31288, - 31421, 30982, 30933, 31208, - 32051, 30854, 30518, 31943, - 31952, 31237, 32142, 31609, - 32102, 31959, 31906, 32837, - // QP = 3 - 0, 0, 0, 0, - 0, 0, 0, 19278, - 19449, 20318, 20495, 20815, - 20537, 20503, 21392, 22463, - 21541, 23616, 26914, 27740, - 27129, 25796, 26901, 28122, - 28442, 27938, 27874, 28713, - 28091, 29162, 28709, 27509, - 28679, 29114, 27560, 27700, - 28685, 27664, 28835, 29447, - 28371, 28998, 29423, 29193, - 29293, 30094, 30347, 30154, - 30299, 29876, 29795, 30090, - 30902, 29774, 29426, 30865, - 30778, 30106, 30959, 30464, - 30976, 30850, 30753, 31702, - // QP = 4 - 0, 0, 0, 0, - 0, 0, 0, 18171, - 18354, 19219, 19332, 19723, - 19474, 19490, 20348, 21392, - 20368, 22505, 25809, 26611, - 25991, 24661, 25761, 26942, - 27288, 26798, 26731, 27550, - 26911, 28042, 27558, 26384, - 27526, 27936, 26419, 26553, - 27574, 26480, 27685, 28267, - 27204, 27832, 28294, 28032, - 28155, 28976, 29137, 28959, - 29115, 28814, 28717, 28962, - 29719, 28627, 28291, 29654, - 29652, 28941, 29761, 29304, - 29797, 29674, 29572, 30538, - // QP = 5 - 0, 0, 0, 0, - 0, 0, 0, 17304, - 17457, 18373, 18467, 18776, - 18583, 18576, 19376, 20392, - 19573, 21570, 24793, 25581, - 24983, 23657, 24776, 25934, - 26202, 25721, 25718, 26507, - 25892, 26948, 26449, 25395, - 26469, 26895, 25391, 25548, - 26495, 25496, 26647, 27165, - 26147, 26758, 27200, 26942, - 27075, 27839, 28026, 27878, - 28012, 27638, 27560, 27891, - 28602, 27515, 27171, 28499, - 28483, 27837, 28660, 28174, - 28676, 28553, 28469, 29365, - // QP = 6 - 0, 0, 0, 0, - 0, 0, 0, 15929, - 16089, 16985, 17125, 17491, - 17251, 17283, 18054, 19104, - 18314, 20221, 23516, 24335, - 23720, 22396, 23479, 24639, - 24980, 24523, 24413, 25215, - 24647, 25710, 25220, 24072, - 25195, 25631, 24133, 24282, - 25225, 24149, 25378, 25927, - 24881, 25491, 25929, 25656, - 25833, 26621, 26803, 26604, - 26773, 26352, 26292, 26584, - 27341, 26252, 25940, 27300, - 27286, 26603, 27454, 26947, - 27432, 27279, 27167, 28112, - // QP = 7 - 0, 0, 0, 0, - 0, 0, 0, 14880, - 15069, 15956, 16137, 16474, - 16195, 16274, 17013, 18093, - 17175, 19187, 22485, 23231, - 22634, 21368, 22434, 23566, - 23858, 23427, 23355, 24114, - 23568, 24595, 24112, 23011, - 24110, 24575, 23075, 23184, - 24166, 23173, 24319, 24888, - 23815, 24442, 24833, 24637, - 24776, 25525, 25705, 25503, - 25659, 25296, 25215, 25490, - 26246, 25199, 24904, 26188, - 26180, 25489, 26316, 25833, - 26304, 26186, 26103, 27009, - // QP = 8 - 0, 0, 0, 0, - 0, 0, 0, 13746, - 13894, 14720, 14893, 15257, - 14973, 15025, 15803, 16851, - 15988, 17920, 21188, 21995, - 21377, 20093, 21107, 22309, - 22570, 22144, 22077, 22829, - 22295, 23282, 22820, 21751, - 22828, 23247, 21787, 21932, - 22876, 21875, 23024, 23546, - 22486, 23156, 23575, 23275, - 23442, 24200, 24380, 24242, - 24385, 23965, 23914, 24167, - 24947, 23860, 23570, 24889, - 24872, 24182, 25009, 24486, - 25011, 24872, 24812, 25682, - // QP = 9 NEW - 0, 0, 0, 0, - 0, 0, 0, 12644, - 12844, 13728, 13872, 14304, - 14018, 13956, 14863, 15842, - 14974, 16981, 20166, 20918, - 20330, 19073, 20106, 21294, - 21529, 21121, 21044, 21784, - 21235, 22283, 21797, 20747, - 21782, 22261, 20823, 20944, - 21863, 20876, 22020, 22541, - 21425, 22116, 22537, 22261, - 22440, 23180, 23345, 23186, - 23330, 22950, 22880, 23167, - 23891, 22853, 22545, 23817, - 23831, 23158, 23965, 23527, - 23957, 23852, 23782, 24640, - // QP = 10 NEW - - 0, 0, 0, 0, - 0, 0, 0, 11514, - 11684, 12528, 12643, 13059, - 12783, 12779, 13652, 14690, - 13845, 15753, 18925, 19726, - 19150, 17862, 18913, 20057, - 20354, 19916, 19866, 20598, - 20056, 21068, 20616, 19489, - 20567, 21018, 19535, 19650, - 20618, 19626, 20761, 21328, - 20235, 20913, 21289, 21021, - 21183, 21922, 22118, 21999, - 22111, 21710, 21680, 21946, - 22663, 21580, 21278, 22568, - 22616, 21924, 22754, 22227, - 22784, 22604, 22541, 23392, - // QP = 11 NEW - 0, 0, 0, 0, - 0, 0, 0, 10630, - 10786, 11619, 11781, 12167, - 11834, 11885, 12764, 13787, - 12899, 14895, 18047, 18837, - 18207, 16962, 17993, 19141, - 19397, 18970, 18891, 19631, - 19055, 20083, 19662, 18612, - 19654, 20150, 18668, 18764, - 19780, 18745, 19902, 20417, - 19290, 20002, 20427, 20163, - 20268, 21030, 21198, 21045, - 21230, 20798, 20725, 21031, - 21732, 20708, 20418, 21640, - 21691, 20988, 21828, 21315, - 21796, 21639, 21631, 22465, - - // QP = 12 NEW - 0, 0, 0, 0, - 0, 0, 0, 9344, - 9545, 10341, 10496, 10916, - 10660, 10698, 11527, 12506, - 11605, 13628, 16847, 17618, - 17024, 15743, 16781, 17898, - 18200, 17803, 17668, 18421, - 17851, 18901, 18406, 17358, - 18429, 18925, 17404, 17517, - 18516, 17530, 18701, 19254, - 18116, 18813, 19232, 18926, - 19081, 19815, 19993, 19899, - 20042, 19552, 19555, 19803, - 20554, 19543, 19182, 20473, - 20487, 19760, 20636, 20171, - 20629, 20462, 20377, 21271, - - // QP = 13 NEW - 0, 0, 0, 0, - 0, 0, 0, 8432, - 8573, 9428, 9562, 9983, - 9642, 9722, 10557, 11542, - 10651, 12611, 15744, 16537, - 15938, 14720, 15759, 16886, - 17132, 16736, 16634, 17395, - 16836, 17854, 17393, 16305, - 17394, 17815, 16345, 16498, - 17465, 16440, 17592, 18156, - 17035, 17698, 18106, 17828, - 17962, 18724, 18871, 18749, - 18871, 18503, 18497, 18697, - 19406, 18392, 18068, 19397, - 19393, 18734, 19512, 19065, - 19520, 19379, 19308, 20139, - - // QP = 14 NEW - 0, 0, 0, 0, - 0, 0, 0, 7285, - 7445, 8289, 8492, 8746, - 8455, 8574, 9369, 10346, - 9473, 11443, 14522, 15289, - 14716, 13523, 14566, 15683, - 15915, 15513, 15453, 16193, - 15665, 16634, 16164, 15107, - 16197, 16592, 15159, 15353, - 16256, 15203, 16417, 16928, - 15827, 16477, 16857, 16635, - 16703, 17512, 17632, 17548, - 17681, 17234, 17208, 17467, - 18197, 17164, 16858, 18147, - 18142, 17480, 18283, 17773, - 18286, 18110, 18084, 18902, - - // QP = 15 NEW - 0, 0, 0, 0, - 0, 0, 0, 6214, - 6406, 7229, 7436, 7675, - 7449, 7582, 8347, 9325, - 8482, 10387, 13458, 14232, - 13671, 12453, 13483, 14620, - 14823, 14430, 14398, 15153, - 14606, 15605, 15137, 14080, - 15145, 15569, 14115, 14300, - 15182, 14186, 15350, 15858, - 14756, 15452, 15763, 15516, - 15667, 16472, 16569, 16462, - 16563, 16178, 16134, 16424, - 17139, 16112, 15795, 17090, - 17063, 16422, 17253, 16707, - 17208, 17077, 17011, 17839, - - // QP = 16 NEW - 0, 0, 0, 0, - 0, 0, 0, 5089, - 5295, 6085, 6250, 6500, - 6352, 6344, 7187, 8204, - 7275, 9209, 12282, 13060, - 12449, 11293, 12320, 13458, - 13687, 13243, 13218, 13965, - 13458, 14422, 13950, 12890, - 13937, 14400, 12961, 13098, - 14038, 13030, 14174, 14678, - 13614, 14266, 14592, 14359, - 14528, 15266, 15432, 15313, - 15391, 15032, 14973, 15198, - 15971, 14933, 14689, 15883, - 15940, 15238, 16039, 15559, - 16021, 15913, 15859, 16669, - - // QP = 17 NEW - 0, 0, 0, 0, - 0, 0, 0, 4258, - 4410, 5177, 5338, 5619, - 5381, 5501, 6175, 7168, - 6335, 8238, 11256, 12062, - 11451, 10296, 11287, 12446, - 12658, 12254, 12223, 12948, - 12435, 13416, 12951, 11897, - 12955, 13370, 11964, 12147, - 13009, 12010, 13184, 13684, - 12626, 13289, 13645, 13353, - 13519, 14268, 14393, 14302, - 14362, 14079, 13991, 14218, - 14980, 13929, 13593, 14932, - 14914, 14211, 15021, 14514, - 15051, 14897, 14839, 15651, - - // QP = 18 NEW - 0, 0, 0, 0, - 0, 0, 0, 3353, - 3493, 4214, 4330, 4599, - 4420, 4486, 5191, 6224, - 5417, 7217, 10145, 10892, - 10338, 9231, 10181, 11268, - 11489, 11157, 11127, 11804, - 11248, 12314, 11820, 10808, - 11808, 12212, 10874, 11011, - 11873, 10888, 12050, 12523, - 11467, 12150, 12457, 12199, - 12363, 13104, 13245, 13158, - 13203, 12877, 12795, 13042, - 13775, 12697, 12444, 13776, - 13699, 13087, 13831, 13356, - 13842, 13685, 13659, 14495, - - // QP = 19 NEW - 0, 0, 0, 0, - 0, 0, 0, 2656, - 2789, 3394, 3522, 3849, - 3653, 3726, 4374, 5366, - 4579, 6257, 9138, 9873, - 9361, 8274, 9211, 10283, - 10512, 10161, 10125, 10819, - 10289, 11250, 10834, 9824, - 10812, 11198, 9848, 10057, - 10892, 9901, 11027, 11498, - 10424, 11180, 11421, 11178, - 11365, 12108, 12208, 12108, - 12181, 11846, 11802, 12052, - 12715, 11708, 11417, 12699, - 12698, 12094, 12816, 12368, - 12822, 12686, 12596, 13468, - - // QP = 20 NEW - 0, 0, 0, 0, - 0, 0, 0, 1940, - 2058, 2584, 2713, 3020, - 2842, 2981, 3498, 4392, - 3672, 5306, 8051, 8729, - 8210, 7210, 8107, 9179, - 9353, 8998, 9009, 9650, - 9133, 10105, 9694, 8749, - 9676, 10028, 8700, 8920, - 9732, 8790, 9903, 10317, - 9341, 10004, 10282, 10031, - 10174, 10903, 11012, 10965, - 10979, 10659, 10612, 10886, - 11532, 10521, 10271, 11524, - 11478, 10898, 11633, 11217, - 11601, 11546, 11426, 12284, - - // QP = 21 NEW - 0, 0, 0, 0, - 0, 0, 0, 1406, - 1508, 1943, 2045, 2362, - 2225, 2298, 2817, 3561, - 3002, 4491, 7094, 7752, - 7280, 6353, 7152, 8168, - 8358, 8050, 8010, 8731, - 8205, 9085, 8725, 7739, - 8685, 9004, 7794, 7939, - 8685, 7772, 8871, 9286, - 8443, 8992, 9232, 8986, - 9154, 9850, 10029, 9921, - 9928, 9675, 9598, 9874, - 10484, 9483, 9189, 10483, - 10406, 9902, 10581, 10189, - 10561, 10487, 10412, 11239, - - // QP = 22 NEW - 0, 0, 0, 0, - 0, 0, 0, 935, - 1011, 1343, 1472, 1733, - 1660, 1720, 2176, 2820, - 2348, 3666, 6111, 6765, - 6356, 5438, 6227, 7191, - 7333, 7061, 7035, 7716, - 7196, 8040, 7699, 6744, - 7653, 7934, 6760, 6927, - 7612, 6791, 7780, 8204, - 7379, 7950, 8184, 7917, - 8047, 8729, 8926, 8795, - 8828, 8569, 8493, 8741, - 9399, 8372, 8132, 9400, - 9335, 8789, 9462, 9097, - 9512, 9361, 9293, 10111, - - // QP = 23 NEW - 0, 0, 0, 0, - 0, 0, 0, 661, - 727, 969, 1068, 1324, - 1298, 1316, 1715, 2268, - 1927, 3027, 5217, 5826, - 5467, 4689, 5374, 6329, - 6449, 6197, 6175, 6850, - 6358, 7124, 6848, 5923, - 6775, 7011, 5927, 6044, - 6714, 5934, 6824, 7264, - 6566, 7040, 7216, 7010, - 7126, 7759, 8012, 7799, - 7878, 7670, 7532, 7778, - 8405, 7457, 7194, 8406, - 8305, 7845, 8424, 8076, - 8507, 8377, 8315, 9114, - - // QP = 24 NEW - 0, 0, 0, 0, - 0, 0, 0, 433, - 473, 640, 714, 997, - 974, 998, 1361, 1769, - 1582, 2469, 4379, 4973, - 4661, 4025, 4625, 5495, - 5638, 5381, 5373, 6007, - 5563, 6248, 6010, 5139, - 5912, 6132, 5076, 5265, - 5826, 5145, 5960, 6369, - 5749, 6104, 6263, 6131, - 6204, 6805, 7046, 6860, - 6895, 6746, 6630, 6825, - 7417, 6535, 6309, 7431, - 7362, 6959, 7490, 7128, - 7533, 7408, 7376, 8135, - - // QP = 25 NEW - 0, 0, 0, 0, - 0, 0, 0, 281, - 305, 428, 485, 759, - 712, 822, 1059, 1402, - 1277, 1989, 3535, 4091, - 3856, 3359, 3895, 4741, - 4823, 4637, 4664, 5243, - 4832, 5420, 5230, 4440, - 5157, 5255, 4338, 4474, - 5008, 4400, 5091, 5500, - 4920, 5251, 5424, 5279, - 5343, 5856, 6172, 5972, - 5938, 5857, 5724, 5987, - 6459, 5649, 5452, 6503, - 6372, 6088, 6481, 6208, - 6612, 6534, 6456, 7192, - - // QP = 26 NEW - 0, 0, 0, 0, - 0, 0, 0, 168, - 182, 253, 312, 561, - 527, 587, 820, 1060, - 1007, 1533, 2640, 3168, - 2976, 2677, 3140, 3886, - 3925, 3845, 3906, 4416, - 4100, 4581, 4474, 3714, - 4320, 4428, 3600, 3747, - 4104, 3643, 4239, 4590, - 4103, 4338, 4537, 4414, - 4477, 4908, 5168, 4950, - 4978, 4908, 4813, 5028, - 5468, 4758, 4631, 5521, - 5401, 5183, 5452, 5219, - 5575, 5535, 5480, 6192, - - // QP = 27 NEW - 0, 0, 0, 0, - 0, 0, 0, 121, - 126, 162, 208, 427, - 399, 484, 653, 857, - 833, 1176, 1954, 2409, - 2279, 2121, 2491, 3184, - 3186, 3190, 3264, 3753, - 3454, 3896, 3796, 3155, - 3670, 3713, 3026, 3121, - 3433, 3044, 3567, 3811, - 3430, 3652, 3769, 3682, - 3733, 4154, 4365, 4131, - 4206, 4147, 4064, 4280, - 4619, 3989, 3880, 4674, - 4623, 4438, 4639, 4398, - 4764, 4760, 4683, 5368, - - // QP = 28 NEW - 0, 0, 0, 0, - 0, 0, 0, 88, - 87, 110, 147, 316, - 323, 365, 518, 645, - 697, 890, 1300, 1660, - 1589, 1580, 1857, 2407, - 2430, 2486, 2580, 3032, - 2800, 3167, 3123, 2566, - 2982, 3011, 2438, 2555, - 2710, 2473, 2877, 3069, - 2758, 2947, 3036, 3008, - 3012, 3348, 3507, 3381, - 3433, 3353, 3291, 3511, - 3734, 3254, 3196, 3810, - 3805, 3686, 3766, 3622, - 3874, 3949, 3861, 4527, - - // QP = 29 NEW - 0, 0, 0, 0, - 0, 0, 0, 70, - 70, 82, 105, 257, - 262, 314, 427, 515, - 577, 686, 849, 1113, - 1086, 1166, 1360, 1798, - 1803, 1922, 2021, 2412, - 2214, 2553, 2572, 2127, - 2416, 2399, 1972, 2044, - 2154, 2022, 2334, 2447, - 2152, 2391, 2448, 2424, - 2450, 2706, 2882, 2713, - 2737, 2732, 2682, 2810, - 3021, 2630, 2690, 3092, - 3118, 3042, 3067, 2908, - 3158, 3250, 3187, 3812, - - // QP = 30 NEW - 0, 0, 0, 0, - 0, 0, 0, 58, - 62, 65, 88, 217, - 223, 283, 355, 420, - 482, 553, 557, 776, - 767, 895, 1043, 1381, - 1376, 1483, 1600, 1979, - 1767, 2107, 2175, 1787, - 2037, 1943, 1627, 1710, - 1752, 1711, 1926, 2039, - 1819, 1987, 2059, 2071, - 2027, 2256, 2376, 2231, - 2257, 2290, 2300, 2343, - 2522, 2199, 2278, 2595, - 2641, 2613, 2566, 2501, - 2601, 2743, 2741, 3315, - - // QP = 31 NEW - 0, 0, 0, 0, - 0, 0, 0, 52, - 52, 57, 75, 176, - 189, 239, 295, 353, - 412, 438, 336, 475, - 488, 636, 742, 957, - 954, 1084, 1195, 1457, - 1355, 1587, 1640, 1445, - 1565, 1522, 1295, 1377, - 1349, 1412, 1541, 1597, - 1403, 1586, 1618, 1644, - 1636, 1759, 1887, 1745, - 1758, 1840, 1821, 1836, - 1945, 1757, 1857, 2028, - 2138, 2102, 2059, 2018, - 2065, 2198, 2204, 2733, - - // QP = 32 NEW - 0, 0, 0, 0, - 0, 0, 0, 46, - 44, 50, 69, 154, - 155, 198, 242, 290, - 335, 334, 189, 266, - 295, 428, 486, 608, - 612, 720, 823, 1013, - 936, 1104, 1173, 1119, - 1159, 1084, 1024, 1064, - 1014, 1101, 1176, 1197, - 1096, 1249, 1233, 1279, - 1268, 1360, 1426, 1326, - 1318, 1453, 1438, 1407, - 1490, 1344, 1505, 1539, - 1686, 1665, 1569, 1580, - 1625, 1698, 1766, 2206, - - // QP = 33 NEW - 0, 0, 0, 0, - 0, 0, 0, 43, - 40, 45, 60, 135, - 148, 175, 194, 228, - 290, 273, 121, 159, - 192, 308, 339, 408, - 399, 489, 575, 694, - 651, 753, 846, 873, - 866, 799, 810, 870, - 796, 898, 934, 950, - 872, 983, 1000, 1009, - 1001, 1048, 1082, 1023, - 1032, 1144, 1171, 1111, - 1145, 1066, 1242, 1204, - 1335, 1360, 1294, 1299, - 1281, 1328, 1440, 1815, - - // QP = 34 NEW - 0, 0, 0, 0, - 0, 0, 0, 37, - 35, 39, 55, 111, - 136, 140, 169, 190, - 249, 225, 86, 102, - 138, 239, 250, 262, - 270, 327, 405, 457, - 458, 512, 590, 678, - 636, 577, 651, 694, - 623, 738, 744, 741, - 699, 818, 803, 821, - 815, 833, 846, 825, - 812, 953, 932, 881, - 885, 856, 1040, 954, - 1069, 1077, 1039, 1062, - 1041, 1069, 1200, 1503, - - // QP = 35 NEW - 0, 0, 0, 0, - 0, 0, 0, 33, - 32, 35, 47, 109, - 114, 127, 147, 158, - 201, 195, 75, 87, - 112, 197, 209, 202, - 210, 253, 314, 346, - 355, 400, 456, 567, - 511, 466, 559, 612, - 524, 659, 638, 640, - 603, 711, 668, 734, - 695, 691, 701, 696, - 693, 817, 820, 736, - 750, 763, 919, 820, - 925, 920, 911, 940, - 892, 914, 1057, 1317, - - // QP = 36 NEW - 0, 0, 0, 0, - 0, 0, 0, 30, - 29, 32, 45, 85, - 95, 100, 121, 143, - 167, 164, 61, 71, - 92, 155, 166, 158, - 156, 195, 232, 246, - 271, 296, 335, 471, - 386, 363, 468, 508, - 441, 558, 542, 526, - 503, 613, 567, 614, - 586, 590, 582, 591, - 581, 697, 694, 619, - 611, 657, 784, 697, - 796, 771, 773, 785, - 767, 781, 883, 1131, - - // QP = 37 NEW - 0, 0, 0, 0, - 0, 0, 0, 28, - 28, 29, 39, 81, - 82, 102, 106, 119, - 140, 137, 55, 62, - 80, 142, 142, 136, - 134, 170, 202, 213, - 224, 247, 274, 402, - 322, 319, 406, 448, - 399, 499, 477, 466, - 459, 539, 490, 553, - 526, 510, 512, 532, - 520, 623, 624, 564, - 553, 587, 704, 609, - 723, 691, 682, 704, - 675, 680, 814, 1022, - - // QP = 38 NEW - 0, 0, 0, 0, - 0, 0, 0, 25, - 25, 26, 35, 70, - 67, 88, 90, 100, - 114, 117, 45, 52, - 67, 114, 112, 104, - 108, 133, 157, 167, - 174, 192, 214, 323, - 265, 250, 333, 373, - 340, 416, 388, 402, - 401, 453, 427, 465, - 456, 441, 441, 458, - 438, 522, 534, 490, - 484, 513, 603, 519, - 613, 587, 590, 608, - 602, 580, 696, 888, - - // QP = 39 NEW - 0, 0, 0, 0, - 0, 0, 0, 23, - 23, 24, 30, 60, - 60, 81, 82, 83, - 102, 104, 40, 47, - 60, 97, 101, 96, - 95, 122, 136, 145, - 160, 169, 185, 285, - 228, 214, 301, 323, - 301, 375, 362, 355, - 359, 406, 388, 416, - 422, 400, 397, 413, - 392, 471, 487, 451, - 432, 455, 543, 480, - 562, 536, 527, 560, - 550, 534, 639, 812, - - // QP = 40 NEW - 0, 0, 0, 0, - 0, 0, 0, 22, - 21, 22, 30, 59, - 56, 66, 69, 68, - 79, 83, 35, 41, - 50, 80, 87, 81, - 78, 100, 107, 116, - 130, 133, 152, 238, - 187, 185, 252, 279, - 256, 314, 302, 308, - 297, 341, 321, 365, - 366, 347, 345, 346, - 339, 403, 417, 392, - 379, 413, 477, 419, - 490, 455, 463, 474, - 480, 463, 562, 714, - - // QP = 41 NEW - 0, 0, 0, 0, - 0, 0, 0, 21, - 20, 23, 28, 56, - 51, 54, 56, 65, - 65, 66, 33, 36, - 45, 68, 75, 73, - 68, 88, 101, 100, - 107, 119, 134, 204, - 161, 161, 225, 248, - 234, 274, 273, 275, - 275, 306, 288, 338, - 322, 309, 318, 315, - 307, 353, 379, 348, - 352, 375, 425, 388, - 438, 420, 418, 427, - 450, 420, 497, 653, - - // QP = 42 NEW - 0, 0, 0, 0, - 0, 0, 0, 19, - 18, 19, 27, 41, - 44, 49, 47, 54, - 52, 59, 30, 31, - 37, 59, 64, 62, - 55, 76, 82, 84, - 89, 96, 114, 167, - 141, 144, 189, 216, - 197, 235, 228, 233, - 235, 272, 252, 287, - 283, 270, 277, 277, - 265, 319, 334, 300, - 305, 325, 376, 340, - 376, 366, 363, 375, - 396, 370, 447, 574, - - // QP = 43 NEW - 0, 0, 0, 0, - 0, 0, 0, 19, - 18, 19, 23, 40, - 39, 41, 46, 49, - 41, 48, 26, 28, - 32, 50, 51, 53, - 50, 61, 74, 75, - 80, 84, 97, 151, - 128, 124, 168, 186, - 182, 208, 205, 204, - 207, 235, 223, 251, - 260, 244, 241, 243, - 242, 284, 289, 284, - 280, 296, 332, 308, - 333, 324, 316, 341, - 361, 335, 404, 524, - - // QP = 44 NEW - 0, 0, 0, 0, - 0, 0, 0, 17, - 16, 18, 20, 35, - 34, 40, 41, 37, - 43, 45, 23, 25, - 30, 41, 43, 42, - 40, 55, 60, 62, - 66, 74, 80, 120, - 100, 105, 140, 150, - 149, 172, 171, 177, - 171, 196, 192, 209, - 220, 211, 202, 204, - 206, 253, 251, 240, - 239, 255, 286, 275, - 273, 281, 284, 283, - 307, 281, 334, 453, - - // QP = 45 NEW - 0, 0, 0, 0, - 0, 0, 0, 15, - 15, 16, 21, 33, - 33, 34, 32, 32, - 40, 37, 19, 22, - 25, 36, 37, 36, - 35, 47, 51, 49, - 56, 59, 68, 102, - 86, 93, 114, 136, - 123, 156, 138, 142, - 147, 160, 157, 179, - 194, 182, 184, 190, - 176, 218, 213, 212, - 200, 224, 249, 239, - 246, 244, 240, 254, - 280, 247, 302, 395, - - // QP = 46 NEW - 0, 0, 0, 0, - 0, 0, 0, 14, - 15, 15, 17, 31, - 32, 34, 32, 31, - 33, 30, 18, 20, - 22, 31, 33, 32, - 30, 39, 42, 43, - 44, 49, 60, 87, - 71, 77, 104, 110, - 110, 126, 119, 131, - 128, 137, 138, 155, - 164, 149, 153, 154, - 150, 190, 179, 182, - 182, 193, 210, 207, - 220, 217, 220, 212, - 234, 218, 259, 343, - - // QP = 47 NEW - 0, 0, 0, 0, - 0, 0, 0, 13, - 15, 15, 19, 30, - 30, 28, 29, 28, - 28, 27, 16, 18, - 19, 25, 29, 27, - 26, 33, 35, 38, - 38, 39, 51, 73, - 58, 62, 82, 97, - 97, 104, 97, 107, - 106, 110, 121, 130, - 145, 134, 129, 136, - 124, 152, 153, 161, - 160, 163, 180, 182, - 185, 184, 183, 188, - 202, 183, 221, 297, - - // QP = 48 NEW - 0, 0, 0, 0, - 0, 0, 0, 12, - 12, 13, 17, 27, - 26, 29, 25, 26, - 26, 24, 15, 17, - 17, 24, 26, 25, - 28, 28, 30, 32, - 31, 35, 42, 58, - 50, 54, 65, 80, - 80, 87, 85, 93, - 87, 96, 100, 111, - 119, 118, 114, 117, - 115, 144, 127, 141, - 135, 145, 149, 158, - 158, 160, 151, 160, - 183, 160, 190, 259, - - // QP = 49 NEW - 0, 0, 0, 0, - 0, 0, 0, 11, - 12, 12, 16, 23, - 22, 23, 22, 23, - 23, 24, 13, 15, - 16, 21, 21, 22, - 22, 25, 28, 31, - 27, 29, 35, 46, - 45, 46, 58, 70, - 65, 74, 67, 80, - 78, 79, 80, 95, - 102, 100, 93, 97, - 95, 120, 106, 119, - 121, 128, 128, 142, - 132, 139, 137, 135, - 158, 139, 162, 223, - - // QP = 50 NEW - 0, 0, 0, 0, - 0, 0, 0, 11, - 11, 12, 15, 22, - 19, 22, 19, 20, - 21, 21, 14, 14, - 16, 18, 19, 19, - 20, 21, 23, 24, - 24, 26, 32, 40, - 36, 40, 49, 56, - 56, 59, 56, 69, - 68, 63, 73, 80, - 84, 86, 84, 81, - 79, 103, 88, 100, - 101, 105, 109, 124, - 109, 109, 113, 111, - 135, 120, 142, 191, - - // QP = 51 NEW - 0, 0, 0, 0, - 0, 0, 0, 10, - 11, 12, 14, 20, - 18, 22, 18, 21, - 21, 20, 11, 13, - 14, 17, 16, 16, - 19, 20, 24, 21, - 22, 24, 28, 33, - 34, 38, 42, 51, - 42, 49, 47, 59, - 62, 58, 62, 67, - 68, 66, 73, 73, - 65, 85, 78, 90, - 92, 101, 91, 107, - 96, 103, 96, 98, - 122, 104, 119, 166, -}; +static const EB_Bit_Number initialRateControlSad64x64Tables[] = { + // QP = 0 NEW + 0, 0, 0, 0, + 0, 0, 19064, 21410, + 21781, 22938, 23734, 24222, + 24242, 24233, 24377, 26487, + 26950, 28615, 29670, 29941, + 29857, 29336, 29130, 29572, + 29583, 29507, 29359, 29711, + 29789, 29753, 29766, 29528, + 29487, 29511, 29611, 29756, + 29758, 29933, 30202, 30579, + 30618, 30870, 31006, 31339, + 31364, 31566, 31687, 31982, + 32063, 32155, 32396, 32551, + 32640, 32651, 32787, 32978, + 32923, 33063, 33139, 33235, + 33288, 33350, 33382, 34440, + // QP = 1 NEW + 0, 0, 0, 0, + 0, 0, 18221, 20496, + 20860, 21997, 22789, 23260, + 23283, 23277, 23417, 25456, + 25906, 27517, 28544, 28819, + 28739, 28240, 28046, 28479, + 28492, 28419, 28277, 28619, + 28697, 28662, 28675, 28443, + 28404, 28427, 28526, 28669, + 28671, 28841, 29104, 29474, + 29512, 29758, 29891, 30218, + 30243, 30439, 30558, 30847, + 30927, 31019, 31253, 31404, + 31492, 31504, 31635, 31824, + 31767, 31908, 31983, 32076, + 32126, 32187, 32217, 33261, + // QP = 2 NEW + 0, 0, 0, 0, + 0, 0, 17109, 19287, + 19632, 20731, 21499, 21947, + 21966, 21954, 22094, 24133, + 24583, 26189, 27209, 27477, + 27395, 26896, 26700, 27132, + 27142, 27071, 26926, 27266, + 27342, 27305, 27318, 27087, + 27048, 27072, 27169, 27312, + 27313, 27485, 27746, 28114, + 28151, 28395, 28528, 28851, + 28878, 29072, 29189, 29478, + 29557, 29647, 29879, 30031, + 30118, 30128, 30259, 30446, + 30389, 30528, 30601, 30694, + 30746, 30806, 30837, 31865, + // QP = 3 NEW + 0, 0, 0, 0, + 0, 0, 16145, 18267, + 18604, 19688, 20447, 20882, + 20904, 20894, 21032, 23054, + 23498, 25089, 26096, 26357, + 26277, 25781, 25590, 26017, + 26029, 25959, 25818, 26156, + 26232, 26196, 26208, 25979, + 25939, 25963, 26059, 26201, + 26202, 26371, 26629, 26993, + 27030, 27271, 27404, 27723, + 27751, 27942, 28058, 28343, + 28421, 28510, 28740, 28892, + 28977, 28987, 29117, 29301, + 29246, 29381, 29456, 29546, + 29596, 29656, 29687, 30703, + // QP = 4 NEW + 0, 0, 0, 0, + 0, 0, 14466, 16764, + 17121, 18263, 19044, 19493, + 19515, 19505, 19640, 21686, + 22138, 23742, 24755, 25011, + 24929, 24429, 24236, 24666, + 24677, 24609, 24468, 24812, + 24888, 24855, 24869, 24642, + 24603, 24628, 24726, 24869, + 24871, 25041, 25302, 25665, + 25703, 25944, 26077, 26400, + 26424, 26617, 26734, 27020, + 27096, 27186, 27416, 27566, + 27651, 27663, 27794, 27979, + 27922, 28058, 28132, 28222, + 28273, 28332, 28363, 29381, + // QP = 5 NEW + 0, 0, 0, 0, + 0, 0, 13448, 15643, + 16002, 17119, 17892, 18326, + 18349, 18336, 18472, 20515, + 20962, 22564, 23574, 23823, + 23740, 23238, 23043, 23466, + 23475, 23407, 23267, 23607, + 23683, 23650, 23666, 23441, + 23404, 23430, 23527, 23671, + 23673, 23842, 24099, 24461, + 24497, 24738, 24869, 25189, + 25214, 25405, 25520, 25804, + 25880, 25970, 26197, 26346, + 26430, 26441, 26571, 26752, + 26698, 26831, 26906, 26996, + 27046, 27104, 27136, 28145, + // QP = 6 + 0, 0, 0, 0, + 0, 0, 11823, 14174, + 14548, 15711, 16489, 16927, + 16944, 16927, 17066, 19162, + 19624, 21263, 22292, 22541, + 22456, 21939, 21736, 22163, + 22174, 22098, 21956, 22298, + 22374, 22342, 22357, 22134, + 22094, 22122, 22222, 22367, + 22370, 22543, 22805, 23170, + 23208, 23451, 23584, 23907, + 23931, 24126, 24243, 24529, + 24606, 24694, 24925, 25075, + 25161, 25172, 25302, 25486, + 25428, 25564, 25640, 25729, + 25779, 25838, 25869, 26882, + // QP = 7 NEW + 0, 0, 0, 0, + 0, 0, 11047, 13263, + 13626, 14758, 15535, 15968, + 15989, 15973, 16111, 18171, + 18622, 20229, 21240, 21487, + 21403, 20895, 20697, 21116, + 21125, 21054, 20913, 21248, + 21322, 21290, 21305, 21086, + 21049, 21078, 21178, 21322, + 21325, 21495, 21752, 22112, + 22148, 22387, 22519, 22836, + 22860, 23051, 23166, 23447, + 23522, 23611, 23836, 23984, + 24068, 24079, 24208, 24387, + 24332, 24466, 24537, 24627, + 24677, 24735, 24764, 25766, + // QP = 8 NEW + 0, 0, 0, 0, + 0, 0, 9513, 11784, + 12142, 13291, 14070, 14500, + 14519, 14503, 14642, 16742, + 17200, 18832, 19854, 20099, + 20014, 19498, 19297, 19720, + 19731, 19657, 19515, 19853, + 19926, 19893, 19907, 19687, + 19649, 19679, 19780, 19927, + 19930, 20102, 20362, 20726, + 20763, 21005, 21136, 21458, + 21482, 21675, 21791, 22074, + 22150, 22239, 22467, 22616, + 22699, 22712, 22840, 23022, + 22965, 23100, 23173, 23262, + 23313, 23371, 23401, 24404, + // QP = 9 + 0, 0, 0, 0, + 0, 0, 8757, 10863, + 11200, 12284, 13028, 13441, + 13460, 13449, 13589, 15669, + 16127, 17751, 18769, 19008, + 18923, 18408, 18205, 18625, + 18634, 18561, 18418, 18753, + 18828, 18795, 18807, 18587, + 18548, 18575, 18676, 18822, + 18826, 18997, 19255, 19619, + 19654, 19896, 20028, 20348, + 20372, 20564, 20679, 20963, + 21037, 21126, 21353, 21502, + 21584, 21596, 21725, 21906, + 21850, 21983, 22057, 22147, + 22195, 22254, 22284, 23283, + // QP = 10 NEW + + 0, 0, 0, 0, + 0, 0, 7397, 9510, + 9849, 10958, 11724, 12152, + 12174, 12162, 12304, 14418, + 14880, 16525, 17551, 17785, + 17697, 17172, 16963, 17382, + 17391, 17317, 17173, 17510, + 17585, 17553, 17566, 17348, + 17308, 17339, 17440, 17588, + 17592, 17764, 18025, 18389, + 18425, 18667, 18799, 19121, + 19145, 19337, 19453, 19735, + 19811, 19901, 20127, 20276, + 20361, 20370, 20500, 20680, + 20624, 20757, 20830, 20920, + 20969, 21028, 21057, 22059, + // QP = 11 NEW + 0, 0, 0, 0, + 0, 0, 6115, 8119, + 8448, 9531, 10277, 10703, + 10726, 10716, 10862, 13003, + 13473, 15143, 16186, 16425, + 16335, 15800, 15587, 16006, + 16015, 15936, 15787, 16125, + 16201, 16167, 16181, 15959, + 15919, 15949, 16052, 16201, + 16205, 16379, 16643, 17012, + 17049, 17293, 17427, 17753, + 17775, 17971, 18089, 18375, + 18449, 18540, 18769, 18922, + 19006, 19015, 19146, 19329, + 19273, 19408, 19481, 19571, + 19620, 19679, 19709, 20724, + + // QP = 12 NEW + 0, 0, 0, 0, + 0, 0, 5252, 7138, + 7459, 8506, 9229, 9649, + 9671, 9663, 9813, 11944, + 12414, 14077, 15119, 15365, + 15276, 14745, 14532, 14951, + 14960, 14880, 14730, 15065, + 15140, 15105, 15117, 14895, + 14855, 14885, 14988, 15136, + 15139, 15314, 15578, 15944, + 15982, 16227, 16360, 16686, + 16709, 16904, 17022, 17309, + 17384, 17473, 17705, 17854, + 17939, 17949, 18080, 18263, + 18206, 18341, 18416, 18505, + 18554, 18613, 18644, 19661, + + // QP = 13 NEW + 0, 0, 0, 0, + 0, 0, 4362, 6083, + 6381, 7376, 8070, 8477, + 8501, 8497, 8654, 10759, + 11223, 12872, 13908, 14159, + 14073, 13550, 13343, 13759, + 13770, 13689, 13539, 13871, + 13947, 13909, 13919, 13694, + 13653, 13681, 13782, 13927, + 13931, 14103, 14365, 14731, + 14769, 15011, 15144, 15469, + 15492, 15686, 15803, 16089, + 16164, 16254, 16483, 16634, + 16717, 16728, 16860, 17041, + 16982, 17119, 17193, 17282, + 17332, 17391, 17421, 18442, + + // QP = 14 + 0, 0, 0, 0, + 0, 0, 3448, 4986, + 5252, 6165, 6825, 7218, + 7242, 7246, 7404, 9462, + 9917, 11539, 12565, 12826, + 12742, 12232, 12031, 12452, + 12461, 12382, 12233, 12563, + 12640, 12601, 12608, 12376, + 12336, 12360, 12457, 12598, + 12601, 12771, 13030, 13394, + 13431, 13673, 13805, 14127, + 14150, 14343, 14461, 14745, + 14820, 14910, 15139, 15289, + 15374, 15384, 15515, 15699, + 15639, 15774, 15848, 15939, + 15987, 16047, 16078, 17105, + + // QP = 15 NEW + 0, 0, 0, 0, + 0, 0, 2694, 4201, + 4438, 5283, 5894, 6259, + 6284, 6296, 6451, 8442, + 8883, 10461, 11463, 11729, + 11648, 11161, 10973, 11386, + 11395, 11322, 11178, 11505, + 11581, 11542, 11548, 11314, + 11274, 11293, 11386, 11519, + 11521, 11687, 11940, 12297, + 12333, 12569, 12698, 13016, + 13037, 13227, 13343, 13622, + 13696, 13784, 14012, 14158, + 14243, 14251, 14381, 14562, + 14505, 14639, 14712, 14801, + 14852, 14909, 14940, 15967, + + // QP = 16 NEW + 0, 0, 0, 0, + 0, 0, 1798, 3038, + 3259, 4010, 4575, 4973, + 4994, 5035, 5185, 7159, + 7590, 9156, 10154, 10429, + 10350, 9874, 9691, 10106, + 10117, 10042, 9903, 10231, + 10305, 10266, 10272, 10034, + 9993, 10009, 10099, 10226, + 10228, 10391, 10643, 10994, + 11032, 11267, 11395, 11711, + 11732, 11922, 12035, 12315, + 12389, 12476, 12701, 12849, + 12935, 12942, 13073, 13253, + 13195, 13329, 13403, 13490, + 13543, 13600, 13631, 14672, + + // QP = 17 NEW + 0, 0, 0, 0, + 0, 0, 1179, 2079, + 2231, 2726, 2954, 3449, + 3505, 3620, 3838, 5806, + 6225, 7771, 8751, 9036, + 8968, 8503, 8335, 8755, + 8770, 8701, 8566, 8899, + 8970, 8941, 8944, 8707, + 8666, 8679, 8764, 8885, + 8887, 9045, 9293, 9637, + 9670, 9900, 10027, 10336, + 10357, 10544, 10655, 10929, + 11002, 11089, 11309, 11456, + 11541, 11547, 11679, 11858, + 11797, 11931, 12005, 12092, + 12145, 12201, 12232, 13285, + + // QP = 18 NEW + 0, 0, 0, 0, + 0, 0, 916, 1661, + 1767, 2096, 2049, 2022, + 2028, 2223, 2513, 4678, + 5145, 6780, 7769, 8045, + 7974, 7493, 7307, 7726, + 7747, 7679, 7536, 7890, + 7964, 7952, 7967, 7769, + 7725, 7758, 7857, 7998, + 8009, 8165, 8412, 8769, + 8795, 9028, 9151, 9460, + 9477, 9664, 9771, 10042, + 10110, 10199, 10413, 10558, + 10642, 10650, 10778, 10951, + 10893, 11025, 11095, 11183, + 11234, 11290, 11319, 12364, + + // QP = 19 NEW + 0, 0, 0, 0, + 0, 0, 542, 1148, + 1245, 1526, 1487, 1384, + 1361, 1477, 1698, 3622, + 4078, 5620, 6583, 6847, + 6773, 6303, 6124, 6529, + 6546, 6467, 6333, 6655, + 6731, 6712, 6712, 6514, + 6461, 6494, 6610, 6750, + 6765, 6927, 7178, 7536, + 7557, 7807, 7933, 8242, + 8252, 8442, 8548, 8811, + 8887, 8972, 9181, 9327, + 9410, 9414, 9543, 9715, + 9661, 9792, 9859, 9950, + 9996, 10055, 10084, 11139, + + // QP = 20 NEW + 0, 0, 0, 0, + 0, 0, 452, 957, + 729, 949, 1036, 1145, + 1146, 1291, 1514, 2966, + 3294, 4394, 5166, 5627, + 5612, 5435, 5459, 6029, + 6061, 6081, 6062, 6392, + 6459, 6467, 6465, 6331, + 6293, 6334, 6437, 6570, + 6584, 6724, 6941, 7248, + 7265, 7475, 7587, 7836, + 7859, 8017, 8103, 8324, + 8377, 8457, 8620, 8752, + 8813, 8825, 8918, 9078, + 9040, 9138, 9204, 9280, + 9310, 9358, 9389, 10165, + + // QP = 21 NEW + 0, 0, 0, 0, + 0, 0, 376, 797, + 426, 590, 722, 947, + 965, 1129, 1350, 2429, + 2660, 3435, 4054, 4625, + 4649, 4687, 4867, 5566, + 5612, 5719, 5802, 6139, + 6197, 6231, 6226, 6153, + 6129, 6178, 6269, 6395, + 6408, 6527, 6712, 6970, + 6984, 7158, 7255, 7450, + 7484, 7613, 7680, 7863, + 7897, 7972, 8093, 8213, + 8254, 8273, 8334, 8483, + 8459, 8527, 8593, 8655, + 8670, 8709, 8741, 9277, + + // QP = 22 NEW + 0, 0, 0, 0, + 0, 0, 314, 664, + 249, 366, 503, 783, + 812, 987, 1204, 1989, + 2149, 2685, 3182, 3801, + 3852, 4041, 4339, 5140, + 5196, 5378, 5553, 5896, + 5947, 6003, 5997, 5980, + 5969, 6026, 6105, 6224, + 6236, 6336, 6490, 6704, + 6713, 6854, 6939, 7084, + 7128, 7229, 7280, 7429, + 7444, 7515, 7598, 7707, + 7731, 7755, 7788, 7928, + 7915, 7958, 8022, 8072, + 8075, 8105, 8138, 8466, + + // QP = 23 NEW + 0, 0, 0, 0, + 0, 0, 261, 554, + 146, 228, 350, 648, + 684, 863, 1074, 1629, + 1735, 2099, 2497, 3124, + 3192, 3485, 3868, 4746, + 4811, 5057, 5315, 5662, + 5706, 5784, 5776, 5812, + 5814, 5877, 5946, 6058, + 6069, 6151, 6276, 6447, + 6454, 6563, 6636, 6735, + 6788, 6865, 6901, 7018, + 7017, 7084, 7134, 7233, + 7240, 7270, 7278, 7408, + 7407, 7426, 7489, 7529, + 7520, 7543, 7577, 7726, + + // QP = 24 NEW + 0, 0, 0, 0, + 0, 0, 218, 461, + 85, 142, 244, 536, + 576, 755, 958, 1334, + 1402, 1641, 1960, 2567, + 2644, 3005, 3448, 4382, + 4455, 4756, 5087, 5438, + 5475, 5573, 5563, 5649, + 5662, 5732, 5790, 5896, + 5907, 5971, 6068, 6200, + 6204, 6284, 6346, 6403, + 6465, 6519, 6541, 6630, + 6614, 6678, 6697, 6787, + 6781, 6815, 6801, 6923, + 6930, 6930, 6991, 7022, + 7004, 7020, 7055, 7050, + + // QP = 25 NEW + 0, 0, 0, 0, + 0, 7, 19, 48, + 50, 88, 170, 443, + 485, 660, 854, 1092, + 1132, 1283, 1538, 2110, + 2191, 2591, 3074, 4046, + 4125, 4472, 4869, 5223, + 5254, 5369, 5358, 5490, + 5515, 5591, 5639, 5739, + 5749, 5796, 5868, 5963, + 5964, 6017, 6069, 6088, + 6157, 6191, 6200, 6263, + 6235, 6295, 6288, 6369, + 6351, 6389, 6356, 6469, + 6485, 6467, 6527, 6549, + 6523, 6533, 6568, 6434, + + // QP = 26 NEW + 0, 0, 0, 0, + 0, 2, 12, 29, + 30, 53, 105, 283, + 312, 427, 547, 665, + 688, 779, 939, 1306, + 1368, 1691, 2049, 2499, + 2514, 2684, 3153, 3834, + 3904, 4189, 4290, 4491, + 4525, 4616, 4670, 4774, + 4786, 4830, 4900, 4991, + 4994, 5042, 5092, 5118, + 5181, 5213, 5226, 5284, + 5262, 5315, 5314, 5395, + 5375, 5408, 5390, 5488, + 5504, 5491, 5546, 5570, + 5553, 5558, 5590, 5504, + + // QP = 27 NEW + 0, 0, 0, 0, + 0, 2, 9, 20, + 20, 35, 70, 190, + 209, 286, 359, 385, + 384, 393, 484, 662, + 712, 968, 1221, 1573, + 1587, 1801, 2134, 2454, + 2505, 2685, 2843, 3315, + 3389, 3633, 3793, 3968, + 3984, 4036, 4110, 4205, + 4205, 4255, 4304, 4332, + 4386, 4419, 4433, 4492, + 4477, 4522, 4530, 4603, + 4583, 4616, 4602, 4693, + 4707, 4702, 4745, 4770, + 4759, 4766, 4795, 4750, + + // QP = 28 NEW + 0, 0, 0, 0, + 0, 1, 7, 15, + 15, 24, 49, 132, + 145, 197, 245, 248, + 243, 230, 276, 379, + 412, 570, 733, 1049, + 1069, 1175, 1285, 1532, + 1586, 1759, 1918, 2225, + 2276, 2507, 2752, 3096, + 3114, 3240, 3344, 3460, + 3463, 3518, 3571, 3606, + 3650, 3684, 3704, 3760, + 3746, 3788, 3800, 3872, + 3854, 3885, 3877, 3961, + 3973, 3972, 4010, 4031, + 4032, 4037, 4067, 4060, + + // QP = 29 NEW + 0, 0, 0, 0, + 0, 2, 6, 11, + 11, 18, 36, 94, + 103, 139, 171, 169, + 165, 151, 179, 245, + 263, 363, 462, 673, + 696, 790, 868, 1058, + 1097, 1227, 1368, 1612, + 1652, 1818, 2013, 2315, + 2335, 2471, 2595, 2743, + 2753, 2818, 2881, 2923, + 2963, 2994, 3022, 3074, + 3067, 3105, 3120, 3186, + 3167, 3199, 3201, 3272, + 3283, 3287, 3321, 3340, + 3348, 3350, 3377, 3410, + + // QP = 30 NEW + 0, 0, 0, 0, + 0, 0, 5, 9, + 9, 14, 28, 71, + 77, 104, 126, 123, + 120, 108, 128, 176, + 188, 257, 322, 473, + 496, 555, 585, 737, + 775, 902, 1049, 1262, + 1293, 1425, 1590, 1842, + 1865, 1994, 2118, 2279, + 2297, 2371, 2451, 2514, + 2548, 2589, 2620, 2679, + 2677, 2714, 2729, 2789, + 2777, 2809, 2809, 2881, + 2887, 2891, 2920, 2936, + 2958, 2954, 2978, 3037, + + // QP = 31 NEW + 0, 0, 0, 0, + 0, 1, 4, 8, + 7, 11, 21, 52, + 57, 75, 91, 87, + 85, 76, 90, 122, + 129, 175, 219, 328, + 346, 395, 404, 511, + 537, 628, 759, 937, + 968, 1073, 1197, 1400, + 1418, 1520, 1622, 1771, + 1783, 1855, 1933, 2004, + 2030, 2070, 2114, 2175, + 2177, 2210, 2232, 2289, + 2277, 2305, 2313, 2378, + 2384, 2390, 2414, 2428, + 2454, 2450, 2475, 2562, + + // QP = 32 NEW + 0, 0, 0, 0, + 0, 0, 3, 6, + 6, 9, 16, 39, + 42, 55, 66, 63, + 61, 55, 65, 87, + 92, 123, 154, 234, + 247, 285, 289, 367, + 386, 456, 563, 704, + 728, 808, 906, 1061, + 1083, 1160, 1245, 1369, + 1376, 1443, 1516, 1590, + 1611, 1650, 1694, 1756, + 1763, 1793, 1815, 1870, + 1861, 1887, 1899, 1955, + 1959, 1968, 1986, 2004, + 2031, 2027, 2048, 2152, + + // QP = 33 NEW + 0, 0, 0, 0, + 0, 1, 3, 5, + 5, 7, 13, 30, + 32, 42, 50, 47, + 45, 41, 48, 65, + 68, 90, 113, 172, + 183, 211, 212, 271, + 285, 338, 426, 533, + 557, 619, 696, 818, + 835, 898, 966, 1067, + 1077, 1131, 1195, 1273, + 1286, 1329, 1381, 1443, + 1454, 1486, 1507, 1561, + 1553, 1580, 1592, 1641, + 1646, 1656, 1671, 1688, + 1713, 1712, 1733, 1841, + + // QP = 34 NEW + 0, 0, 0, 0, + 0, 0, 2, 4, + 4, 6, 10, 23, + 25, 32, 38, 35, + 34, 31, 36, 49, + 52, 68, 85, 130, + 139, 161, 161, 205, + 216, 258, 330, 414, + 435, 482, 546, 642, + 654, 705, 757, 840, + 847, 894, 949, 1017, + 1028, 1074, 1118, 1195, + 1199, 1239, 1262, 1318, + 1315, 1339, 1352, 1398, + 1402, 1410, 1425, 1440, + 1467, 1466, 1483, 1591, + + // QP = 35 NEW + 0, 0, 0, 0, + 0, 0, 2, 3, + 3, 5, 8, 19, + 20, 25, 30, 27, + 26, 23, 28, 38, + 41, 53, 66, 101, + 107, 125, 124, 160, + 169, 203, 262, 331, + 348, 387, 441, 523, + 529, 569, 616, 685, + 692, 729, 774, 838, + 841, 877, 925, 995, + 1004, 1051, 1076, 1132, + 1137, 1164, 1180, 1223, + 1228, 1237, 1249, 1266, + 1293, 1288, 1309, 1419, + + // QP = 36 NEW + 0, 0, 0, 0, + 0, 1, 1, 3, + 3, 4, 7, 15, + 16, 20, 23, 21, + 20, 18, 22, 30, + 32, 41, 51, 77, + 82, 96, 95, 124, + 130, 158, 204, 261, + 275, 307, 353, 422, + 428, 465, 503, 562, + 568, 601, 641, 700, + 700, 733, 772, 835, + 842, 887, 911, 961, + 972, 994, 1015, 1056, + 1060, 1072, 1083, 1099, + 1124, 1125, 1142, 1246, + + // QP = 37 NEW + 0, 0, 0, 0, + 0, 1, 1, 2, + 2, 3, 6, 12, + 13, 16, 19, 17, + 16, 15, 17, 24, + 26, 33, 41, 62, + 66, 77, 76, 98, + 104, 127, 165, 211, + 223, 250, 290, 349, + 356, 388, 422, 474, + 483, 511, 547, 604, + 602, 632, 668, 725, + 735, 772, 796, 840, + 853, 874, 894, 929, + 937, 951, 960, 977, + 999, 1001, 1018, 1120, + + // QP = 38 NEW + 0, 0, 0, 0, + 0, 0, 1, 2, + 2, 3, 5, 10, + 11, 13, 15, 14, + 13, 12, 14, 19, + 20, 26, 33, 48, + 51, 59, 58, 76, + 80, 98, 127, 163, + 174, 195, 229, 277, + 283, 310, 339, 383, + 392, 417, 448, 499, + 497, 524, 556, 605, + 615, 646, 669, 706, + 718, 736, 757, 787, + 795, 808, 816, 833, + 852, 853, 871, 965, + + // QP = 39 NEW + 0, 0, 0, 0, + 0, 1, 1, 2, + 2, 2, 4, 8, + 9, 11, 12, 11, + 11, 9, 11, 16, + 17, 21, 26, 39, + 41, 47, 46, 60, + 63, 77, 101, 130, + 137, 154, 183, 225, + 230, 252, 278, 317, + 326, 351, 376, 427, + 424, 447, 479, 524, + 534, 562, 583, 618, + 630, 647, 668, 698, + 703, 718, 727, 745, + 761, 763, 779, 873, + + // QP = 40 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 2, 3, 7, + 7, 9, 10, 9, + 8, 8, 9, 13, + 14, 17, 21, 30, + 32, 37, 36, 46, + 48, 59, 77, 99, + 105, 119, 141, 175, + 178, 200, 220, 251, + 261, 280, 301, 348, + 344, 365, 395, 432, + 440, 464, 488, 517, + 528, 544, 563, 592, + 597, 610, 620, 637, + 652, 655, 671, 759, + + // QP = 41 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 2, 3, 6, + 6, 7, 8, 7, + 7, 6, 7, 10, + 11, 14, 17, 25, + 26, 30, 29, 36, + 38, 46, 61, 77, + 82, 92, 111, 137, + 141, 157, 174, 201, + 209, 227, 243, 286, + 280, 299, 326, 359, + 368, 390, 408, 437, + 446, 461, 481, 511, + 515, 529, 539, 556, + 571, 577, 591, 679, + + // QP = 42 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 5, + 5, 6, 7, 6, + 6, 5, 6, 8, + 9, 11, 14, 20, + 20, 23, 22, 28, + 29, 35, 47, 58, + 63, 70, 85, 105, + 108, 122, 133, 156, + 162, 177, 188, 225, + 220, 235, 259, 286, + 296, 314, 328, 353, + 363, 375, 395, 421, + 426, 440, 448, 469, + 478, 490, 500, 588, + + // QP = 43 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 4, + 4, 5, 6, 5, + 5, 4, 5, 7, + 7, 9, 11, 16, + 17, 19, 18, 23, + 24, 28, 38, 46, + 49, 55, 67, 83, + 85, 97, 105, 123, + 128, 141, 149, 180, + 176, 188, 209, 230, + 239, 256, 268, 290, + 297, 311, 328, 349, + 356, 367, 377, 396, + 404, 418, 430, 521, + + // QP = 44 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 3, + 3, 4, 5, 4, + 4, 3, 4, 6, + 6, 8, 9, 13, + 13, 15, 14, 18, + 19, 22, 29, 36, + 38, 43, 51, 64, + 66, 75, 82, 96, + 100, 110, 115, 140, + 137, 146, 163, 180, + 189, 200, 211, 228, + 234, 247, 261, 279, + 282, 295, 301, 320, + 328, 341, 349, 437, + + // QP = 45 NEW + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 1, 3, + 3, 3, 4, 3, + 3, 3, 3, 5, + 5, 6, 7, 10, + 10, 12, 11, 14, + 14, 17, 23, 28, + 29, 33, 40, 49, + 51, 59, 63, 74, + 78, 85, 89, 110, + 106, 114, 128, 141, + 147, 157, 166, 180, + 186, 196, 208, 223, + 226, 238, 242, 260, + 266, 278, 288, 371, + + // QP = 46 NEW + 0, 0, 0, 0, + 0, 0, 0, 1, + 1, 1, 1, 2, + 2, 3, 3, 3, + 3, 2, 3, 4, + 4, 5, 6, 8, + 8, 10, 9, 11, + 12, 14, 18, 22, + 23, 26, 31, 39, + 41, 46, 50, 57, + 61, 67, 70, 86, + 84, 91, 102, 111, + 117, 125, 131, 143, + 149, 157, 167, 179, + 180, 191, 197, 212, + 215, 226, 235, 312, + + // QP = 47 NEW + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 1, 1, 2, + 2, 2, 3, 2, + 2, 2, 2, 3, + 3, 4, 5, 7, + 7, 8, 7, 9, + 9, 11, 15, 18, + 18, 20, 25, 31, + 32, 36, 39, 46, + 48, 52, 55, 68, + 66, 71, 80, 88, + 92, 97, 103, 113, + 117, 123, 133, 143, + 145, 154, 158, 170, + 174, 184, 189, 260, + + // QP = 48 NEW + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 1, 1, 2, + 2, 2, 2, 2, + 2, 2, 2, 3, + 3, 3, 4, 5, + 5, 6, 6, 7, + 8, 9, 12, 14, + 15, 16, 20, 24, + 25, 29, 31, 36, + 38, 41, 44, 54, + 52, 56, 64, 70, + 73, 77, 82, 91, + 94, 100, 106, 115, + 116, 124, 129, 138, + 141, 150, 155, 218, + + // QP = 49 NEW + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 2, 2, 2, + 1, 1, 2, 2, + 2, 3, 3, 4, + 4, 5, 5, 6, + 6, 7, 9, 11, + 12, 13, 16, 19, + 20, 23, 25, 29, + 30, 33, 35, 43, + 41, 45, 50, 55, + 59, 61, 65, 73, + 76, 80, 86, 92, + 93, 99, 104, 112, + 114, 121, 127, 181, + + // QP = 50 + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 1, + 1, 1, 2, 1, + 1, 1, 1, 2, + 2, 2, 3, 4, + 4, 4, 4, 5, + 5, 6, 8, 9, + 10, 11, 13, 16, + 16, 18, 20, 23, + 24, 26, 28, 35, + 32, 35, 40, 44, + 46, 48, 52, 57, + 60, 64, 67, 73, + 74, 79, 83, 90, + 91, 97, 102, 148, + + // QP = 51 + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1, + 1, 1, 1, 1, + 1, 1, 1, 2, + 2, 2, 2, 3, + 3, 4, 3, 4, + 4, 5, 6, 7, + 8, 9, 11, 13, + 14, 15, 16, 19, + 20, 21, 22, 28, + 26, 29, 32, 35, + 38, 39, 42, 46, + 49, 52, 54, 60, + 61, 64, 67, 73, + 73, 77, 83, 122, +}; + + + +static const EB_Bit_Number initialRateControlIntraSad64x64Tables[] = { + // QP = 0 NEW + 0, 0, 0, 0, + 0, 0, 0, 22636, + 22804, 23718, 23852, 24210, + 23882, 24027, 24723, 25937, + 24896, 27051, 30603, 31453, + 30784, 29404, 30546, 31836, + 32090, 31576, 31532, 32354, + 31761, 32869, 32349, 31100, + 32368, 32773, 31148, 31299, + 32400, 31203, 32530, 33114, + 31942, 32664, 33074, 32774, + 32967, 33796, 34026, 33873, + 34018, 33566, 33505, 33776, + 34656, 33412, 33047, 34654, + 34543, 33790, 34751, 34184, + 34744, 34563, 34510, 35474, + // QP = 1 NEW + 0, 0, 0, 0, + 0, 0, 0, 21659, + 21816, 22686, 22860, 23146, + 22961, 22904, 23810, 24897, + 23850, 26033, 29440, 30276, + 29599, 28297, 29378, 30650, + 30930, 30445, 30407, 31191, + 30586, 31676, 31198, 30016, + 31223, 31615, 30048, 30194, + 31185, 30078, 31338, 31915, + 30882, 31510, 31926, 31660, + 31791, 32623, 32868, 32707, + 32824, 32408, 32327, 32611, + 33459, 32300, 31943, 33432, + 33331, 32635, 33511, 33026, + 33511, 33404, 33292, 34267, + // QP = 2 + 0, 0, 0, 0, + 0, 0, 0, 20399, + 20567, 21406, 21530, 21929, + 21604, 21684, 22474, 23556, + 22611, 24706, 28076, 28899, + 28275, 26929, 28047, 29297, + 29548, 29095, 29020, 29833, + 29249, 30324, 29833, 28626, + 29780, 30181, 28604, 28818, + 29824, 28750, 29998, 30512, + 29412, 30121, 30537, 30248, + 30429, 31252, 31414, 31288, + 31421, 30982, 30933, 31208, + 32051, 30854, 30518, 31943, + 31952, 31237, 32142, 31609, + 32102, 31959, 31906, 32837, + // QP = 3 + 0, 0, 0, 0, + 0, 0, 0, 19278, + 19449, 20318, 20495, 20815, + 20537, 20503, 21392, 22463, + 21541, 23616, 26914, 27740, + 27129, 25796, 26901, 28122, + 28442, 27938, 27874, 28713, + 28091, 29162, 28709, 27509, + 28679, 29114, 27560, 27700, + 28685, 27664, 28835, 29447, + 28371, 28998, 29423, 29193, + 29293, 30094, 30347, 30154, + 30299, 29876, 29795, 30090, + 30902, 29774, 29426, 30865, + 30778, 30106, 30959, 30464, + 30976, 30850, 30753, 31702, + // QP = 4 + 0, 0, 0, 0, + 0, 0, 0, 18171, + 18354, 19219, 19332, 19723, + 19474, 19490, 20348, 21392, + 20368, 22505, 25809, 26611, + 25991, 24661, 25761, 26942, + 27288, 26798, 26731, 27550, + 26911, 28042, 27558, 26384, + 27526, 27936, 26419, 26553, + 27574, 26480, 27685, 28267, + 27204, 27832, 28294, 28032, + 28155, 28976, 29137, 28959, + 29115, 28814, 28717, 28962, + 29719, 28627, 28291, 29654, + 29652, 28941, 29761, 29304, + 29797, 29674, 29572, 30538, + // QP = 5 + 0, 0, 0, 0, + 0, 0, 0, 17304, + 17457, 18373, 18467, 18776, + 18583, 18576, 19376, 20392, + 19573, 21570, 24793, 25581, + 24983, 23657, 24776, 25934, + 26202, 25721, 25718, 26507, + 25892, 26948, 26449, 25395, + 26469, 26895, 25391, 25548, + 26495, 25496, 26647, 27165, + 26147, 26758, 27200, 26942, + 27075, 27839, 28026, 27878, + 28012, 27638, 27560, 27891, + 28602, 27515, 27171, 28499, + 28483, 27837, 28660, 28174, + 28676, 28553, 28469, 29365, + // QP = 6 + 0, 0, 0, 0, + 0, 0, 0, 15929, + 16089, 16985, 17125, 17491, + 17251, 17283, 18054, 19104, + 18314, 20221, 23516, 24335, + 23720, 22396, 23479, 24639, + 24980, 24523, 24413, 25215, + 24647, 25710, 25220, 24072, + 25195, 25631, 24133, 24282, + 25225, 24149, 25378, 25927, + 24881, 25491, 25929, 25656, + 25833, 26621, 26803, 26604, + 26773, 26352, 26292, 26584, + 27341, 26252, 25940, 27300, + 27286, 26603, 27454, 26947, + 27432, 27279, 27167, 28112, + // QP = 7 + 0, 0, 0, 0, + 0, 0, 0, 14880, + 15069, 15956, 16137, 16474, + 16195, 16274, 17013, 18093, + 17175, 19187, 22485, 23231, + 22634, 21368, 22434, 23566, + 23858, 23427, 23355, 24114, + 23568, 24595, 24112, 23011, + 24110, 24575, 23075, 23184, + 24166, 23173, 24319, 24888, + 23815, 24442, 24833, 24637, + 24776, 25525, 25705, 25503, + 25659, 25296, 25215, 25490, + 26246, 25199, 24904, 26188, + 26180, 25489, 26316, 25833, + 26304, 26186, 26103, 27009, + // QP = 8 + 0, 0, 0, 0, + 0, 0, 0, 13746, + 13894, 14720, 14893, 15257, + 14973, 15025, 15803, 16851, + 15988, 17920, 21188, 21995, + 21377, 20093, 21107, 22309, + 22570, 22144, 22077, 22829, + 22295, 23282, 22820, 21751, + 22828, 23247, 21787, 21932, + 22876, 21875, 23024, 23546, + 22486, 23156, 23575, 23275, + 23442, 24200, 24380, 24242, + 24385, 23965, 23914, 24167, + 24947, 23860, 23570, 24889, + 24872, 24182, 25009, 24486, + 25011, 24872, 24812, 25682, + // QP = 9 NEW + 0, 0, 0, 0, + 0, 0, 0, 12644, + 12844, 13728, 13872, 14304, + 14018, 13956, 14863, 15842, + 14974, 16981, 20166, 20918, + 20330, 19073, 20106, 21294, + 21529, 21121, 21044, 21784, + 21235, 22283, 21797, 20747, + 21782, 22261, 20823, 20944, + 21863, 20876, 22020, 22541, + 21425, 22116, 22537, 22261, + 22440, 23180, 23345, 23186, + 23330, 22950, 22880, 23167, + 23891, 22853, 22545, 23817, + 23831, 23158, 23965, 23527, + 23957, 23852, 23782, 24640, + // QP = 10 NEW + + 0, 0, 0, 0, + 0, 0, 0, 11514, + 11684, 12528, 12643, 13059, + 12783, 12779, 13652, 14690, + 13845, 15753, 18925, 19726, + 19150, 17862, 18913, 20057, + 20354, 19916, 19866, 20598, + 20056, 21068, 20616, 19489, + 20567, 21018, 19535, 19650, + 20618, 19626, 20761, 21328, + 20235, 20913, 21289, 21021, + 21183, 21922, 22118, 21999, + 22111, 21710, 21680, 21946, + 22663, 21580, 21278, 22568, + 22616, 21924, 22754, 22227, + 22784, 22604, 22541, 23392, + // QP = 11 NEW + 0, 0, 0, 0, + 0, 0, 0, 10630, + 10786, 11619, 11781, 12167, + 11834, 11885, 12764, 13787, + 12899, 14895, 18047, 18837, + 18207, 16962, 17993, 19141, + 19397, 18970, 18891, 19631, + 19055, 20083, 19662, 18612, + 19654, 20150, 18668, 18764, + 19780, 18745, 19902, 20417, + 19290, 20002, 20427, 20163, + 20268, 21030, 21198, 21045, + 21230, 20798, 20725, 21031, + 21732, 20708, 20418, 21640, + 21691, 20988, 21828, 21315, + 21796, 21639, 21631, 22465, + + // QP = 12 NEW + 0, 0, 0, 0, + 0, 0, 0, 9344, + 9545, 10341, 10496, 10916, + 10660, 10698, 11527, 12506, + 11605, 13628, 16847, 17618, + 17024, 15743, 16781, 17898, + 18200, 17803, 17668, 18421, + 17851, 18901, 18406, 17358, + 18429, 18925, 17404, 17517, + 18516, 17530, 18701, 19254, + 18116, 18813, 19232, 18926, + 19081, 19815, 19993, 19899, + 20042, 19552, 19555, 19803, + 20554, 19543, 19182, 20473, + 20487, 19760, 20636, 20171, + 20629, 20462, 20377, 21271, + + // QP = 13 NEW + 0, 0, 0, 0, + 0, 0, 0, 8432, + 8573, 9428, 9562, 9983, + 9642, 9722, 10557, 11542, + 10651, 12611, 15744, 16537, + 15938, 14720, 15759, 16886, + 17132, 16736, 16634, 17395, + 16836, 17854, 17393, 16305, + 17394, 17815, 16345, 16498, + 17465, 16440, 17592, 18156, + 17035, 17698, 18106, 17828, + 17962, 18724, 18871, 18749, + 18871, 18503, 18497, 18697, + 19406, 18392, 18068, 19397, + 19393, 18734, 19512, 19065, + 19520, 19379, 19308, 20139, + + // QP = 14 NEW + 0, 0, 0, 0, + 0, 0, 0, 7285, + 7445, 8289, 8492, 8746, + 8455, 8574, 9369, 10346, + 9473, 11443, 14522, 15289, + 14716, 13523, 14566, 15683, + 15915, 15513, 15453, 16193, + 15665, 16634, 16164, 15107, + 16197, 16592, 15159, 15353, + 16256, 15203, 16417, 16928, + 15827, 16477, 16857, 16635, + 16703, 17512, 17632, 17548, + 17681, 17234, 17208, 17467, + 18197, 17164, 16858, 18147, + 18142, 17480, 18283, 17773, + 18286, 18110, 18084, 18902, + + // QP = 15 NEW + 0, 0, 0, 0, + 0, 0, 0, 6214, + 6406, 7229, 7436, 7675, + 7449, 7582, 8347, 9325, + 8482, 10387, 13458, 14232, + 13671, 12453, 13483, 14620, + 14823, 14430, 14398, 15153, + 14606, 15605, 15137, 14080, + 15145, 15569, 14115, 14300, + 15182, 14186, 15350, 15858, + 14756, 15452, 15763, 15516, + 15667, 16472, 16569, 16462, + 16563, 16178, 16134, 16424, + 17139, 16112, 15795, 17090, + 17063, 16422, 17253, 16707, + 17208, 17077, 17011, 17839, + + // QP = 16 NEW + 0, 0, 0, 0, + 0, 0, 0, 5089, + 5295, 6085, 6250, 6500, + 6352, 6344, 7187, 8204, + 7275, 9209, 12282, 13060, + 12449, 11293, 12320, 13458, + 13687, 13243, 13218, 13965, + 13458, 14422, 13950, 12890, + 13937, 14400, 12961, 13098, + 14038, 13030, 14174, 14678, + 13614, 14266, 14592, 14359, + 14528, 15266, 15432, 15313, + 15391, 15032, 14973, 15198, + 15971, 14933, 14689, 15883, + 15940, 15238, 16039, 15559, + 16021, 15913, 15859, 16669, + + // QP = 17 NEW + 0, 0, 0, 0, + 0, 0, 0, 4258, + 4410, 5177, 5338, 5619, + 5381, 5501, 6175, 7168, + 6335, 8238, 11256, 12062, + 11451, 10296, 11287, 12446, + 12658, 12254, 12223, 12948, + 12435, 13416, 12951, 11897, + 12955, 13370, 11964, 12147, + 13009, 12010, 13184, 13684, + 12626, 13289, 13645, 13353, + 13519, 14268, 14393, 14302, + 14362, 14079, 13991, 14218, + 14980, 13929, 13593, 14932, + 14914, 14211, 15021, 14514, + 15051, 14897, 14839, 15651, + + // QP = 18 NEW + 0, 0, 0, 0, + 0, 0, 0, 3353, + 3493, 4214, 4330, 4599, + 4420, 4486, 5191, 6224, + 5417, 7217, 10145, 10892, + 10338, 9231, 10181, 11268, + 11489, 11157, 11127, 11804, + 11248, 12314, 11820, 10808, + 11808, 12212, 10874, 11011, + 11873, 10888, 12050, 12523, + 11467, 12150, 12457, 12199, + 12363, 13104, 13245, 13158, + 13203, 12877, 12795, 13042, + 13775, 12697, 12444, 13776, + 13699, 13087, 13831, 13356, + 13842, 13685, 13659, 14495, + + // QP = 19 NEW + 0, 0, 0, 0, + 0, 0, 0, 2656, + 2789, 3394, 3522, 3849, + 3653, 3726, 4374, 5366, + 4579, 6257, 9138, 9873, + 9361, 8274, 9211, 10283, + 10512, 10161, 10125, 10819, + 10289, 11250, 10834, 9824, + 10812, 11198, 9848, 10057, + 10892, 9901, 11027, 11498, + 10424, 11180, 11421, 11178, + 11365, 12108, 12208, 12108, + 12181, 11846, 11802, 12052, + 12715, 11708, 11417, 12699, + 12698, 12094, 12816, 12368, + 12822, 12686, 12596, 13468, + + // QP = 20 NEW + 0, 0, 0, 0, + 0, 0, 0, 1940, + 2058, 2584, 2713, 3020, + 2842, 2981, 3498, 4392, + 3672, 5306, 8051, 8729, + 8210, 7210, 8107, 9179, + 9353, 8998, 9009, 9650, + 9133, 10105, 9694, 8749, + 9676, 10028, 8700, 8920, + 9732, 8790, 9903, 10317, + 9341, 10004, 10282, 10031, + 10174, 10903, 11012, 10965, + 10979, 10659, 10612, 10886, + 11532, 10521, 10271, 11524, + 11478, 10898, 11633, 11217, + 11601, 11546, 11426, 12284, + + // QP = 21 NEW + 0, 0, 0, 0, + 0, 0, 0, 1406, + 1508, 1943, 2045, 2362, + 2225, 2298, 2817, 3561, + 3002, 4491, 7094, 7752, + 7280, 6353, 7152, 8168, + 8358, 8050, 8010, 8731, + 8205, 9085, 8725, 7739, + 8685, 9004, 7794, 7939, + 8685, 7772, 8871, 9286, + 8443, 8992, 9232, 8986, + 9154, 9850, 10029, 9921, + 9928, 9675, 9598, 9874, + 10484, 9483, 9189, 10483, + 10406, 9902, 10581, 10189, + 10561, 10487, 10412, 11239, + + // QP = 22 NEW + 0, 0, 0, 0, + 0, 0, 0, 935, + 1011, 1343, 1472, 1733, + 1660, 1720, 2176, 2820, + 2348, 3666, 6111, 6765, + 6356, 5438, 6227, 7191, + 7333, 7061, 7035, 7716, + 7196, 8040, 7699, 6744, + 7653, 7934, 6760, 6927, + 7612, 6791, 7780, 8204, + 7379, 7950, 8184, 7917, + 8047, 8729, 8926, 8795, + 8828, 8569, 8493, 8741, + 9399, 8372, 8132, 9400, + 9335, 8789, 9462, 9097, + 9512, 9361, 9293, 10111, + + // QP = 23 NEW + 0, 0, 0, 0, + 0, 0, 0, 661, + 727, 969, 1068, 1324, + 1298, 1316, 1715, 2268, + 1927, 3027, 5217, 5826, + 5467, 4689, 5374, 6329, + 6449, 6197, 6175, 6850, + 6358, 7124, 6848, 5923, + 6775, 7011, 5927, 6044, + 6714, 5934, 6824, 7264, + 6566, 7040, 7216, 7010, + 7126, 7759, 8012, 7799, + 7878, 7670, 7532, 7778, + 8405, 7457, 7194, 8406, + 8305, 7845, 8424, 8076, + 8507, 8377, 8315, 9114, + + // QP = 24 NEW + 0, 0, 0, 0, + 0, 0, 0, 433, + 473, 640, 714, 997, + 974, 998, 1361, 1769, + 1582, 2469, 4379, 4973, + 4661, 4025, 4625, 5495, + 5638, 5381, 5373, 6007, + 5563, 6248, 6010, 5139, + 5912, 6132, 5076, 5265, + 5826, 5145, 5960, 6369, + 5749, 6104, 6263, 6131, + 6204, 6805, 7046, 6860, + 6895, 6746, 6630, 6825, + 7417, 6535, 6309, 7431, + 7362, 6959, 7490, 7128, + 7533, 7408, 7376, 8135, + + // QP = 25 NEW + 0, 0, 0, 0, + 0, 0, 0, 281, + 305, 428, 485, 759, + 712, 822, 1059, 1402, + 1277, 1989, 3535, 4091, + 3856, 3359, 3895, 4741, + 4823, 4637, 4664, 5243, + 4832, 5420, 5230, 4440, + 5157, 5255, 4338, 4474, + 5008, 4400, 5091, 5500, + 4920, 5251, 5424, 5279, + 5343, 5856, 6172, 5972, + 5938, 5857, 5724, 5987, + 6459, 5649, 5452, 6503, + 6372, 6088, 6481, 6208, + 6612, 6534, 6456, 7192, + + // QP = 26 NEW + 0, 0, 0, 0, + 0, 0, 0, 168, + 182, 253, 312, 561, + 527, 587, 820, 1060, + 1007, 1533, 2640, 3168, + 2976, 2677, 3140, 3886, + 3925, 3845, 3906, 4416, + 4100, 4581, 4474, 3714, + 4320, 4428, 3600, 3747, + 4104, 3643, 4239, 4590, + 4103, 4338, 4537, 4414, + 4477, 4908, 5168, 4950, + 4978, 4908, 4813, 5028, + 5468, 4758, 4631, 5521, + 5401, 5183, 5452, 5219, + 5575, 5535, 5480, 6192, + + // QP = 27 NEW + 0, 0, 0, 0, + 0, 0, 0, 121, + 126, 162, 208, 427, + 399, 484, 653, 857, + 833, 1176, 1954, 2409, + 2279, 2121, 2491, 3184, + 3186, 3190, 3264, 3753, + 3454, 3896, 3796, 3155, + 3670, 3713, 3026, 3121, + 3433, 3044, 3567, 3811, + 3430, 3652, 3769, 3682, + 3733, 4154, 4365, 4131, + 4206, 4147, 4064, 4280, + 4619, 3989, 3880, 4674, + 4623, 4438, 4639, 4398, + 4764, 4760, 4683, 5368, + + // QP = 28 NEW + 0, 0, 0, 0, + 0, 0, 0, 88, + 87, 110, 147, 316, + 323, 365, 518, 645, + 697, 890, 1300, 1660, + 1589, 1580, 1857, 2407, + 2430, 2486, 2580, 3032, + 2800, 3167, 3123, 2566, + 2982, 3011, 2438, 2555, + 2710, 2473, 2877, 3069, + 2758, 2947, 3036, 3008, + 3012, 3348, 3507, 3381, + 3433, 3353, 3291, 3511, + 3734, 3254, 3196, 3810, + 3805, 3686, 3766, 3622, + 3874, 3949, 3861, 4527, + + // QP = 29 NEW + 0, 0, 0, 0, + 0, 0, 0, 70, + 70, 82, 105, 257, + 262, 314, 427, 515, + 577, 686, 849, 1113, + 1086, 1166, 1360, 1798, + 1803, 1922, 2021, 2412, + 2214, 2553, 2572, 2127, + 2416, 2399, 1972, 2044, + 2154, 2022, 2334, 2447, + 2152, 2391, 2448, 2424, + 2450, 2706, 2882, 2713, + 2737, 2732, 2682, 2810, + 3021, 2630, 2690, 3092, + 3118, 3042, 3067, 2908, + 3158, 3250, 3187, 3812, + + // QP = 30 NEW + 0, 0, 0, 0, + 0, 0, 0, 58, + 62, 65, 88, 217, + 223, 283, 355, 420, + 482, 553, 557, 776, + 767, 895, 1043, 1381, + 1376, 1483, 1600, 1979, + 1767, 2107, 2175, 1787, + 2037, 1943, 1627, 1710, + 1752, 1711, 1926, 2039, + 1819, 1987, 2059, 2071, + 2027, 2256, 2376, 2231, + 2257, 2290, 2300, 2343, + 2522, 2199, 2278, 2595, + 2641, 2613, 2566, 2501, + 2601, 2743, 2741, 3315, + + // QP = 31 NEW + 0, 0, 0, 0, + 0, 0, 0, 52, + 52, 57, 75, 176, + 189, 239, 295, 353, + 412, 438, 336, 475, + 488, 636, 742, 957, + 954, 1084, 1195, 1457, + 1355, 1587, 1640, 1445, + 1565, 1522, 1295, 1377, + 1349, 1412, 1541, 1597, + 1403, 1586, 1618, 1644, + 1636, 1759, 1887, 1745, + 1758, 1840, 1821, 1836, + 1945, 1757, 1857, 2028, + 2138, 2102, 2059, 2018, + 2065, 2198, 2204, 2733, + + // QP = 32 NEW + 0, 0, 0, 0, + 0, 0, 0, 46, + 44, 50, 69, 154, + 155, 198, 242, 290, + 335, 334, 189, 266, + 295, 428, 486, 608, + 612, 720, 823, 1013, + 936, 1104, 1173, 1119, + 1159, 1084, 1024, 1064, + 1014, 1101, 1176, 1197, + 1096, 1249, 1233, 1279, + 1268, 1360, 1426, 1326, + 1318, 1453, 1438, 1407, + 1490, 1344, 1505, 1539, + 1686, 1665, 1569, 1580, + 1625, 1698, 1766, 2206, + + // QP = 33 NEW + 0, 0, 0, 0, + 0, 0, 0, 43, + 40, 45, 60, 135, + 148, 175, 194, 228, + 290, 273, 121, 159, + 192, 308, 339, 408, + 399, 489, 575, 694, + 651, 753, 846, 873, + 866, 799, 810, 870, + 796, 898, 934, 950, + 872, 983, 1000, 1009, + 1001, 1048, 1082, 1023, + 1032, 1144, 1171, 1111, + 1145, 1066, 1242, 1204, + 1335, 1360, 1294, 1299, + 1281, 1328, 1440, 1815, + + // QP = 34 NEW + 0, 0, 0, 0, + 0, 0, 0, 37, + 35, 39, 55, 111, + 136, 140, 169, 190, + 249, 225, 86, 102, + 138, 239, 250, 262, + 270, 327, 405, 457, + 458, 512, 590, 678, + 636, 577, 651, 694, + 623, 738, 744, 741, + 699, 818, 803, 821, + 815, 833, 846, 825, + 812, 953, 932, 881, + 885, 856, 1040, 954, + 1069, 1077, 1039, 1062, + 1041, 1069, 1200, 1503, + + // QP = 35 NEW + 0, 0, 0, 0, + 0, 0, 0, 33, + 32, 35, 47, 109, + 114, 127, 147, 158, + 201, 195, 75, 87, + 112, 197, 209, 202, + 210, 253, 314, 346, + 355, 400, 456, 567, + 511, 466, 559, 612, + 524, 659, 638, 640, + 603, 711, 668, 734, + 695, 691, 701, 696, + 693, 817, 820, 736, + 750, 763, 919, 820, + 925, 920, 911, 940, + 892, 914, 1057, 1317, + + // QP = 36 NEW + 0, 0, 0, 0, + 0, 0, 0, 30, + 29, 32, 45, 85, + 95, 100, 121, 143, + 167, 164, 61, 71, + 92, 155, 166, 158, + 156, 195, 232, 246, + 271, 296, 335, 471, + 386, 363, 468, 508, + 441, 558, 542, 526, + 503, 613, 567, 614, + 586, 590, 582, 591, + 581, 697, 694, 619, + 611, 657, 784, 697, + 796, 771, 773, 785, + 767, 781, 883, 1131, + + // QP = 37 NEW + 0, 0, 0, 0, + 0, 0, 0, 28, + 28, 29, 39, 81, + 82, 102, 106, 119, + 140, 137, 55, 62, + 80, 142, 142, 136, + 134, 170, 202, 213, + 224, 247, 274, 402, + 322, 319, 406, 448, + 399, 499, 477, 466, + 459, 539, 490, 553, + 526, 510, 512, 532, + 520, 623, 624, 564, + 553, 587, 704, 609, + 723, 691, 682, 704, + 675, 680, 814, 1022, + + // QP = 38 NEW + 0, 0, 0, 0, + 0, 0, 0, 25, + 25, 26, 35, 70, + 67, 88, 90, 100, + 114, 117, 45, 52, + 67, 114, 112, 104, + 108, 133, 157, 167, + 174, 192, 214, 323, + 265, 250, 333, 373, + 340, 416, 388, 402, + 401, 453, 427, 465, + 456, 441, 441, 458, + 438, 522, 534, 490, + 484, 513, 603, 519, + 613, 587, 590, 608, + 602, 580, 696, 888, + + // QP = 39 NEW + 0, 0, 0, 0, + 0, 0, 0, 23, + 23, 24, 30, 60, + 60, 81, 82, 83, + 102, 104, 40, 47, + 60, 97, 101, 96, + 95, 122, 136, 145, + 160, 169, 185, 285, + 228, 214, 301, 323, + 301, 375, 362, 355, + 359, 406, 388, 416, + 422, 400, 397, 413, + 392, 471, 487, 451, + 432, 455, 543, 480, + 562, 536, 527, 560, + 550, 534, 639, 812, + + // QP = 40 NEW + 0, 0, 0, 0, + 0, 0, 0, 22, + 21, 22, 30, 59, + 56, 66, 69, 68, + 79, 83, 35, 41, + 50, 80, 87, 81, + 78, 100, 107, 116, + 130, 133, 152, 238, + 187, 185, 252, 279, + 256, 314, 302, 308, + 297, 341, 321, 365, + 366, 347, 345, 346, + 339, 403, 417, 392, + 379, 413, 477, 419, + 490, 455, 463, 474, + 480, 463, 562, 714, + + // QP = 41 NEW + 0, 0, 0, 0, + 0, 0, 0, 21, + 20, 23, 28, 56, + 51, 54, 56, 65, + 65, 66, 33, 36, + 45, 68, 75, 73, + 68, 88, 101, 100, + 107, 119, 134, 204, + 161, 161, 225, 248, + 234, 274, 273, 275, + 275, 306, 288, 338, + 322, 309, 318, 315, + 307, 353, 379, 348, + 352, 375, 425, 388, + 438, 420, 418, 427, + 450, 420, 497, 653, + + // QP = 42 NEW + 0, 0, 0, 0, + 0, 0, 0, 19, + 18, 19, 27, 41, + 44, 49, 47, 54, + 52, 59, 30, 31, + 37, 59, 64, 62, + 55, 76, 82, 84, + 89, 96, 114, 167, + 141, 144, 189, 216, + 197, 235, 228, 233, + 235, 272, 252, 287, + 283, 270, 277, 277, + 265, 319, 334, 300, + 305, 325, 376, 340, + 376, 366, 363, 375, + 396, 370, 447, 574, + + // QP = 43 NEW + 0, 0, 0, 0, + 0, 0, 0, 19, + 18, 19, 23, 40, + 39, 41, 46, 49, + 41, 48, 26, 28, + 32, 50, 51, 53, + 50, 61, 74, 75, + 80, 84, 97, 151, + 128, 124, 168, 186, + 182, 208, 205, 204, + 207, 235, 223, 251, + 260, 244, 241, 243, + 242, 284, 289, 284, + 280, 296, 332, 308, + 333, 324, 316, 341, + 361, 335, 404, 524, + + // QP = 44 NEW + 0, 0, 0, 0, + 0, 0, 0, 17, + 16, 18, 20, 35, + 34, 40, 41, 37, + 43, 45, 23, 25, + 30, 41, 43, 42, + 40, 55, 60, 62, + 66, 74, 80, 120, + 100, 105, 140, 150, + 149, 172, 171, 177, + 171, 196, 192, 209, + 220, 211, 202, 204, + 206, 253, 251, 240, + 239, 255, 286, 275, + 273, 281, 284, 283, + 307, 281, 334, 453, + + // QP = 45 NEW + 0, 0, 0, 0, + 0, 0, 0, 15, + 15, 16, 21, 33, + 33, 34, 32, 32, + 40, 37, 19, 22, + 25, 36, 37, 36, + 35, 47, 51, 49, + 56, 59, 68, 102, + 86, 93, 114, 136, + 123, 156, 138, 142, + 147, 160, 157, 179, + 194, 182, 184, 190, + 176, 218, 213, 212, + 200, 224, 249, 239, + 246, 244, 240, 254, + 280, 247, 302, 395, + + // QP = 46 NEW + 0, 0, 0, 0, + 0, 0, 0, 14, + 15, 15, 17, 31, + 32, 34, 32, 31, + 33, 30, 18, 20, + 22, 31, 33, 32, + 30, 39, 42, 43, + 44, 49, 60, 87, + 71, 77, 104, 110, + 110, 126, 119, 131, + 128, 137, 138, 155, + 164, 149, 153, 154, + 150, 190, 179, 182, + 182, 193, 210, 207, + 220, 217, 220, 212, + 234, 218, 259, 343, + + // QP = 47 NEW + 0, 0, 0, 0, + 0, 0, 0, 13, + 15, 15, 19, 30, + 30, 28, 29, 28, + 28, 27, 16, 18, + 19, 25, 29, 27, + 26, 33, 35, 38, + 38, 39, 51, 73, + 58, 62, 82, 97, + 97, 104, 97, 107, + 106, 110, 121, 130, + 145, 134, 129, 136, + 124, 152, 153, 161, + 160, 163, 180, 182, + 185, 184, 183, 188, + 202, 183, 221, 297, + + // QP = 48 NEW + 0, 0, 0, 0, + 0, 0, 0, 12, + 12, 13, 17, 27, + 26, 29, 25, 26, + 26, 24, 15, 17, + 17, 24, 26, 25, + 28, 28, 30, 32, + 31, 35, 42, 58, + 50, 54, 65, 80, + 80, 87, 85, 93, + 87, 96, 100, 111, + 119, 118, 114, 117, + 115, 144, 127, 141, + 135, 145, 149, 158, + 158, 160, 151, 160, + 183, 160, 190, 259, + + // QP = 49 NEW + 0, 0, 0, 0, + 0, 0, 0, 11, + 12, 12, 16, 23, + 22, 23, 22, 23, + 23, 24, 13, 15, + 16, 21, 21, 22, + 22, 25, 28, 31, + 27, 29, 35, 46, + 45, 46, 58, 70, + 65, 74, 67, 80, + 78, 79, 80, 95, + 102, 100, 93, 97, + 95, 120, 106, 119, + 121, 128, 128, 142, + 132, 139, 137, 135, + 158, 139, 162, 223, + + // QP = 50 NEW + 0, 0, 0, 0, + 0, 0, 0, 11, + 11, 12, 15, 22, + 19, 22, 19, 20, + 21, 21, 14, 14, + 16, 18, 19, 19, + 20, 21, 23, 24, + 24, 26, 32, 40, + 36, 40, 49, 56, + 56, 59, 56, 69, + 68, 63, 73, 80, + 84, 86, 84, 81, + 79, 103, 88, 100, + 101, 105, 109, 124, + 109, 109, 113, 111, + 135, 120, 142, 191, + + // QP = 51 NEW + 0, 0, 0, 0, + 0, 0, 0, 10, + 11, 12, 14, 20, + 18, 22, 18, 21, + 21, 20, 11, 13, + 14, 17, 16, 16, + 19, 20, 24, 21, + 22, 24, 28, 33, + 34, 38, 42, 51, + 42, 49, 47, 59, + 62, 58, 62, 67, + 68, 66, 73, 73, + 65, 85, 78, 90, + 92, 101, 91, 107, + 96, 103, 96, 98, + 122, 104, 119, 166, +}; @@ -1878,12 +1878,12 @@ EB_ERRORTYPE RateControlTablesCtor( for (temporalIndex=0; temporalIndex < MAX_TEMPORAL_LAYERS; temporalIndex++){ if (intervalIndex < (NUMBER_OF_SAD_INTERVALS >> 1)){ // intrinsics used in initial RC are assuming signed 16 bits is the maximum - initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), (EB_U16)initialRateControlSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + intervalIndex]); - initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), (EB_U16)initialRateControlIntraSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + intervalIndex]); @@ -1891,11 +1891,11 @@ EB_ERRORTYPE RateControlTablesCtor( } else{ - initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].sadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), (EB_U16)initialRateControlSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + ((NUMBER_OF_SAD_INTERVALS >> 1) - 1)]); - initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = + initialRateControlTablesArray[qpIndex].intraSadBitsArray[temporalIndex][intervalIndex] = CLIP3(1, (EB_U16)((1<<15)-1), initialRateControlIntraSad64x64Tables[qpIndex*(NUMBER_OF_SAD_INTERVALS >> 1) + ((NUMBER_OF_SAD_INTERVALS >> 1) - 1)]); diff --git a/Source/Lib/Codec/EbRateControlTables.h b/Source/Lib/Codec/EbRateControlTables.h index 42698f70a..718a889d3 100644 --- a/Source/Lib/Codec/EbRateControlTables.h +++ b/Source/Lib/Codec/EbRateControlTables.h @@ -25,7 +25,7 @@ extern "C" { #define TOTAL_NUMBER_OF_INTERVALS (NUMBER_OF_SAD_INTERVALS + \ NUMBER_OF_INTRA_SAD_INTERVALS ) -#define TOTAL_NUMBER_OF_REF_QP_VALUES 1 +#define TOTAL_NUMBER_OF_REF_QP_VALUES 1 #define TOTAL_NUMBER_OF_INITIAL_RC_TABLES_ENTRY (TOTAL_NUMBER_OF_REF_QP_VALUES * TOTAL_NUMBER_OF_INTERVALS) @@ -43,10 +43,10 @@ typedef struct InitialRateControlTables_s { } RateControlTables_t; -static const EB_U8 refQpListTable [] = +static const EB_U8 refQpListTable [] = - { 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, + { 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, diff --git a/Source/Lib/Codec/EbRateControlTasks.h b/Source/Lib/Codec/EbRateControlTasks.h index 7e94007d4..3084c1d6f 100644 --- a/Source/Lib/Codec/EbRateControlTasks.h +++ b/Source/Lib/Codec/EbRateControlTasks.h @@ -38,7 +38,7 @@ typedef struct RateControlTasks_s EB_U16 tileIndex; EB_U32 rowNumber; EB_U32 bitCount; - + } RateControlTasks_t; typedef struct RateControlTasksInitData_s @@ -50,7 +50,7 @@ typedef struct RateControlTasksInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE RateControlTasksCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbRateDistortionCost.c b/Source/Lib/Codec/EbRateDistortionCost.c index 1a3c19f72..af87d843d 100644 --- a/Source/Lib/Codec/EbRateDistortionCost.c +++ b/Source/Lib/Codec/EbRateDistortionCost.c @@ -20,14 +20,14 @@ static const EB_U32 mvpIndexBits[2] = { 23196, 44891 }; #define WEIGHT_FACTOR_FOR_AURA_CU 4 EB_ERRORTYPE MergeSkipFullLumaCost( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize); + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize); /********************************************************************************* * apply Weight on Chroma Distortion @@ -68,104 +68,104 @@ EB_U64 getWeightedChromaDistortion( * Coding Loop Context Generation ************************************************************/ void CodingLoopContextGeneration( - ModeDecisionContext_t *contextPtr, - CodingUnit_t *cuPtr, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - EB_U32 lcuSize, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *skipFlagNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray, - NeighborArrayUnit_t *leafDepthNeighborArray) + ModeDecisionContext_t *contextPtr, + CodingUnit_t *cuPtr, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + EB_U32 lcuSize, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *skipFlagNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray, + NeighborArrayUnit_t *leafDepthNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - cuOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - cuOriginX); - EB_U32 leafDepthLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - leafDepthNeighborArray, - cuOriginY); - EB_U32 leafDepthTopNeighborIndex = GetNeighborArrayUnitTopIndex( - leafDepthNeighborArray, - cuOriginX); - EB_U32 skipFlagLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - skipFlagNeighborArray, - cuOriginY); - EB_U32 skipFlagTopNeighborIndex = GetNeighborArrayUnitTopIndex( - skipFlagNeighborArray, - cuOriginX); - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaNeighborArray, - cuOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaNeighborArray, - cuOriginX); - - // Intra Luma Neighbor Modes - (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); - (&cuPtr->predictionUnitArray[0])->intraLumaTopMode = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then - (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width - // Top Intra Mode Neighbor Array instead of a Full - // Skip Flag Context - cuPtr->skipFlagContext = - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (skipFlagNeighborArray->leftArray[skipFlagLeftNeighborIndex] == EB_TRUE) ? 1 : 0; - cuPtr->skipFlagContext += - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : - (skipFlagNeighborArray->topArray[skipFlagTopNeighborIndex] == EB_TRUE) ? 1 : 0; - - // Split Flag Context (neighbor info) - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth = leafDepthNeighborArray->leftArray[leafDepthLeftNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth = leafDepthNeighborArray->topArray[leafDepthTopNeighborIndex]; - - return; + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + cuOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + cuOriginX); + EB_U32 leafDepthLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + leafDepthNeighborArray, + cuOriginY); + EB_U32 leafDepthTopNeighborIndex = GetNeighborArrayUnitTopIndex( + leafDepthNeighborArray, + cuOriginX); + EB_U32 skipFlagLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + skipFlagNeighborArray, + cuOriginY); + EB_U32 skipFlagTopNeighborIndex = GetNeighborArrayUnitTopIndex( + skipFlagNeighborArray, + cuOriginX); + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaNeighborArray, + cuOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaNeighborArray, + cuOriginX); + + // Intra Luma Neighbor Modes + (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode = (EB_U32)( + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + (&cuPtr->predictionUnitArray[0])->intraLumaTopMode = (EB_U32)( + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then + (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width + // Top Intra Mode Neighbor Array instead of a Full + // Skip Flag Context + cuPtr->skipFlagContext = + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (skipFlagNeighborArray->leftArray[skipFlagLeftNeighborIndex] == EB_TRUE) ? 1 : 0; + cuPtr->skipFlagContext += + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] == (EB_U8)INVALID_MODE) ? 0 : + (skipFlagNeighborArray->topArray[skipFlagTopNeighborIndex] == EB_TRUE) ? 1 : 0; + + // Split Flag Context (neighbor info) + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth = leafDepthNeighborArray->leftArray[leafDepthLeftNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth = leafDepthNeighborArray->topArray[leafDepthTopNeighborIndex]; + + return; } void ModeDecisionRefinementContextGeneration( - ModeDecisionContext_t *contextPtr, - CodingUnit_t *cuPtr, - EB_U32 cuOriginX, - EB_U32 cuOriginY, - EB_U32 lcuSize, - NeighborArrayUnit_t *intraLumaNeighborArray, - NeighborArrayUnit_t *modeTypeNeighborArray) + ModeDecisionContext_t *contextPtr, + CodingUnit_t *cuPtr, + EB_U32 cuOriginX, + EB_U32 cuOriginY, + EB_U32 lcuSize, + NeighborArrayUnit_t *intraLumaNeighborArray, + NeighborArrayUnit_t *modeTypeNeighborArray) { - EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - modeTypeNeighborArray, - cuOriginY); - EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - modeTypeNeighborArray, - cuOriginX); - - EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( - intraLumaNeighborArray, - cuOriginY); - EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( - intraLumaNeighborArray, - cuOriginX); - - // Intra Luma Neighbor Modes - cuPtr->predictionUnitArray[0].intraLumaLeftMode = (EB_U32)( - (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); - cuPtr->predictionUnitArray[0].intraLumaTopMode = (EB_U32)( - (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : - ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then - (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width - - // Split Flag Context (neighbor info) - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; - contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; - - return; + EB_U32 modeTypeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + modeTypeNeighborArray, + cuOriginY); + EB_U32 modeTypeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + modeTypeNeighborArray, + cuOriginX); + + EB_U32 intraLumaModeLeftNeighborIndex = GetNeighborArrayUnitLeftIndex( + intraLumaNeighborArray, + cuOriginY); + EB_U32 intraLumaModeTopNeighborIndex = GetNeighborArrayUnitTopIndex( + intraLumaNeighborArray, + cuOriginX); + + // Intra Luma Neighbor Modes + cuPtr->predictionUnitArray[0].intraLumaLeftMode = (EB_U32)( + (modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + (EB_U32)intraLumaNeighborArray->leftArray[intraLumaModeLeftNeighborIndex]); + cuPtr->predictionUnitArray[0].intraLumaTopMode = (EB_U32)( + (modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex] != INTRA_MODE) ? EB_INTRA_DC : + ((cuOriginY & (lcuSize - 1)) == 0) ? EB_INTRA_DC : // If we are at the top of the LCU boundary, then + (EB_U32)intraLumaNeighborArray->topArray[intraLumaModeTopNeighborIndex]); // use DC. This seems like we could use a LCU-width + + // Split Flag Context (neighbor info) + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode = modeTypeNeighborArray->leftArray[modeTypeLeftNeighborIndex]; + contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode = modeTypeNeighborArray->topArray[modeTypeTopNeighborIndex]; + + return; } /******************************************** @@ -174,111 +174,111 @@ void ModeDecisionRefinementContextGeneration( ********************************************/ EB_ERRORTYPE TuCalcCost( - EB_U32 cuSize, - ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr - EB_U32 tuIndex, // input parameter, TU index inside the CU - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients - EB_U32 cbCountNonZeroCoeffs, // input parameter, number of non zero cb quantized coefficients - EB_U32 crCountNonZeroCoeffs, // input parameter, number of non zero cr quantized coefficients - EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes - EB_U64 cbTuDistortion[DIST_CALC_TOTAL], // input parameter, Cb distortion for both Normal and Cbf zero modes - EB_U64 crTuDistortion[DIST_CALC_TOTAL], // input parameter, Cr distortion for both Normal and Cbf zero modes - EB_U32 componentMask, - EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate - EB_U64 *cbTuCoeffBits, // input parameter, Cb quantized coefficients rate - EB_U64 *crTuCoeffBits, // input parameter, Cr quantized coefficients rate - EB_U32 qp, // input parameter, Cr quantized coefficients rate - EB_U64 lambda, // input parameter, lambda for Luma - EB_U64 lambdaChroma) // input parameter, lambda for Chroma + EB_U32 cuSize, + ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr + EB_U32 tuIndex, // input parameter, TU index inside the CU + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients + EB_U32 cbCountNonZeroCoeffs, // input parameter, number of non zero cb quantized coefficients + EB_U32 crCountNonZeroCoeffs, // input parameter, number of non zero cr quantized coefficients + EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes + EB_U64 cbTuDistortion[DIST_CALC_TOTAL], // input parameter, Cb distortion for both Normal and Cbf zero modes + EB_U64 crTuDistortion[DIST_CALC_TOTAL], // input parameter, Cr distortion for both Normal and Cbf zero modes + EB_U32 componentMask, + EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate + EB_U64 *cbTuCoeffBits, // input parameter, Cb quantized coefficients rate + EB_U64 *crTuCoeffBits, // input parameter, Cr quantized coefficients rate + EB_U32 qp, // input parameter, Cr quantized coefficients rate + EB_U64 lambda, // input parameter, lambda for Luma + EB_U64 lambdaChroma) // input parameter, lambda for Chroma { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 yCbfCtx = ((cuSize == transformSize)); - // Non Zero Cbf mode variables - EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; + // Non Zero Cbf mode variables + EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; - EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; + EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; - EB_U64 yNonZeroCbfRate; + EB_U64 yNonZeroCbfRate; - EB_U64 yNonZeroCbfCost = 0; + EB_U64 yNonZeroCbfCost = 0; - // Zero Cbf mode variables - EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; + // Zero Cbf mode variables + EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; - EB_U64 yZeroCbfLumaFlagBitsNum = 0; + EB_U64 yZeroCbfLumaFlagBitsNum = 0; - EB_U64 yZeroCbfRate; + EB_U64 yZeroCbfRate; - EB_U64 yZeroCbfCost = 0; + EB_U64 yZeroCbfCost = 0; - // Luma and chroma transform size shift for the distortion - (void)lambdaChroma; - (void)qp; - (void)crTuCoeffBits; - (void)cbTuCoeffBits; - (void)cbTuDistortion; - (void)crTuDistortion; - (void)transformChromaSize; + // Luma and chroma transform size shift for the distortion + (void)lambdaChroma; + (void)qp; + (void)crTuCoeffBits; + (void)cbTuCoeffBits; + (void)cbTuDistortion; + (void)crTuDistortion; + (void)transformChromaSize; - // **Compute distortion + // **Compute distortion - if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { + if (componentMask & PICTURE_BUFFER_DESC_Y_FLAG) { - // Non Zero Distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); + // Non Zero Distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); - // Zero distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); + // Zero distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); - // **Compute Rate + // **Compute Rate - // Estimate Cbf's Bits + // Estimate Cbf's Bits - yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; + yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; - yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; - yZeroCbfRate = yZeroCbfLumaFlagBitsNum; + yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; + yZeroCbfRate = yZeroCbfLumaFlagBitsNum; - if (candidatePtr->type == INTRA_MODE) { + if (candidatePtr->type == INTRA_MODE) { - yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; + yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; - } - else { + } + else { - yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - } + } - // **Compute Cost - yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + // **Compute Cost + yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); - *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; - yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; - } + candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); + *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; + yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; + } - if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { - candidatePtr->cbCbf |= ((cbCountNonZeroCoeffs != 0) << tuIndex); - } + if (componentMask & PICTURE_BUFFER_DESC_Cb_FLAG) { + candidatePtr->cbCbf |= ((cbCountNonZeroCoeffs != 0) << tuIndex); + } - if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { - candidatePtr->crCbf |= ((crCountNonZeroCoeffs != 0) << tuIndex); - } + if (componentMask & PICTURE_BUFFER_DESC_Cr_FLAG) { + candidatePtr->crCbf |= ((crCountNonZeroCoeffs != 0) << tuIndex); + } - return return_error; + return return_error; } /******************************************** @@ -287,83 +287,83 @@ EB_ERRORTYPE TuCalcCost( ********************************************/ EB_ERRORTYPE TuCalcCostLuma( - EB_U32 cuSize, - ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr - EB_U32 tuIndex, // input parameter, TU index inside the CU - EB_U32 transformSize, - EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients - EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes - EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate - EB_U32 qp, // input parameter, Cr quantized coefficients rate - EB_U64 lambda, // input parameter, lambda for Luma - EB_U64 lambdaChroma) // input parameter, lambda for Chroma + EB_U32 cuSize, + ModeDecisionCandidate_t *candidatePtr, // input parameter, prediction result Ptr + EB_U32 tuIndex, // input parameter, TU index inside the CU + EB_U32 transformSize, + EB_U32 yCountNonZeroCoeffs, // input parameter, number of non zero Y quantized coefficients + EB_U64 yTuDistortion[DIST_CALC_TOTAL], // input parameter, Y distortion for both Normal and Cbf zero modes + EB_U64 *yTuCoeffBits, // input parameter, Y quantized coefficients rate + EB_U32 qp, // input parameter, Cr quantized coefficients rate + EB_U64 lambda, // input parameter, lambda for Luma + EB_U64 lambdaChroma) // input parameter, lambda for Chroma { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 yCbfCtx = ((cuSize == transformSize)); - // Non Zero Cbf mode variables - EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; + // Non Zero Cbf mode variables + EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; - EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; + EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; - EB_U64 yNonZeroCbfRate; + EB_U64 yNonZeroCbfRate; - EB_U64 yNonZeroCbfCost = 0; + EB_U64 yNonZeroCbfCost = 0; - // Zero Cbf mode variables - EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; + // Zero Cbf mode variables + EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; - EB_U64 yZeroCbfLumaFlagBitsNum = 0; + EB_U64 yZeroCbfLumaFlagBitsNum = 0; - EB_U64 yZeroCbfRate; + EB_U64 yZeroCbfRate; - EB_U64 yZeroCbfCost = 0; + EB_U64 yZeroCbfCost = 0; - // Luma and chroma transform size shift for the distortion + // Luma and chroma transform size shift for the distortion - (void)lambdaChroma; - (void)qp; + (void)lambdaChroma; + (void)qp; - // **Compute distortion - // Non Zero Distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); + // **Compute distortion + // Non Zero Distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); - // Zero distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); + // Zero distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); - // **Compute Rate + // **Compute Rate - // Estimate Cbf's Bits + // Estimate Cbf's Bits - yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; - yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; - yZeroCbfRate = yZeroCbfLumaFlagBitsNum; + yNonZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yZeroCbfLumaFlagBitsNum = candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; + yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; + yZeroCbfRate = yZeroCbfLumaFlagBitsNum; - if (candidatePtr->type == INTRA_MODE){ + if (candidatePtr->type == INTRA_MODE){ - yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; + yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; - } - else{ + } + else{ - yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - } + } - // **Compute Cost - yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + // **Compute Cost + yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); - *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; - yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; + candidatePtr->yCbf |= (((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) << tuIndex); + *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; + yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; - return return_error; + return return_error; } /********************************************************************************* @@ -379,45 +379,45 @@ EB_ERRORTYPE TuCalcCostLuma( * intra mode as the current PU. **********************************************************************************/ EB_ERRORTYPE IntraLumaModeContext( - CodingUnit_t *cuPtr, - EB_U32 lumaMode, - EB_S32 *predictionIndex) + CodingUnit_t *cuPtr, + EB_U32 lumaMode, + EB_S32 *predictionIndex) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaPredictionArray[3]; - EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; - EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; - - if (leftNeighborMode == topNeighborMode) { - if (leftNeighborMode > 1) { // For angular modes - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - lumaPredictionArray[0] = EB_INTRA_PLANAR; - lumaPredictionArray[1] = EB_INTRA_DC; - lumaPredictionArray[2] = EB_INTRA_VERTICAL; - } - } - else { - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } - - *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : - (lumaMode == lumaPredictionArray[1]) ? 1 : - (lumaMode == lumaPredictionArray[2]) ? 2 : - -1; // luma mode is not equal to any of the predictors - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 lumaPredictionArray[3]; + EB_U32 leftNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode; + EB_U32 topNeighborMode = (&cuPtr->predictionUnitArray[0])->intraLumaTopMode; + + if (leftNeighborMode == topNeighborMode) { + if (leftNeighborMode > 1) { // For angular modes + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + lumaPredictionArray[0] = EB_INTRA_PLANAR; + lumaPredictionArray[1] = EB_INTRA_DC; + lumaPredictionArray[2] = EB_INTRA_VERTICAL; + } + } + else { + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } + + *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : + (lumaMode == lumaPredictionArray[1]) ? 1 : + (lumaMode == lumaPredictionArray[2]) ? 2 : + -1; // luma mode is not equal to any of the predictors + + return return_error; } /********************************************************************************* @@ -439,124 +439,124 @@ EB_ERRORTYPE IntraLumaModeContext( **********************************************************************************/ EB_ERRORTYPE Intra2Nx2NFastCostIsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - EB_U32 lumaMode = candidatePtr->intraLumaMode; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + EB_U32 lumaMode = candidatePtr->intraLumaMode; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate = 0; - EB_U64 chromaRate; - EB_U64 lumaSad, chromaSad; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate = 0; + EB_U64 chromaRate; + EB_U64 lumaSad, chromaSad; - // Luma and chroma distortion - EB_U64 totalDistortion; + // Luma and chroma distortion + EB_U64 totalDistortion; (void) pictureControlSetPtr; - // Estimate Chroma Mode Bits - chromaRate = 9732; // candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Partition Size Bits : + // Estimate Chroma Mode Bits + chromaRate = 9732; // candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Partition Size Bits : lumaRate = contextPtr->cuStats->depth == 3 ? 24752 : ZERO_COST; - // Estimate Luma Mode Bits for Intra - lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 57520 : 206378; - // Keep the Fast Luma and Chroma rate for future use - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = chromaRate; + // Estimate Luma Mode Bits for Intra + lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 57520 : 206378; + // Keep the Fast Luma and Chroma rate for future use + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = chromaRate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - // include luma only in total distortion + // include luma only in total distortion - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight - totalDistortion = lumaSad + chromaSad; + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight + totalDistortion = lumaSad + chromaSad; - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } EB_ERRORTYPE Intra2Nx2NFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - EB_S32 predictionIndex = -1; - // Number of bits for each synatax element + EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + EB_S32 predictionIndex = -1; + // Number of bits for each synatax element EB_U64 partSizeIntraBitsNum = 0; - EB_U64 intraLumaModeBitsNum = 0; - - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 lumaSad, chromaSad; - - // Luma and chroma distortion - EB_U64 totalDistortion; - // Estimate Chroma Mode Bits - chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[EB_INTRA_CHROMA_DM]; - - // Estimate Partition Size Bits : - partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[SIZE_2Nx2N] : - ZERO_COST; - - // Estimate Luma Mode Bits for Intra - IntraLumaModeContext( - cuPtr, - lumaMode, - &predictionIndex); - - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - partSizeIntraBitsNum + - intraLumaModeBitsNum; - - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; - - candidateBufferPtr->residualLumaSad = lumaDistortion; + EB_U64 intraLumaModeBitsNum = 0; + + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 lumaSad, chromaSad; + + // Luma and chroma distortion + EB_U64 totalDistortion; + // Estimate Chroma Mode Bits + chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[EB_INTRA_CHROMA_DM]; + + // Estimate Partition Size Bits : + partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[SIZE_2Nx2N] : + ZERO_COST; + + // Estimate Luma Mode Bits for Intra + IntraLumaModeContext( + cuPtr, + lumaMode, + &predictionIndex); + + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + partSizeIntraBitsNum + + intraLumaModeBitsNum; + + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; + + candidateBufferPtr->residualLumaSad = lumaDistortion; lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight totalDistortion = lumaSad + chromaSad; - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } @@ -579,50 +579,50 @@ EB_ERRORTYPE Intra2Nx2NFastCostIslice( **********************************************************************************/ EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 lumaSad, chromaSad; - EB_U32 lumaMode = candidatePtr->intraLumaMode; - // Luma and chroma distortion - EB_U64 totalDistortion; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 lumaSad, chromaSad; + EB_U32 lumaMode = candidatePtr->intraLumaMode; + // Luma and chroma distortion + EB_U64 totalDistortion; - // Estimate Chroma Mode Bits - chromaRate = 12368; // mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Partition Size Bits + // Estimate Chroma Mode Bits + chromaRate = 12368; // mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Partition Size Bits lumaRate = contextPtr->cuStats->depth == 3 ? 31523 : ZERO_COST; - // Estimate Pred Mode Bits - lumaRate += 136034; // mdRateEstimationPtr->predModeBits[candidateType]; - //// Estimate Luma Mode Bits for Intra - lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 72731 : 192228; + // Estimate Pred Mode Bits + lumaRate += 136034; // mdRateEstimationPtr->predModeBits[candidateType]; + //// Estimate Luma Mode Bits for Intra + lumaRate += (lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaLeftMode || lumaMode == (&cuPtr->predictionUnitArray[0])->intraLumaTopMode) ? 72731 : 192228; - // Keep the Fast Luma and Chroma rate for future use - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = chromaRate; + // Keep the Fast Luma and Chroma rate for future use + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = chromaRate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - // include luma only in total distortion - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + // include luma only in total distortion + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSad = (((chromaDistortion * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -633,26 +633,26 @@ EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( chromaSad = (((chromaDistortion * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - totalDistortion = lumaSad + chromaSad; + totalDistortion = lumaSad + chromaSad; - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } /********************************************************************************* @@ -671,122 +671,122 @@ EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullCostIslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; - // EB_U64 lumaCoeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; + // EB_U64 lumaCoeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - (void)pictureControlSetPtr; - (void)cuPtr; - (void)transformChromaSize; + (void)pictureControlSetPtr; + (void)cuPtr; + (void)transformChromaSize; (void)lcuPtr; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; - crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; + crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight - distortion = lumaSse + chromaSse; + distortion = lumaSse + chromaSse; - // Assign full cost + // Assign full cost *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; coeffRate = (*yCoeffBits) << 15; candidateBufferPtr->fullCostLuma = lumaSse + (((lambda * coeffRate + lambda * lumaRate ) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -805,110 +805,110 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullCostPslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; - //EB_U64 lumaCoeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; + //EB_U64 lumaCoeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - (void)cuPtr; - (void)transformChromaSize; + (void)cuPtr; + (void)transformChromaSize; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; - crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + cbCbfBlock = ((cbCbf)& (1 << tuCount)) > 0; + crCbfBlock = ((crCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -918,23 +918,23 @@ EB_ERRORTYPE IntraFullCostPslice( else { chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } - - distortion = lumaSse + chromaSse; - - // Assign full cost + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } + + distortion = lumaSse + chromaSse; + + // Assign full cost *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; (void)lcuPtr; @@ -942,7 +942,7 @@ EB_ERRORTYPE IntraFullCostPslice( candidateBufferPtr->fullCostLuma = lumaSse + (((lambda * coeffRate + lambda * lumaRate ) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -961,85 +961,85 @@ EB_ERRORTYPE IntraFullCostPslice( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullLumaCostIslice( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; + // Luma and chroma SSE + EB_U64 lumaSse; - (void)cuPtr; + (void)cuPtr; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // luma distortion - lumaSse = yDistortion[0]; + // luma distortion + lumaSse = yDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - distortion = lumaSse; + distortion = lumaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - return return_error; + return return_error; } /********************************************************************************* @@ -1058,85 +1058,85 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraFullLumaCostPslice( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx = ((cuSize == transformSize)); - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; + // Luma and chroma SSE + EB_U64 lumaSse; - (void)cuPtr; + (void)cuPtr; - transSubDivFlagCtx = 5 - Log2f(transformSize); - // Rate Estimation of each syntax element + transSubDivFlagCtx = 5 - Log2f(transformSize); + // Rate Estimation of each syntax element - // Estimate the Transform Split Flag & the Cbf's Bits - for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { + // Estimate the Transform Split Flag & the Cbf's Bits + for (tuCount = 0; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; + yCbfBlock = ((yCbf)& (1 << tuCount)) > 0; - if (transformBlockCount > 1) - yCbfCtx = 0; - else - yCbfCtx = 1; + if (transformBlockCount > 1) + yCbfCtx = 0; + else + yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // luma distortion - lumaSse = yDistortion[0]; + // luma distortion + lumaSse = yDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - distortion = lumaSse; + distortion = lumaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - return return_error; + return return_error; } /********************************************************************************* @@ -1156,97 +1156,97 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, **********************************************************************************/ EB_ERRORTYPE InterFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + CodingUnit_t *cuPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U64 lumaSad, chromaSad; - EB_U64 lumaRate; - EB_U64 distortion; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U64 lumaSad, chromaSad; + EB_U64 lumaRate; + EB_U64 distortion; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; (void)contextPtr; - if (candidatePtr->mergeFlag == EB_TRUE){ - EB_U32 mergeIndex = candidatePtr->mergeIndex; - // Rate - EB_U64 mergeSkiplumaRate; - mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + if (candidatePtr->mergeFlag == EB_TRUE){ + EB_U32 mergeIndex = candidatePtr->mergeIndex; + // Rate + EB_U64 mergeSkiplumaRate; + mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; - { - mergeSkiplumaRate += mergeIndexBits[mergeIndex]; - } + { + mergeSkiplumaRate += mergeIndexBits[mergeIndex]; + } - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidatePtr->fastLumaRate = mergeSkiplumaRate; - candidatePtr->fastChromaRate = ZERO_COST; - if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidatePtr->fastLumaRate = mergeSkiplumaRate; + candidatePtr->fastChromaRate = ZERO_COST; + if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ - chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); - distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; + chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); + distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; - } - else{ - distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; - } - candidateBufferPtr->residualLumaSad = lumaDistortion; + } + else{ + distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; + } + candidateBufferPtr->residualLumaSad = lumaDistortion; - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); - } - else{ + } + else{ - EB_U8 amvpIdx; - EB_S32 predRefX; - EB_S32 predRefY; - EB_S32 mvRefX; - EB_S32 mvRefY; + EB_U8 amvpIdx; + EB_S32 predRefX; + EB_S32 predRefY; + EB_S32 mvRefX; + EB_S32 mvRefY; - // Estimate Syntax Bits + // Estimate Syntax Bits - lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; + lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; - mvRefX = candidatePtr->motionVector_x_L0; - mvRefY = candidatePtr->motionVector_y_L0; + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; + mvRefX = candidatePtr->motionVector_x_L0; + mvRefY = candidatePtr->motionVector_y_L0; - EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); - EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); + EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); + EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = ZERO_COST; + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = ZERO_COST; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (6 * PSNRy + PSNRu + PSNRv) / 8. This approximate weighting - // should be used in the cost calc. - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (6 * PSNRy + PSNRu + PSNRv) / 8. This approximate weighting + // should be used in the cost calc. + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSad = (((chromaDistortion * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -1256,29 +1256,29 @@ EB_ERRORTYPE InterFastCostPsliceOpt( else { chromaSad = (((chromaDistortion * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - distortion = lumaSad + chromaSad; + distortion = lumaSad + chromaSad; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - // overwrite lumaDistortion with the shifted value to be used in cost function - lumaDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); + // overwrite lumaDistortion with the shifted value to be used in cost function + lumaDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - } - return return_error; + } + return return_error; } /********************************************************************************* @@ -1298,143 +1298,143 @@ EB_ERRORTYPE InterFastCostPsliceOpt( **********************************************************************************/ EB_ERRORTYPE InterFastCostBsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + CodingUnit_t *cuPtr, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + EB_ERRORTYPE return_error = EB_ErrorNone; + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; // Luma rate EB_U64 lumaRate; - EB_U64 distortion; // Luma and chroma distortion - EB_U64 lumaSad, chromaSad; - if (candidatePtr->mergeFlag == EB_TRUE){ + EB_U64 distortion; // Luma and chroma distortion + EB_U64 lumaSad, chromaSad; + if (candidatePtr->mergeFlag == EB_TRUE){ - EB_U32 mergeIndex = candidatePtr->mergeIndex; - // Rate - EB_U64 mergeSkiplumaRate; - mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + EB_U32 mergeIndex = candidatePtr->mergeIndex; + // Rate + EB_U64 mergeSkiplumaRate; + mergeSkiplumaRate = skipFlagBits[(NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; - { - mergeSkiplumaRate += mergeIndexBits[mergeIndex]; - } + { + mergeSkiplumaRate += mergeIndexBits[mergeIndex]; + } - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidatePtr->fastLumaRate = mergeSkiplumaRate; - candidatePtr->fastChromaRate = ZERO_COST; - if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidatePtr->fastLumaRate = mergeSkiplumaRate; + candidatePtr->fastChromaRate = ZERO_COST; + if (candidateBufferPtr->weightChromaDistortion == EB_TRUE){ - chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); - distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; + chromaDistortion = getWeightedChromaDistortion(pictureControlSetPtr, chromaDistortion, qp); + distortion = (((LUMA_WEIGHT * lumaDistortion)) << COST_PRECISION) + chromaDistortion; - } - else{ - distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; - } - candidateBufferPtr->residualLumaSad = lumaDistortion; + } + else{ + distortion = ((LUMA_WEIGHT * lumaDistortion) + chromaDistortion) << COST_PRECISION; + } + candidateBufferPtr->residualLumaSad = lumaDistortion; - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * mergeSkiplumaRate) + MD_OFFSET) >> MD_SHIFT); - } - else{ + } + else{ - const EB_U32 puIndex = 0; - EB_U8 amvpIdx; - EB_S32 predRefX; - EB_S32 predRefY; - EB_S32 mvRefX; - EB_S32 mvRefY; - EB_PREDDIRECTION predDirection = candidatePtr->predictionDirection[puIndex]; - EB_BOOL biPred = (EB_BOOL)(predDirection == BI_PRED); + const EB_U32 puIndex = 0; + EB_U8 amvpIdx; + EB_S32 predRefX; + EB_S32 predRefY; + EB_S32 mvRefX; + EB_S32 mvRefY; + EB_PREDDIRECTION predDirection = candidatePtr->predictionDirection[puIndex]; + EB_BOOL biPred = (EB_BOOL)(predDirection == BI_PRED); - // Estimate Syntax Bits + // Estimate Syntax Bits - lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; + lumaRate = 86440; // mergeFlagBits + skipFlagBits + predModeBits + interPartSizeBits; lumaRate += interBiDirBits[(contextPtr->cuStats->depth << 1) + biPred]; - if (predDirection < 2 && predDirection != BI_PRED) { - - lumaRate += interUniDirBits[predDirection]; + if (predDirection < 2 && predDirection != BI_PRED) { - if (predDirection == UNI_PRED_LIST_0){ + lumaRate += interUniDirBits[predDirection]; - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; - mvRefX = candidatePtr->motionVector_x_L0; - mvRefY = candidatePtr->motionVector_y_L0; + if (predDirection == UNI_PRED_LIST_0){ - } - else{ - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; - mvRefX = candidatePtr->motionVector_x_L1; - mvRefY = candidatePtr->motionVector_y_L1; + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; + mvRefX = candidatePtr->motionVector_x_L0; + mvRefY = candidatePtr->motionVector_y_L0; - } - - EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); - EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); - - - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; - - } - else{ + } + else{ + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; + mvRefX = candidatePtr->motionVector_x_L1; + mvRefY = candidatePtr->motionVector_y_L1; - // LIST 0 Rate Estimation - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; - mvRefX = candidatePtr->motionVector_x_L0; - mvRefY = candidatePtr->motionVector_y_L0; + } - EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); - EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; + EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); + EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); - // LIST 1 Rate Estimation - amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; - predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; - predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; - mvRefX = candidatePtr->motionVector_x_L1; - mvRefY = candidatePtr->motionVector_y_L1; - mvdX = EB_ABS_DIFF(predRefX, mvRefX); - mvdY = EB_ABS_DIFF(predRefY, mvRefY); - mvdX = mvdX > 499 ? 499 : mvdX; - mvdY = mvdY > 499 ? 499 : mvdY; + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; - lumaRate += mvBitTable[mvdX][mvdY]; - lumaRate += mvpIndexBits[amvpIdx]; + } + else{ + + // LIST 0 Rate Estimation + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_0]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_0]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_0]; + mvRefX = candidatePtr->motionVector_x_L0; + mvRefY = candidatePtr->motionVector_y_L0; + + EB_S32 mvdX = EB_ABS_DIFF(predRefX, mvRefX); + EB_S32 mvdY = EB_ABS_DIFF(predRefY, mvRefY); + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; + + // LIST 1 Rate Estimation + amvpIdx = candidatePtr->motionVectorPredIdx[REF_LIST_1]; + predRefX = candidatePtr->motionVectorPred_x[REF_LIST_1]; + predRefY = candidatePtr->motionVectorPred_y[REF_LIST_1]; + mvRefX = candidatePtr->motionVector_x_L1; + mvRefY = candidatePtr->motionVector_y_L1; + + mvdX = EB_ABS_DIFF(predRefX, mvRefX); + mvdY = EB_ABS_DIFF(predRefY, mvRefY); + mvdX = mvdX > 499 ? 499 : mvdX; + mvdY = mvdY > 499 ? 499 : mvdY; + + lumaRate += mvBitTable[mvdX][mvdY]; + lumaRate += mvpIndexBits[amvpIdx]; - } + } - // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element - // the full cost module - candidateBufferPtr->residualLumaSad = lumaDistortion; - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = ZERO_COST; + // *Note- store the fast rate to avoid the recomputation of the rate of each syntax element + // the full cost module + candidateBufferPtr->residualLumaSad = lumaDistortion; + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = ZERO_COST; - lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + lumaSad = (LUMA_WEIGHT * lumaDistortion) << COST_PRECISION; + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSad = (((chromaDistortion * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -1444,295 +1444,295 @@ EB_ERRORTYPE InterFastCostBsliceOpt( else { chromaSad = (((chromaDistortion * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSad = (((chromaDistortion * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSad = (((chromaDistortion * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - distortion = lumaSad + chromaSad; + distortion = lumaSad + chromaSad; - // Assign fast cost - *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign fast cost + *candidateBufferPtr->fastCostPtr = distortion + (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - } - return return_error; + } + return return_error; } /************************************ ******* EstimateTuFlags **************************************/ EB_ERRORTYPE EstimateTuFlags( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *tranSubDivFlagBitsNum, - EB_U64 *cbfLumaFlagBitsNum, - EB_U64 *cbfChromaFlagBitsNum) + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *tranSubDivFlagBitsNum, + EB_U64 *cbfLumaFlagBitsNum, + EB_U64 *cbfChromaFlagBitsNum) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - EB_U32 subDivContext; - EB_U32 tuIndex; - EB_U32 tuIndexDepth2; - EB_U32 tuTotalCount; - - - TransformUnit_t *tuPtr; - const TransformUnitStats_t *tuStatPtr; - EB_U32 tuItr; - EB_U32 tuSize; - EB_U32 parentTuIndex; - - EB_U32 cbfContext; - - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - - *tranSubDivFlagBitsNum = 0; - *cbfLumaFlagBitsNum = 0; - *cbfChromaFlagBitsNum = 0; - - // Set TU variables - if (cuSize == MAX_LCU_SIZE){ - tuTotalCount = 4; - tuIndex = 1; - tuItr = 0; - tuPtr = &cuPtr->transformUnitArray[0]; - tuPtr->splitFlag = EB_TRUE; - tuPtr->cbCbf = EB_FALSE; - tuPtr->crCbf = EB_FALSE; - tuPtr->chromaCbfContext = 0; //at TU level - } - else { - tuTotalCount = 1; - tuIndex = 0; - tuItr = 0; - } - - // Set TU - do { - tuStatPtr = GetTransformUnitStats(tuIndex); - tuSize = cuSize >> tuStatPtr->depth; - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - parentTuIndex = 0; - if (tuStatPtr->depth > 0) - parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; - - tuPtr->splitFlag = EB_FALSE; - tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); - tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); - tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); - tuPtr->chromaCbfContext = (tuIndex == 0) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level - tuPtr->lumaCbfContext = (cuSizeLog2 - Log2f(tuSize)) == 0 ? 1 : 0; - - if (tuPtr->cbCbf){ - cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; - } - if (tuPtr->crCbf){ - cuPtr->transformUnitArray[0].crCbf = EB_TRUE; - cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; - } - - ++tuItr; - tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; - - } while (tuItr < tuTotalCount); - - - tuPtr = &cuPtr->transformUnitArray[0]; - tuStatPtr = GetTransformUnitStats(0); - tuSize = cuSize >> tuStatPtr->depth; - cbfContext = tuPtr->chromaCbfContext; - subDivContext = 5 - Log2f(tuSize); - - if (cuSize != 64) { - // Encode split flag - *tranSubDivFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; - } - - if (tuPtr->splitFlag) { - - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - for (tuIndex = 1; tuIndex < 5; tuIndex += 1) { - tuPtr = &cuPtr->transformUnitArray[tuIndex]; - tuStatPtr = GetTransformUnitStats(tuIndex); - tuSize = cuSize >> tuStatPtr->depth; - - - if (GetCodedUnitStats(cuPtr->leafIndex)->size != 8) { - subDivContext = 5 - Log2f(tuSize); - // Encode split flag - *tranSubDivFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; - } - - if (tuPtr->splitFlag) { - cbfContext = tuPtr->chromaCbfContext; - if ((cuPtr->transformUnitArray[0].cbCbf) != 0){ - // Cb CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - if ((cuPtr->transformUnitArray[0].crCbf) != 0){ - // Cr CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - - } - - // Transform depth 2 - //tuIndexDepth2 = tuIndex*4 + 1; - - tuIndexDepth2 = tuIndex + 1; + EB_ERRORTYPE return_error = EB_ErrorNone; + + EB_U32 subDivContext; + EB_U32 tuIndex; + EB_U32 tuIndexDepth2; + EB_U32 tuTotalCount; + + + TransformUnit_t *tuPtr; + const TransformUnitStats_t *tuStatPtr; + EB_U32 tuItr; + EB_U32 tuSize; + EB_U32 parentTuIndex; + + EB_U32 cbfContext; + + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + + *tranSubDivFlagBitsNum = 0; + *cbfLumaFlagBitsNum = 0; + *cbfChromaFlagBitsNum = 0; + + // Set TU variables + if (cuSize == MAX_LCU_SIZE){ + tuTotalCount = 4; + tuIndex = 1; + tuItr = 0; + tuPtr = &cuPtr->transformUnitArray[0]; + tuPtr->splitFlag = EB_TRUE; + tuPtr->cbCbf = EB_FALSE; + tuPtr->crCbf = EB_FALSE; + tuPtr->chromaCbfContext = 0; //at TU level + } + else { + tuTotalCount = 1; + tuIndex = 0; + tuItr = 0; + } + + // Set TU + do { + tuStatPtr = GetTransformUnitStats(tuIndex); + tuSize = cuSize >> tuStatPtr->depth; + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + parentTuIndex = 0; + if (tuStatPtr->depth > 0) + parentTuIndex = tuIndexList[tuStatPtr->depth - 1][(tuItr >> 2)]; + + tuPtr->splitFlag = EB_FALSE; + tuPtr->lumaCbf = (EB_BOOL)(((candidatePtr->yCbf) & (1 << tuIndex)) > 0); + tuPtr->cbCbf = (EB_BOOL)(((candidatePtr->cbCbf) & (1 << (tuIndex))) > 0); + tuPtr->crCbf = (EB_BOOL)(((candidatePtr->crCbf) & (1 << (tuIndex))) > 0); + tuPtr->chromaCbfContext = (tuIndex == 0) ? 0 : (cuSizeLog2 - Log2f(tuSize)); //at TU level + tuPtr->lumaCbfContext = (cuSizeLog2 - Log2f(tuSize)) == 0 ? 1 : 0; + + if (tuPtr->cbCbf){ + cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].cbCbf = EB_TRUE; + } + if (tuPtr->crCbf){ + cuPtr->transformUnitArray[0].crCbf = EB_TRUE; + cuPtr->transformUnitArray[parentTuIndex].crCbf = EB_TRUE; + } + + ++tuItr; + tuIndex = tuIndexList[tuStatPtr->depth][tuItr]; + + } while (tuItr < tuTotalCount); + + + tuPtr = &cuPtr->transformUnitArray[0]; + tuStatPtr = GetTransformUnitStats(0); + tuSize = cuSize >> tuStatPtr->depth; + cbfContext = tuPtr->chromaCbfContext; + subDivContext = 5 - Log2f(tuSize); + + if (cuSize != 64) { + // Encode split flag + *tranSubDivFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; + } + + if (tuPtr->splitFlag) { + + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + for (tuIndex = 1; tuIndex < 5; tuIndex += 1) { + tuPtr = &cuPtr->transformUnitArray[tuIndex]; + tuStatPtr = GetTransformUnitStats(tuIndex); + tuSize = cuSize >> tuStatPtr->depth; + + + if (GetCodedUnitStats(cuPtr->leafIndex)->size != 8) { + subDivContext = 5 - Log2f(tuSize); + // Encode split flag + *tranSubDivFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[(EB_U32)(tuPtr->splitFlag) * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + subDivContext]; + } + + if (tuPtr->splitFlag) { + cbfContext = tuPtr->chromaCbfContext; + if ((cuPtr->transformUnitArray[0].cbCbf) != 0){ + // Cb CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + if ((cuPtr->transformUnitArray[0].crCbf) != 0){ + // Cr CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + + } + + // Transform depth 2 + //tuIndexDepth2 = tuIndex*4 + 1; + + tuIndexDepth2 = tuIndex + 1; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - - tuIndexDepth2++; + cbfContext = tuPtr->chromaCbfContext; + + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + cbfContext = tuPtr->lumaCbfContext; + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + + tuIndexDepth2++; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - - cbfContext = tuPtr->lumaCbfContext; - - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - - tuIndexDepth2++; + cbfContext = tuPtr->chromaCbfContext; + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + + cbfContext = tuPtr->lumaCbfContext; + + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + + tuIndexDepth2++; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; + cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - cbfContext = tuPtr->lumaCbfContext; + cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - tuIndexDepth2++; + tuIndexDepth2++; tuPtr = (tuIndexDepth2 < TRANSFORM_UNIT_MAX_COUNT) ? &cuPtr->transformUnitArray[tuIndexDepth2] : tuPtr; - cbfContext = tuPtr->chromaCbfContext; + cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cb CBF + if ((cuPtr->transformUnitArray[tuIndex].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - // Cr CBF - if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cr CBF + if ((cuPtr->transformUnitArray[tuIndex].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - cbfContext = tuPtr->lumaCbfContext; + cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - else { + } + else { - cbfContext = tuPtr->chromaCbfContext; + cbfContext = tuPtr->chromaCbfContext; - // Cb CBF - if ((cuPtr->transformUnitArray[0].cbCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cb CBF + if ((cuPtr->transformUnitArray[0].cbCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - // Cr CBF - if ((cuPtr->transformUnitArray[0].crCbf) && (tuSize != 8)){ - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } + // Cr CBF + if ((cuPtr->transformUnitArray[0].crCbf) && (tuSize != 8)){ + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } - cbfContext = tuPtr->lumaCbfContext; + cbfContext = tuPtr->lumaCbfContext; - // Luma CBF - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - } + // Luma CBF + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[tuPtr->lumaCbf * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + } - } - else { + } + else { - // Cb CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Cb CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - // Cr CBF - *cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + // Cr CBF + *cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(tuPtr->crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - // Luma CBF + // Luma CBF - // In the Inter case, if the RootCbf is 1 and the Chroma Cbfs are 0, then we can infer that the - // luma Cbf is true, so there is no need to code it. - if (tuPtr->cbCbf || tuPtr->crCbf) { + // In the Inter case, if the RootCbf is 1 and the Chroma Cbfs are 0, then we can infer that the + // luma Cbf is true, so there is no need to code it. + if (tuPtr->cbCbf || tuPtr->crCbf) { - //cbfContext = ((cuPtr->size == tuPtr->size) || (tuPtr->size == TRANSFORM_MAX_SIZE)); - cbfContext = tuPtr->lumaCbfContext; + //cbfContext = ((cuPtr->size == tuPtr->size) || (tuPtr->size == TRANSFORM_MAX_SIZE)); + cbfContext = tuPtr->lumaCbfContext; - *cbfLumaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[(tuPtr->lumaCbf>0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; - } - } + *cbfLumaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[(tuPtr->lumaCbf>0) * (NUMBER_OF_CBF_CASES >> 1) + cbfContext]; + } + } - return return_error; + return return_error; } /********************************************************************************* @@ -1751,174 +1751,174 @@ EB_ERRORTYPE EstimateTuFlags( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE InterFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ - MergeSkipFullCost( - lcuPtr, - cuPtr, - cuSize, - cuSizeLog2, - candidateBufferPtr, - qp, - yDistortion, - cbDistortion, - crDistortion, - lambda, - lambdaChroma, - yCoeffBits, - cbCoeffBits, - crCoeffBits, - transformSize, - transformChromaSize, - pictureControlSetPtr); - - } - else{ - - // Full Rate Estimation - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - - - EB_U64 rootCbfBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; - - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; - - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; - - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx; - - - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; - EB_U32 tuIndex; - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - transSubDivFlagCtx = 5 - Log2f(transformSize); - - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; - //EB_U64 lumaCoeffRate; - - // Luma and chroma distortion - EB_U64 distortion; - - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; - - // Rate Estimation of each syntax element - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; - - (void)cuPtr; - (void)cuSize; - (void)transformChromaSize; - - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - - chromaCbfCtx = 0; - //yCbfCtx = cuSizeLog2 - Log2f(transformSize); - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - - cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; - crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - tuIndex += 1; - - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits - - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + EB_ERRORTYPE return_error = EB_ErrorNone; + + if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ + MergeSkipFullCost( + lcuPtr, + cuPtr, + cuSize, + cuSizeLog2, + candidateBufferPtr, + qp, + yDistortion, + cbDistortion, + crDistortion, + lambda, + lambdaChroma, + yCoeffBits, + cbCoeffBits, + crCoeffBits, + transformSize, + transformChromaSize, + pictureControlSetPtr); - cbCbfBlock = (cbCbf > 0); - crCbfBlock = (crCbf > 0); - yCbfBlock = (yCbf > 0); + } + else{ - if (cbCbf || crCbf) { - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + // Full Rate Estimation + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } - } + EB_U64 rootCbfBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx; - // Compute Cost - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; + EB_U32 tuIndex; + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; + //EB_U64 lumaCoeffRate; - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + // Luma and chroma distortion + EB_U64 distortion; + + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; + + // Rate Estimation of each syntax element + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; + + (void)cuPtr; + (void)cuSize; + (void)transformChromaSize; + + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + + chromaCbfCtx = 0; + //yCbfCtx = cuSizeLog2 - Log2f(transformSize); + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + + cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; + crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfCtx = 0; + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + tuIndex += 1; + + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits + + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + + cbCbfBlock = (cbCbf > 0); + crCbfBlock = (crCbf > 0); + yCbfBlock = (yCbf > 0); + + if (cbCbf || crCbf) { + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } + + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + } + + } + + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; + + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; + + // Compute Cost + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; + + + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -1928,26 +1928,26 @@ EB_ERRORTYPE InterFullCost( else { chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } - - distortion = lumaSse + chromaSse; - - // Assign full cost + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSse = (((chromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } + + distortion = lumaSse + chromaSse; + + // Assign full cost *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - } - return return_error; + } + return return_error; } /********************************************************************************* @@ -1966,120 +1966,120 @@ EB_ERRORTYPE InterFullCost( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE InterFullLumaCost( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; - if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ - MergeSkipFullLumaCost( - cuPtr, - cuSize, - cuSizeLog2, - candidateBufferPtr, - yDistortion, - lambda, - yCoeffBits, - transformSize); + EB_ERRORTYPE return_error = EB_ErrorNone; + if (candidateBufferPtr->candidatePtr->mergeFlag == EB_TRUE){ + MergeSkipFullLumaCost( + cuPtr, + cuSize, + cuSizeLog2, + candidateBufferPtr, + yDistortion, + lambda, + yCoeffBits, + transformSize); - } - else{ + } + else{ - // Full Rate Estimation - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; + // Full Rate Estimation + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - EB_U64 rootCbfBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 rootCbfBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; - EB_U32 tuIndex; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; + EB_U32 tuIndex; - transSubDivFlagCtx = 5 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; + // Luma and chroma SSE + EB_U64 lumaSse; - // Rate Estimation of each syntax element - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; + // Rate Estimation of each syntax element + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + rootCbfBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->rootCbfBits[rootCbf]; - (void)cuPtr; - (void)cuSize; + (void)cuPtr; + (void)cuSize; - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - tuIndex += 1 ; - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits + yCbfCtx = 0; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + tuIndex += 1 ; + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = (yCbf > 0); + yCbfBlock = (yCbf > 0); - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + } - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = rootCbfBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // Compute Cost - lumaSse = yDistortion[0]; + // Compute Cost + lumaSse = yDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - distortion = lumaSse; + distortion = lumaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - distortion; - } - return return_error; + } + return return_error; } /********************************************************************************* @@ -2098,182 +2098,182 @@ EB_ERRORTYPE InterFullLumaCost( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE MergeSkipFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr) + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra - EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; - //EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex[0]; - EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - - EB_U64 skipFlagBitsNum = 0; - EB_U64 mergeFlagBitsNum = 0; - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 predModeBitsNum = 0; - EB_U64 mergeIndexBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U64 cbfChromaFlagBitsNum = 0; - - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; - - EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; - EB_U32 crCbfBlock; - EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - EB_U32 cbCbfBlock; - EB_U32 chromaCbfCtx; - - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - transSubDivFlagCtx = 5 - Log2f(transformSize); - EB_U32 tuCount; - EB_U32 tuIndex; - - // Merge - EB_U64 mergeLumaRate; - EB_U64 mergeChromaRate; - EB_U64 mergeDistortion; - EB_U64 mergeCost; - //EB_U64 mergeLumaCost; - EB_U64 mergeLumaSse; - EB_U64 mergeChromaSse; - EB_U64 coeffRate; - //EB_U64 lumaCoeffRate; - - // SKIP - EB_U64 skipDistortion; - EB_U64 skipCost; - //EB_U64 skipLumaCost; - - // Luma and chroma transform size shift for the distortion - EB_U64 skipLumaSse; - EB_U64 skipChromaSse; - - (void)transformSize; - (void)transformChromaSize; - (void)cuSize; + EB_ERRORTYPE return_error = EB_ErrorNone; + + + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra + EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; + //EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex[0]; + EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; + + EB_U64 skipFlagBitsNum = 0; + EB_U64 mergeFlagBitsNum = 0; + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 predModeBitsNum = 0; + EB_U64 mergeIndexBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U64 cbfChromaFlagBitsNum = 0; + + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; + + EB_U32 crCbf = candidateBufferPtr->candidatePtr->crCbf; + EB_U32 crCbfBlock; + EB_U32 cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + EB_U32 cbCbfBlock; + EB_U32 chromaCbfCtx; + + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); + EB_U32 tuCount; + EB_U32 tuIndex; + + // Merge + EB_U64 mergeLumaRate; + EB_U64 mergeChromaRate; + EB_U64 mergeDistortion; + EB_U64 mergeCost; + //EB_U64 mergeLumaCost; + EB_U64 mergeLumaSse; + EB_U64 mergeChromaSse; + EB_U64 coeffRate; + //EB_U64 lumaCoeffRate; + + // SKIP + EB_U64 skipDistortion; + EB_U64 skipCost; + //EB_U64 skipLumaCost; + + // Luma and chroma transform size shift for the distortion + EB_U64 skipLumaSse; + EB_U64 skipChromaSse; + + (void)transformSize; + (void)transformChromaSize; + (void)cuSize; (void)lcuPtr; - // Rate Estimation of each syntax element + // Rate Estimation of each syntax element - // Estimate Skip Flag Bits - skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + // Estimate Skip Flag Bits + skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; - // Estimate Merge Flag Bits - mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; + // Estimate Merge Flag Bits + mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; - // Estimate Pred Mode Bits - predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; + // Estimate Pred Mode Bits + predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; - { - mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; - } + { + mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; + } //mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - // for Merge, rootCBF is not sent + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + // for Merge, rootCBF is not sent - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - chromaCbfCtx = 0; - //yCbfCtx = (cuSizeLog2) - Log2f(transformSize);/*((cuPtr->sizeLog2) - Log2f(transformSize)) == 0 ? 1 : 0*/; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + chromaCbfCtx = 0; + //yCbfCtx = (cuSizeLog2) - Log2f(transformSize);/*((cuPtr->sizeLog2) - Log2f(transformSize)) == 0 ? 1 : 0*/; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(crCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[(cbCbf > 0) * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; - crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; - chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); + cbCbfBlock = ((cbCbf)& (1 << tuIndex)) > 0; + crCbfBlock = ((crCbf)& (1 << tuIndex)) > 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfCtx = 0; + chromaCbfCtx = cuSizeLog2 - Log2f(transformSize); - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; - tuIndex += 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + cbfChromaFlagBitsNum += (crCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + cbfChromaFlagBitsNum += (cbCbf > 0) ? candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] : 0; + tuIndex += 1; - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - cbCbfBlock = (cbCbf > 0); - crCbfBlock = (crCbf > 0); - yCbfBlock = (yCbf > 0); + cbCbfBlock = (cbCbf > 0); + crCbfBlock = (crCbf > 0); + yCbfBlock = (yCbf > 0); - if (cbCbfBlock || crCbfBlock) { - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + if (cbCbfBlock || crCbfBlock) { + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + } - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - } + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + } - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - mergeChromaRate = cbfChromaFlagBitsNum; + mergeChromaRate = cbfChromaFlagBitsNum; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - //lumaCoeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + //lumaCoeffRate = (*yCoeffBits) << 15; - // Compute Merge Cost - mergeLumaSse = yDistortion[0]; - mergeChromaSse = cbDistortion[0] + crDistortion[0]; + // Compute Merge Cost + mergeLumaSse = yDistortion[0]; + mergeChromaSse = cbDistortion[0] + crDistortion[0]; - skipLumaSse = yDistortion[1]; - skipChromaSse = cbDistortion[1] + crDistortion[1]; + skipLumaSse = yDistortion[1]; + skipChromaSse = cbDistortion[1] + crDistortion[1]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { - // Random Access + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + // Random Access if (pictureControlSetPtr->temporalLayerIndex == 0) { mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } @@ -2283,30 +2283,30 @@ EB_ERRORTYPE MergeSkipFullCost( else { mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } - - mergeDistortion = mergeLumaSse + mergeChromaSse; + } + else { + // Low delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + mergeChromaSse = (((mergeChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } + + mergeDistortion = mergeLumaSse + mergeChromaSse; mergeCost = mergeDistortion + (((lambda * coeffRate + lambda * mergeLumaRate + lambdaChroma * mergeChromaRate) + MD_OFFSET) >> MD_SHIFT); - // mergeLumaCost = mergeLumaSse + (((lambda * lumaCoeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); + // mergeLumaCost = mergeLumaSse + (((lambda * lumaCoeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { + if (pictureControlSetPtr->ParentPcsPtr->predStructure == EB_PRED_RANDOM_ACCESS) { if (pictureControlSetPtr->temporalLayerIndex == 0) { skipChromaSse = (((skipChromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); @@ -2318,37 +2318,37 @@ EB_ERRORTYPE MergeSkipFullCost( skipChromaSse = (((skipChromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); } - } - else { - // Low Delay - if (pictureControlSetPtr->temporalLayerIndex == 0) { - skipChromaSse = (((skipChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - skipChromaSse = (((skipChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - } + } + else { + // Low Delay + if (pictureControlSetPtr->temporalLayerIndex == 0) { + skipChromaSse = (((skipChromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + skipChromaSse = (((skipChromaSse * ChromaWeightFactorLdQpScaling[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + } - skipDistortion = skipLumaSse + skipChromaSse; + skipDistortion = skipLumaSse + skipChromaSse; skipCost = skipDistortion + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); - //skipLumaCost = skipLumaSse + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); + //skipLumaCost = skipLumaSse + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); - // Assign full cost - *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; + // Assign full cost + *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; - EB_U64 tempDistortion; - tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; + EB_U64 tempDistortion; + tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; *candidateBufferPtr->fullCostMergePtr = mergeCost; *candidateBufferPtr->fullCostSkipPtr = skipCost; // Assign merge flag - candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; - // Assign skip flag - candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; + candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; + // Assign skip flag + candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; - return return_error; + return return_error; } /********************************************************************************* @@ -2367,157 +2367,157 @@ EB_ERRORTYPE MergeSkipFullCost( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE MergeSkipFullLumaCost( - CodingUnit_t *cuPtr, - EB_U32 cuSize, - EB_U32 cuSizeLog2, - ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + CodingUnit_t *cuPtr, + EB_U32 cuSize, + EB_U32 cuSizeLog2, + ModeDecisionCandidateBuffer_t *candidateBufferPtr, + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra - EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; - EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra + EB_MODETYPE candidateType = candidateBufferPtr->candidatePtr->type == INTER_MODE ? 0 : 1; + EB_U32 mergeIndex = candidateBufferPtr->candidatePtr->mergeIndex; - EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; + EB_U32 rootCbf = candidateBufferPtr->candidatePtr->rootCbf; - EB_U64 skipFlagBitsNum = 0; - EB_U64 mergeFlagBitsNum = 0; - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 predModeBitsNum = 0; - EB_U64 mergeIndexBitsNum = 0; - EB_U64 tranSubDivFlagBitsNum = 0; - EB_U64 cbfLumaFlagBitsNum = 0; - EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; - EB_U32 yCbfBlock; - EB_U32 yCbfCtx; + EB_U64 skipFlagBitsNum = 0; + EB_U64 mergeFlagBitsNum = 0; + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 predModeBitsNum = 0; + EB_U64 mergeIndexBitsNum = 0; + EB_U64 tranSubDivFlagBitsNum = 0; + EB_U64 cbfLumaFlagBitsNum = 0; + EB_U32 yCbf = candidateBufferPtr->candidatePtr->yCbf; + EB_U32 yCbfBlock; + EB_U32 yCbfCtx; - EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 - EB_U32 transSubDivFlagCtx; - EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); - EB_U32 tuCount; - EB_U32 tuIndex; + EB_U32 transSubDivFlag = TU_SPLIT_ZERO; // *Note- hardcoded to 0 + EB_U32 transSubDivFlagCtx; + EB_U32 transformBlockCount = SQR(cuSizeLog2 - Log2f(transformSize) + 1); + EB_U32 tuCount; + EB_U32 tuIndex; - transSubDivFlagCtx = 5 - Log2f(transformSize); + transSubDivFlagCtx = 5 - Log2f(transformSize); - // Merge - EB_U64 mergeLumaRate; - EB_U64 mergeDistortion; - EB_U64 mergeCost; - EB_U64 mergeLumaSse; - EB_U64 coeffRate; + // Merge + EB_U64 mergeLumaRate; + EB_U64 mergeDistortion; + EB_U64 mergeCost; + EB_U64 mergeLumaSse; + EB_U64 coeffRate; - // SKIP - EB_U64 skipDistortion; - EB_U64 skipCost; + // SKIP + EB_U64 skipDistortion; + EB_U64 skipCost; - // Luma and chroma transform size shift for the distortion - EB_U64 skipLumaSse; + // Luma and chroma transform size shift for the distortion + EB_U64 skipLumaSse; - (void)cuSize; - (void)transformSize; + (void)cuSize; + (void)transformSize; - // Rate Estimation of each syntax element + // Rate Estimation of each syntax element - // Estimate Skip Flag Bits - skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; + // Estimate Skip Flag Bits + skipFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->skipFlagBits[SPLIT_FLAG_ZERO * (NUMBER_OF_SKIP_FLAG_CASES >> 1) + cuPtr->skipFlagContext]; - // Estimate Merge Flag Bits - mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; + // Estimate Merge Flag Bits + mergeFlagBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeFlagBits[1]; - // Estimate Pred Mode Bits - predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; + // Estimate Pred Mode Bits + predModeBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[candidateType]; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->interPartSizeBits[SIZE_2Nx2N]; - // Merge Index + // Merge Index { mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; } - //mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; + //mergeIndexBitsNum = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->mergeIndexBits[mergeIndex]; - // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits - // for Merge, rootCBF is not sent + // Estimate Root Cbf (Combined Y, Cb, & Cr Cbfs) Bits + // for Merge, rootCBF is not sent - // If the Root Cbf is on - if (rootCbf) { - if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) + // If the Root Cbf is on + if (rootCbf) { + if (transformBlockCount > 1) { //(cuPtr->size == MAX_LCU_SIZE) - for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + for (tuCount = 0, tuIndex = 1; tuCount < transformBlockCount; ++tuCount) { + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; - yCbfCtx = 0; + yCbfBlock = ((yCbf)& (1 << tuIndex)) > 0; + yCbfCtx = 0; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - tuIndex += 1; - } - } - else { - // Estimate the Transform Split Flag & the Cbf's Bits - tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + tuIndex += 1; + } + } + else { + // Estimate the Transform Split Flag & the Cbf's Bits + tranSubDivFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->transSubDivFlagBits[transSubDivFlag * (NUMBER_OF_TRANSFORM_SUBDIV_FLAG_CASES >> 1) + transSubDivFlagCtx]; - yCbfBlock = (yCbf > 0); + yCbfBlock = (yCbf > 0); - yCbfCtx = 1; - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yCbfCtx = 1; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbfBlock * (NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - } + } - } + } - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + mergeLumaRate = skipFlagBitsNum + mergeFlagBitsNum + predModeBitsNum + partSizeIntraBitsNum + mergeIndexBitsNum + tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Coeff rate - coeffRate = *yCoeffBits << 15; + // Coeff rate + coeffRate = *yCoeffBits << 15; - // Compute Merge Cost - mergeLumaSse = yDistortion[0]; + // Compute Merge Cost + mergeLumaSse = yDistortion[0]; - skipLumaSse = yDistortion[1]; + skipLumaSse = yDistortion[1]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumulas + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + mergeLumaSse = LUMA_WEIGHT * (mergeLumaSse << COST_PRECISION); - mergeDistortion = mergeLumaSse; + mergeDistortion = mergeLumaSse; - mergeCost = mergeDistortion + (((lambda * coeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); + mergeCost = mergeDistortion + (((lambda * coeffRate + lambda * mergeLumaRate) + MD_OFFSET) >> MD_SHIFT); - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + skipLumaSse = LUMA_WEIGHT * (skipLumaSse << COST_PRECISION); - skipDistortion = skipLumaSse; + skipDistortion = skipLumaSse; - skipCost = skipDistortion + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); + skipCost = skipDistortion + (((lambda * candidateBufferPtr->candidatePtr->fastLumaRate) + MD_OFFSET) >> MD_SHIFT); - // Assign full cost - *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; + // Assign full cost + *candidateBufferPtr->fullCostPtr = (skipCost <= mergeCost) ? skipCost : mergeCost; - EB_U64 tempDistortion; - tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; - candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; + EB_U64 tempDistortion; + tempDistortion = (skipCost <= mergeCost) ? skipDistortion : mergeDistortion; + candidateBufferPtr->fullLambdaRate = *candidateBufferPtr->fullCostPtr - tempDistortion; - *candidateBufferPtr->fullCostMergePtr = mergeCost; - *candidateBufferPtr->fullCostSkipPtr = skipCost; + *candidateBufferPtr->fullCostMergePtr = mergeCost; + *candidateBufferPtr->fullCostSkipPtr = skipCost; - // Assign merge flag - candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; - // Assign skip flag - candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; + // Assign merge flag + candidateBufferPtr->candidatePtr->mergeFlag = EB_TRUE; + // Assign skip flag + candidateBufferPtr->candidatePtr->skipFlag = EB_FALSE; - return return_error; + return return_error; } /********************************************************************************* @@ -2535,38 +2535,38 @@ EB_ERRORTYPE MergeSkipFullLumaCost( * mdRateEstimationPtr is pointer to MD rate Estimation Tables **********************************************************************************/ EB_ERRORTYPE SplitFlagRate( - ModeDecisionContext_t *contextPtr, - CodingUnit_t *cuPtr, - EB_U32 splitFlag, - EB_U64 *splitRate, - EB_U64 lambda, - MdRateEstimationContext_t *mdRateEstimationPtr, - EB_U32 tbMaxDepth) + ModeDecisionContext_t *contextPtr, + CodingUnit_t *cuPtr, + EB_U32 splitFlag, + EB_U64 *splitRate, + EB_U64 lambda, + MdRateEstimationContext_t *mdRateEstimationPtr, + EB_U32 tbMaxDepth) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 splitFlagContext; - EB_U32 cuDepth = GetCodedUnitStats(cuPtr->leafIndex)->depth; + EB_U32 splitFlagContext; + EB_U32 cuDepth = GetCodedUnitStats(cuPtr->leafIndex)->depth; - // Calculate the context - splitFlagContext = - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode > INTRA_MODE) ? 0 : - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth > cuDepth) ? 1 : 0; - splitFlagContext += - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode > INTRA_MODE) ? 0 : - (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth > cuDepth) ? 1 : 0; + // Calculate the context + splitFlagContext = + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborMode > INTRA_MODE) ? 0 : + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].leftNeighborDepth > cuDepth) ? 1 : 0; + splitFlagContext += + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborMode > INTRA_MODE) ? 0 : + (contextPtr->mdLocalCuUnit[cuPtr->leafIndex].topNeighborDepth > cuDepth) ? 1 : 0; - cuPtr->splitFlagContext = splitFlagContext; + cuPtr->splitFlagContext = splitFlagContext; - // Estimate Split Flag Bits - *splitRate = (GetCodedUnitStats(cuPtr->leafIndex)->depth < (tbMaxDepth - 1)) ? - mdRateEstimationPtr->splitFlagBits[splitFlag * (NUMBER_OF_SPLIT_FLAG_CASES >> 1) + splitFlagContext] : - ZERO_COST; + // Estimate Split Flag Bits + *splitRate = (GetCodedUnitStats(cuPtr->leafIndex)->depth < (tbMaxDepth - 1)) ? + mdRateEstimationPtr->splitFlagBits[splitFlag * (NUMBER_OF_SPLIT_FLAG_CASES >> 1) + splitFlagContext] : + ZERO_COST; - // Assign rate - *splitRate = (((lambda * *splitRate) + MD_OFFSET) >> MD_SHIFT); + // Assign rate + *splitRate = (((lambda * *splitRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /******************************************** @@ -2577,122 +2577,122 @@ EB_ERRORTYPE SplitFlagRate( EB_ERRORTYPE EncodeTuCalcCost( EncDecContext_t *contextPtr, - EB_U32 *countNonZeroCoeffs, - EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 *yTuCoeffBits, - EB_U32 componentMask - ) + EB_U32 *countNonZeroCoeffs, + EB_U64 yTuDistortion[DIST_CALC_TOTAL], + EB_U64 *yTuCoeffBits, + EB_U32 componentMask + ) { CodingUnit_t *cuPtr = contextPtr->cuPtr; - EB_U32 cuSize = contextPtr->cuStats->size; + EB_U32 cuSize = contextPtr->cuStats->size; EB_U32 tuIndex = cuSize == 64 ? contextPtr ->tuItr : 0; - EB_U32 transformSize = cuSize == 64 ? 32 : cuSize; + EB_U32 transformSize = cuSize == 64 ? 32 : cuSize; MdRateEstimationContext_t *mdRateEstimationPtr = contextPtr->mdRateEstimationPtr; EB_U64 lambda = contextPtr->fullLambda; EB_U32 yCountNonZeroCoeffs = countNonZeroCoeffs[0]; EB_U32 cbCountNonZeroCoeffs = countNonZeroCoeffs[1]; EB_U32 crCountNonZeroCoeffs = countNonZeroCoeffs[2]; - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbfCtx = ((cuSize == transformSize)); + EB_U32 yCbfCtx = ((cuSize == transformSize)); - // Non Zero Cbf mode variables - EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; + // Non Zero Cbf mode variables + EB_U64 yNonZeroCbfDistortion = yTuDistortion[DIST_CALC_RESIDUAL]; - EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; + EB_U64 yNonZeroCbfLumaFlagBitsNum = 0; - EB_U64 yNonZeroCbfRate; + EB_U64 yNonZeroCbfRate; - EB_U64 yNonZeroCbfCost = 0; + EB_U64 yNonZeroCbfCost = 0; - // Zero Cbf mode variables - EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; + // Zero Cbf mode variables + EB_U64 yZeroCbfDistortion = yTuDistortion[DIST_CALC_PREDICTION]; - EB_U64 yZeroCbfLumaFlagBitsNum = 0; + EB_U64 yZeroCbfLumaFlagBitsNum = 0; - EB_U64 yZeroCbfRate; + EB_U64 yZeroCbfRate; - EB_U64 yZeroCbfCost = 0; + EB_U64 yZeroCbfCost = 0; - // Luma and chroma transform size shift for the distortion + // Luma and chroma transform size shift for the distortion - // **Compute distortion - if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { + // **Compute distortion + if (componentMask & PICTURE_BUFFER_DESC_LUMA_MASK) { // Non Zero Distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yNonZeroCbfDistortion = LUMA_WEIGHT * (yNonZeroCbfDistortion << COST_PRECISION); - // Zero distortion - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); + // Zero distortion + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + yZeroCbfDistortion = LUMA_WEIGHT * (yZeroCbfDistortion << COST_PRECISION); - yNonZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; - yZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; - yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; - yZeroCbfRate = yZeroCbfLumaFlagBitsNum; + yNonZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[(NUMBER_OF_CBF_CASES >> 1) + yCbfCtx]; + yZeroCbfLumaFlagBitsNum = mdRateEstimationPtr->lumaCbfBits[yCbfCtx]; + yNonZeroCbfRate = ((*yTuCoeffBits) << 15) + yNonZeroCbfLumaFlagBitsNum; + yZeroCbfRate = yZeroCbfLumaFlagBitsNum; - if ( cuPtr->predictionModeFlag == INTRA_MODE) { + if ( cuPtr->predictionModeFlag == INTRA_MODE) { - yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; + yZeroCbfCost = 0xFFFFFFFFFFFFFFFFull; - } - else { + } + else { - yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - } + yZeroCbfCost = yZeroCbfDistortion + (((lambda * yZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + } - // **Compute Cost - yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + // **Compute Cost + yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - cuPtr->transformUnitArray[tuIndex].lumaCbf = ((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) ? EB_TRUE : EB_FALSE; - *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; - yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; + cuPtr->transformUnitArray[tuIndex].lumaCbf = ((yCountNonZeroCoeffs != 0) && (yNonZeroCbfCost < yZeroCbfCost)) ? EB_TRUE : EB_FALSE; + *yTuCoeffBits = (yNonZeroCbfCost < yZeroCbfCost) ? *yTuCoeffBits : 0; + yTuDistortion[DIST_CALC_RESIDUAL] = (yNonZeroCbfCost < yZeroCbfCost) ? yTuDistortion[DIST_CALC_RESIDUAL] : yTuDistortion[DIST_CALC_PREDICTION]; - } - else{ + } + else{ - cuPtr->transformUnitArray[tuIndex].lumaCbf = EB_FALSE; + cuPtr->transformUnitArray[tuIndex].lumaCbf = EB_FALSE; - } - cuPtr->transformUnitArray[tuIndex].cbCbf = cbCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; - cuPtr->transformUnitArray[tuIndex].crCbf = crCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; + } + cuPtr->transformUnitArray[tuIndex].cbCbf = cbCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; + cuPtr->transformUnitArray[tuIndex].crCbf = crCountNonZeroCoeffs != 0 ? EB_TRUE : EB_FALSE; - if (cuPtr->transformUnitArray[tuIndex].lumaCbf) { - cuPtr->transformUnitArray[0].lumaCbf = EB_TRUE; - } + if (cuPtr->transformUnitArray[tuIndex].lumaCbf) { + cuPtr->transformUnitArray[0].lumaCbf = EB_TRUE; + } - if (cuPtr->transformUnitArray[tuIndex].cbCbf) { - cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; - } + if (cuPtr->transformUnitArray[tuIndex].cbCbf) { + cuPtr->transformUnitArray[0].cbCbf = EB_TRUE; + } - if (cuPtr->transformUnitArray[tuIndex].crCbf) { - cuPtr->transformUnitArray[0].crCbf = EB_TRUE; - } + if (cuPtr->transformUnitArray[tuIndex].crCbf) { + cuPtr->transformUnitArray[0].crCbf = EB_TRUE; + } - return return_error; + return return_error; } EB_U64 EbHevcGetPMCost( - EB_U64 lambda, - EB_U64 tuDistortion, - EB_U64 yTuCoeffBits - ) + EB_U64 lambda, + EB_U64 tuDistortion, + EB_U64 yTuCoeffBits + ) { - EB_U64 yNonZeroCbfDistortion = LUMA_WEIGHT * (tuDistortion << COST_PRECISION); + EB_U64 yNonZeroCbfDistortion = LUMA_WEIGHT * (tuDistortion << COST_PRECISION); EB_U64 yNonZeroCbfRate = (yTuCoeffBits ); - EB_U64 yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); + EB_U64 yNonZeroCbfCost = yNonZeroCbfDistortion + (((lambda * yNonZeroCbfRate) + MD_OFFSET) >> MD_SHIFT); - return yNonZeroCbfCost; + return yNonZeroCbfCost; } @@ -2709,46 +2709,46 @@ EB_U64 EbHevcGetPMCost( * intra mode as the current PU. **********************************************************************************/ EB_ERRORTYPE Intra4x4LumaModeContext( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, - EB_U32 lumaMode, - EB_S32 *predictionIndex) + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, + EB_U32 lumaMode, + EB_S32 *predictionIndex) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaPredictionArray[3]; - EB_U32 leftNeighborMode = contextPtr->intraLumaLeftModeArray[puIndex]; - EB_U32 topNeighborMode = contextPtr->intraLumaTopModeArray[puIndex]; - - if (leftNeighborMode == topNeighborMode) { - if (leftNeighborMode > 1) { // For angular modes - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; - lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; - } - else { // Non Angular modes - lumaPredictionArray[0] = EB_INTRA_PLANAR; - lumaPredictionArray[1] = EB_INTRA_DC; - lumaPredictionArray[2] = EB_INTRA_VERTICAL; - } - } - else { - lumaPredictionArray[0] = leftNeighborMode; - lumaPredictionArray[1] = topNeighborMode; - - if (leftNeighborMode && topNeighborMode) { - lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar - } - else { - lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; - } - } - - *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : - (lumaMode == lumaPredictionArray[1]) ? 1 : - (lumaMode == lumaPredictionArray[2]) ? 2 : - -1; // luma mode is not equal to any of the predictors - - return return_error; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U32 lumaPredictionArray[3]; + EB_U32 leftNeighborMode = contextPtr->intraLumaLeftModeArray[puIndex]; + EB_U32 topNeighborMode = contextPtr->intraLumaTopModeArray[puIndex]; + + if (leftNeighborMode == topNeighborMode) { + if (leftNeighborMode > 1) { // For angular modes + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = ((leftNeighborMode + 29) & 0x1F) + 2; + lumaPredictionArray[2] = ((leftNeighborMode - 1) & 0x1F) + 2; + } + else { // Non Angular modes + lumaPredictionArray[0] = EB_INTRA_PLANAR; + lumaPredictionArray[1] = EB_INTRA_DC; + lumaPredictionArray[2] = EB_INTRA_VERTICAL; + } + } + else { + lumaPredictionArray[0] = leftNeighborMode; + lumaPredictionArray[1] = topNeighborMode; + + if (leftNeighborMode && topNeighborMode) { + lumaPredictionArray[2] = EB_INTRA_PLANAR; // when both modes are non planar + } + else { + lumaPredictionArray[2] = (leftNeighborMode + topNeighborMode) < 2 ? EB_INTRA_VERTICAL : EB_INTRA_DC; + } + } + + *predictionIndex = (lumaMode == lumaPredictionArray[0]) ? 0 : + (lumaMode == lumaPredictionArray[1]) ? 1 : + (lumaMode == lumaPredictionArray[2]) ? 2 : + -1; // luma mode is not equal to any of the predictors + + return return_error; } /********************************************************************************* * Intra4x4FastCostIslice function is used to estimate the cost of an intra 4x4 candidate mode @@ -2767,71 +2767,71 @@ EB_ERRORTYPE Intra4x4LumaModeContext( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE Intra4x4FastCostIslice( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 lumaDistortion, - EB_U64 lambda) + EB_U64 lumaDistortion, + EB_U64 lambda) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode; - EB_S32 predictionIndex; + EB_U32 lumaMode; + EB_S32 predictionIndex; - // Number of bits for each synatax element - EB_U64 partSizeIntraBitsNum; - EB_U64 intraLumaModeBitsNum; - // Luma and chroma rate - EB_U64 rate; + // Number of bits for each synatax element + EB_U64 partSizeIntraBitsNum; + EB_U64 intraLumaModeBitsNum; + // Luma and chroma rate + EB_U64 rate; EB_U64 lumaRate; - // Luma distortion - EB_U64 totalDistortion; + // Luma distortion + EB_U64 totalDistortion; - lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - predictionIndex = -1; + lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + predictionIndex = -1; - partSizeIntraBitsNum = 0; - intraLumaModeBitsNum = 0; + partSizeIntraBitsNum = 0; + intraLumaModeBitsNum = 0; - // Estimate Partition Size Bits - partSizeIntraBitsNum = (puIndex == 0) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : - 0; + // Estimate Partition Size Bits + partSizeIntraBitsNum = (puIndex == 0) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : + 0; - // Estimate Luma Mode Bits for Intra - Intra4x4LumaModeContext( + // Estimate Luma Mode Bits for Intra + Intra4x4LumaModeContext( contextPtr, - puIndex, - lumaMode, - &predictionIndex); + puIndex, + lumaMode, + &predictionIndex); - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - // Distortion calculation - totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); + // Distortion calculation + totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); - // Rate calculation - rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Rate calculation + rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - return return_error; + return return_error; } /********************************************************************************* @@ -2851,84 +2851,84 @@ EB_ERRORTYPE Intra4x4FastCostIslice( * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE Intra4x4FastCostPslice( - ModeDecisionContext_t *contextPtr, - EB_U32 puIndex, + ModeDecisionContext_t *contextPtr, + EB_U32 puIndex, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 lumaDistortion, - EB_U64 lambda) + EB_U64 lumaDistortion, + EB_U64 lambda) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode; - EB_S32 predictionIndex; + EB_U32 lumaMode; + EB_S32 predictionIndex; - // Number of bits for each synatax element - EB_U64 predModeBitsNum; - EB_U64 partSizeIntraBitsNum; - EB_U64 intraLumaModeBitsNum; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - // Luma distortion - EB_U64 totalDistortion; + // Number of bits for each synatax element + EB_U64 predModeBitsNum; + EB_U64 partSizeIntraBitsNum; + EB_U64 intraLumaModeBitsNum; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + // Luma distortion + EB_U64 totalDistortion; - lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - predictionIndex = -1; + lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + predictionIndex = -1; - predModeBitsNum = 0; - partSizeIntraBitsNum = 0; - intraLumaModeBitsNum = 0; + predModeBitsNum = 0; + partSizeIntraBitsNum = 0; + intraLumaModeBitsNum = 0; - // Estimate Partition Size Bits - partSizeIntraBitsNum = (puIndex == 0) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : - 0; + // Estimate Partition Size Bits + partSizeIntraBitsNum = (puIndex == 0) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[1] : + 0; - // Estimate Pred Mode Bits + // Estimate Pred Mode Bits - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra - predModeBitsNum = (puIndex == 0) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[1] : - 0; + predModeBitsNum = (puIndex == 0) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->predModeBits[1] : + 0; - // Estimate Luma Mode Bits for Intra - Intra4x4LumaModeContext( + // Estimate Luma Mode Bits for Intra + Intra4x4LumaModeContext( contextPtr, - puIndex, - lumaMode, - &predictionIndex); + puIndex, + lumaMode, + &predictionIndex); - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - predModeBitsNum + - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + predModeBitsNum + + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - // Distortion calculation - totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); + // Distortion calculation + totalDistortion = ((LUMA_WEIGHT * lumaDistortion) << COST_PRECISION); - // Rate calculation - rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Rate calculation + rate = (((lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - return return_error; + return return_error; } /********************************************************************************* @@ -2950,51 +2950,51 @@ EB_ERRORTYPE Intra4x4FastCostPslice( **********************************************************************************/ EB_ERRORTYPE Intra4x4FullCostIslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; + EB_U32 yCbf; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; - EB_U64 lumaRate; - EB_U64 coeffRate; - EB_U64 distortion; + EB_U64 lumaRate; + EB_U64 coeffRate; + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - (void)transformSize; - yCbf = candidateBufferPtr->candidatePtr->yCbf; + // Luma and chroma SSE + EB_U64 lumaSse; + (void)transformSize; + yCbf = candidateBufferPtr->candidatePtr->yCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits + // Estimate the Transform Split Flag & the Cbf's Bits - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; + lumaSse = yDistortion[0]; - distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -3016,52 +3016,52 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, **********************************************************************************/ EB_ERRORTYPE Intra4x4FullCostPslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, - EB_U64 lambda, - EB_U64 *yCoeffBits, - EB_U32 transformSize) + EB_U64 *yDistortion, + EB_U64 lambda, + EB_U64 *yCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; + EB_U32 yCbf; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 coeffRate; - EB_U64 distortion; - EB_U64 lumaSse; - (void)transformSize; + EB_U64 distortion; + EB_U64 lumaSse; + (void)transformSize; - yCbf = candidateBufferPtr->candidatePtr->yCbf; + yCbf = candidateBufferPtr->candidatePtr->yCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits + // Estimate the Transform Split Flag & the Cbf's Bits - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - // Coeff rate - coeffRate = (*yCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits) << 15; - lumaSse = yDistortion[0]; + lumaSse = yDistortion[0]; - distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + distortion = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } /********************************************************************************* @@ -3082,355 +3082,355 @@ struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, * lambda is the Lagrange multiplier **********************************************************************************/ EB_ERRORTYPE IntraNxNFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; - EB_U32 chromaMode = EB_INTRA_CHROMA_DM; - EB_S32 predictionIndex = -1; - EB_U8 partitionMode = 1; // NXN partition + EB_U32 lumaMode = candidateBufferPtr->candidatePtr->intraLumaMode; + EB_U32 chromaMode = EB_INTRA_CHROMA_DM; + EB_S32 predictionIndex = -1; + EB_U8 partitionMode = 1; // NXN partition - (void)qp; + (void)qp; - // Number of bits for each synatax element - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 intraLumaModeBitsNum = 0; + // Number of bits for each synatax element + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 intraLumaModeBitsNum = 0; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - //EB_U64 lumaSad, chromaSad; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + //EB_U64 lumaSad, chromaSad; - // Luma and chroma distortion - EB_U64 totalDistortion; + // Luma and chroma distortion + EB_U64 totalDistortion; - //EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; + //EncodeContext_t *encodeContextPtr = ((SequenceControlSet_t*)(pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr))->encodeContextPtr; - // Estimate Chroma Mode Bits - chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Chroma Mode Bits + chromaRate = candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : - ZERO_COST; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : + ZERO_COST; - // Estimate Luma Mode Bits for Intra - IntraLumaModeContext( - cuPtr, - lumaMode, - &predictionIndex); + // Estimate Luma Mode Bits for Intra + IntraLumaModeContext( + cuPtr, + lumaMode, + &predictionIndex); - intraLumaModeBitsNum = (predictionIndex != -1) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; + intraLumaModeBitsNum = (predictionIndex != -1) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[predictionIndex] : + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraLumaBits[3]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Keep the Fast Luma and Chroma rate for future use - candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; - candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; + // Keep the Fast Luma and Chroma rate for future use + candidateBufferPtr->candidatePtr->fastLumaRate = lumaRate; + candidateBufferPtr->candidatePtr->fastChromaRate = chromaRate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; + totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } EB_ERRORTYPE IntraNxNFastCostPslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr) + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; - MdRateEstimationContext_t *mdRateEstimationPtr = candidatePtr->mdRateEstimationPtr; - - // Pred Mode Bits Table - // 0 for Inter - // 1 for Intra - EB_MODETYPE candidateType = candidatePtr->type == INTER_MODE ? 0 : 1; - EB_U32 lumaMode = candidatePtr->intraLumaMode; - EB_U32 chromaMode = EB_INTRA_CHROMA_DM; - EB_S32 predictionIndex = -1; - EB_U8 partitionMode = 1; // NXN partition - - // Number of bits for each synatax element - EB_U64 predModeBitsNum = 0; - EB_U64 partSizeIntraBitsNum = 0; - EB_U64 intraLumaModeBitsNum = 0; - (void)qp; - // Luma and chroma rate - EB_U64 rate; - EB_U64 lumaRate; - EB_U64 chromaRate; - //EB_U64 lumaSad, chromaSad; + EB_ERRORTYPE return_error = EB_ErrorNone; + + ModeDecisionCandidate_t *candidatePtr = candidateBufferPtr->candidatePtr; + MdRateEstimationContext_t *mdRateEstimationPtr = candidatePtr->mdRateEstimationPtr; + + // Pred Mode Bits Table + // 0 for Inter + // 1 for Intra + EB_MODETYPE candidateType = candidatePtr->type == INTER_MODE ? 0 : 1; + EB_U32 lumaMode = candidatePtr->intraLumaMode; + EB_U32 chromaMode = EB_INTRA_CHROMA_DM; + EB_S32 predictionIndex = -1; + EB_U8 partitionMode = 1; // NXN partition + + // Number of bits for each synatax element + EB_U64 predModeBitsNum = 0; + EB_U64 partSizeIntraBitsNum = 0; + EB_U64 intraLumaModeBitsNum = 0; + (void)qp; + // Luma and chroma rate + EB_U64 rate; + EB_U64 lumaRate; + EB_U64 chromaRate; + //EB_U64 lumaSad, chromaSad; - // Luma and chroma distortion - EB_U64 totalDistortion; + // Luma and chroma distortion + EB_U64 totalDistortion; - // Estimate Chroma Mode Bits - chromaRate = mdRateEstimationPtr->intraChromaBits[chromaMode]; + // Estimate Chroma Mode Bits + chromaRate = mdRateEstimationPtr->intraChromaBits[chromaMode]; - // Estimate Partition Size Bits : - partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : - ZERO_COST; + // Estimate Partition Size Bits : + partSizeIntraBitsNum = (GetCodedUnitStats(cuPtr->leafIndex)->depth == (((SequenceControlSet_t *)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr)->maxLcuDepth - 1)) ? + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->intraPartSizeBits[partitionMode] : + ZERO_COST; - // Estimate Pred Mode Bits - predModeBitsNum = mdRateEstimationPtr->predModeBits[candidateType]; + // Estimate Pred Mode Bits + predModeBitsNum = mdRateEstimationPtr->predModeBits[candidateType]; - // Estimate Luma Mode Bits for Intra - IntraLumaModeContext( - cuPtr, - lumaMode, - &predictionIndex); + // Estimate Luma Mode Bits for Intra + IntraLumaModeContext( + cuPtr, + lumaMode, + &predictionIndex); - intraLumaModeBitsNum = (predictionIndex != -1) ? - mdRateEstimationPtr->intraLumaBits[predictionIndex] : - mdRateEstimationPtr->intraLumaBits[3]; + intraLumaModeBitsNum = (predictionIndex != -1) ? + mdRateEstimationPtr->intraLumaBits[predictionIndex] : + mdRateEstimationPtr->intraLumaBits[3]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = - predModeBitsNum + - partSizeIntraBitsNum + - intraLumaModeBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = + predModeBitsNum + + partSizeIntraBitsNum + + intraLumaModeBitsNum; - // Keep the Fast Luma and Chroma rate for future use - candidatePtr->fastLumaRate = lumaRate; - candidatePtr->fastChromaRate = chromaRate; + // Keep the Fast Luma and Chroma rate for future use + candidatePtr->fastLumaRate = lumaRate; + candidatePtr->fastChromaRate = chromaRate; - candidateBufferPtr->residualLumaSad = lumaDistortion; + candidateBufferPtr->residualLumaSad = lumaDistortion; - // include luma only in total distortion - totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; + // include luma only in total distortion + totalDistortion = (LUMA_WEIGHT * (lumaDistortion + chromaDistortion)) << COST_PRECISION; - // include luma only in rate calculation - rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; + // include luma only in rate calculation + rate = ((lambda * (lumaRate + chromaRate)) + MD_OFFSET) >> MD_SHIFT; - // Scale the rate by the total (*Note this is experimental) - rate *= RATE_WEIGHT; + // Scale the rate by the total (*Note this is experimental) + rate *= RATE_WEIGHT; - // Assign fast cost - *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; + // Assign fast cost + *(candidateBufferPtr->fastCostPtr) = totalDistortion + rate; - return return_error; + return return_error; } EB_ERRORTYPE IntraNxNFullCostIslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; - EB_U32 crCbf; - EB_U32 cbCbf; + EB_U32 yCbf; + EB_U32 crCbf; + EB_U32 cbCbf; - EB_U32 chromaCbfCtx; + EB_U32 chromaCbfCtx; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; - EB_U64 cbfChromaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; + EB_U64 cbfChromaFlagBitsNum; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - (void)pictureControlSetPtr; + (void)pictureControlSetPtr; - yCbf = candidateBufferPtr->candidatePtr->yCbf; - crCbf = candidateBufferPtr->candidatePtr->crCbf; - cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + yCbf = candidateBufferPtr->candidatePtr->yCbf; + crCbf = candidateBufferPtr->candidatePtr->crCbf; + cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; - cbfChromaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; + cbfChromaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits - chromaCbfCtx = 2/*cuPtr->sizeLog2*/ - Log2f(transformSize); + // Estimate the Transform Split Flag & the Cbf's Bits + chromaCbfCtx = 2/*cuPtr->sizeLog2*/ - Log2f(transformSize); - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) - // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) - // Add Log2 of Transform size in order to calculating it multiple time in this function - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) + // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) + // Add Log2 of Transform size in order to calculating it multiple time in this function + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + chromaSse = (((chromaSse * ChromaWeightFactorLd[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); // Low delay and Random access have the same value of chroma weight - distortion = lumaSse + chromaSse; + distortion = lumaSse + chromaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } EB_ERRORTYPE IntraNxNFullCostPslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize) + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U32 yCbf; - EB_U32 crCbf; - EB_U32 cbCbf; + EB_U32 yCbf; + EB_U32 crCbf; + EB_U32 cbCbf; - EB_U32 chromaCbfCtx; + EB_U32 chromaCbfCtx; - EB_U64 tranSubDivFlagBitsNum; - EB_U64 cbfLumaFlagBitsNum; - EB_U64 cbfChromaFlagBitsNum; + EB_U64 tranSubDivFlagBitsNum; + EB_U64 cbfLumaFlagBitsNum; + EB_U64 cbfChromaFlagBitsNum; - // Luma and chroma rate - EB_U64 lumaRate; - EB_U64 chromaRate; - EB_U64 coeffRate; + // Luma and chroma rate + EB_U64 lumaRate; + EB_U64 chromaRate; + EB_U64 coeffRate; - // Luma and chroma distortion - EB_U64 distortion; + // Luma and chroma distortion + EB_U64 distortion; - // Luma and chroma SSE - EB_U64 lumaSse; - EB_U64 chromaSse; + // Luma and chroma SSE + EB_U64 lumaSse; + EB_U64 chromaSse; - yCbf = candidateBufferPtr->candidatePtr->yCbf; - crCbf = candidateBufferPtr->candidatePtr->crCbf; - cbCbf = candidateBufferPtr->candidatePtr->cbCbf; + yCbf = candidateBufferPtr->candidatePtr->yCbf; + crCbf = candidateBufferPtr->candidatePtr->crCbf; + cbCbf = candidateBufferPtr->candidatePtr->cbCbf; - tranSubDivFlagBitsNum = 0; - cbfLumaFlagBitsNum = 0; - cbfChromaFlagBitsNum = 0; + tranSubDivFlagBitsNum = 0; + cbfLumaFlagBitsNum = 0; + cbfChromaFlagBitsNum = 0; - // Estimate the Transform Split Flag & the Cbf's Bits + // Estimate the Transform Split Flag & the Cbf's Bits - chromaCbfCtx = /*cuPtr->sizeLog2*/ 2 - Log2f(transformSize); + chromaCbfCtx = /*cuPtr->sizeLog2*/ 2 - Log2f(transformSize); - cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; + cbfLumaFlagBitsNum += candidateBufferPtr->candidatePtr->mdRateEstimationPtr->lumaCbfBits[yCbf * (NUMBER_OF_CBF_CASES >> 1)]; - cbfChromaFlagBitsNum += - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + - candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; + cbfChromaFlagBitsNum += + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[crCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx] + + candidateBufferPtr->candidatePtr->mdRateEstimationPtr->chromaCbfBits[cbCbf * (NUMBER_OF_CBF_CASES >> 1) + chromaCbfCtx]; - // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element - lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; - chromaRate = cbfChromaFlagBitsNum; + // Rate of the candiadate mode is equal to the sum of the rate of independent syntax element + lumaRate = tranSubDivFlagBitsNum + cbfLumaFlagBitsNum; + chromaRate = cbfChromaFlagBitsNum; - // Add fast rate to get the total rate of the subject mode - lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; - chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; + // Add fast rate to get the total rate of the subject mode + lumaRate += candidateBufferPtr->candidatePtr->fastLumaRate; + chromaRate += candidateBufferPtr->candidatePtr->fastChromaRate; - // Coeff rate - coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; - // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) - // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) - // Add Log2 of Transform size in order to calculating it multiple time in this function + // Coeff rate + coeffRate = (*yCoeffBits + *cbCoeffBits + *crCoeffBits) << 15; + // Note: for square Transform, the scale is 1/(2^(7-Log2(Transform size))) + // For NSQT the scale would be 1/ (2^(7-(Log2(first Transform size)+Log2(second Transform size))/2)) + // Add Log2 of Transform size in order to calculating it multiple time in this function - lumaSse = yDistortion[0]; - chromaSse = cbDistortion[0] + crDistortion[0]; + lumaSse = yDistortion[0]; + chromaSse = cbDistortion[0] + crDistortion[0]; - // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula - // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) - lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); + // *Note - As of Oct 2011, the JCT-VC uses the PSNR forumula + // PSNR = (LUMA_WEIGHT * PSNRy + PSNRu + PSNRv) / (2+LUMA_WEIGHT) + lumaSse = LUMA_WEIGHT * (lumaSse << COST_PRECISION); - // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted - // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode + // *Note - As in JCTVC-G1102, the JCT-VC uses the Mode Decision forumula where the chromaSse has been weighted + // CostMode = (lumaSse + wchroma * chromaSse) + lambdaSse * rateMode - if (pictureControlSetPtr->temporalLayerIndex == 0) { - chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { - chromaSse = (((chromaSse * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } + if (pictureControlSetPtr->temporalLayerIndex == 0) { + chromaSse = (((chromaSse * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else if (pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag) { + chromaSse = (((chromaSse * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + chromaSse = (((chromaSse * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } - distortion = lumaSse + chromaSse; + distortion = lumaSse + chromaSse; - // Assign full cost - *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); + // Assign full cost + *candidateBufferPtr->fullCostPtr = distortion + (((lambda * coeffRate + lambda * lumaRate + lambdaChroma * chromaRate) + MD_OFFSET) >> MD_SHIFT); - return return_error; + return return_error; } diff --git a/Source/Lib/Codec/EbRateDistortionCost.h b/Source/Lib/Codec/EbRateDistortionCost.h index 4099918ec..eb230dd00 100644 --- a/Source/Lib/Codec/EbRateDistortionCost.h +++ b/Source/Lib/Codec/EbRateDistortionCost.h @@ -15,14 +15,14 @@ #include "EbLambdaRateTables.h" #include "EbTransforms.h" #include "EbModeDecisionProcess.h" -#include "EbEncDecProcess.h" +#include "EbEncDecProcess.h" #ifdef __cplusplus extern "C" { #endif - extern void CodingLoopContextGeneration( - ModeDecisionContext_t *contextPtr, + extern void CodingLoopContextGeneration( + ModeDecisionContext_t *contextPtr, CodingUnit_t *cuPtr, EB_U32 cuOriginX, EB_U32 cuOriginY, @@ -32,8 +32,8 @@ extern "C" { NeighborArrayUnit_t *modeTypeNeighborArray, NeighborArrayUnit_t *leafDepthNeighborArray); - extern void ModeDecisionRefinementContextGeneration( - ModeDecisionContext_t *contextPtr, + extern void ModeDecisionRefinementContextGeneration( + ModeDecisionContext_t *contextPtr, CodingUnit_t *cuPtr, EB_U32 cuOriginX, EB_U32 cuOriginY, @@ -51,15 +51,15 @@ extern EB_ERRORTYPE TuCalcCost( EB_U32 cbCountNonZeroCoeffs, EB_U32 crCountNonZeroCoeffs, EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 cbTuDistortion[DIST_CALC_TOTAL], - EB_U64 crTuDistortion[DIST_CALC_TOTAL], + EB_U64 cbTuDistortion[DIST_CALC_TOTAL], + EB_U64 crTuDistortion[DIST_CALC_TOTAL], EB_U32 componentMask, - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 qp, - EB_U64 lambda, - EB_U64 lambdaChroma); + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 qp, + EB_U64 lambda, + EB_U64 lambdaChroma); extern EB_ERRORTYPE TuCalcCostLuma( @@ -69,9 +69,9 @@ extern EB_ERRORTYPE TuCalcCostLuma( EB_U32 transformSize, EB_U32 yCountNonZeroCoeffs, EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 *yTuCoeffBits, - EB_U32 qp, - EB_U64 lambda, + EB_U64 *yTuCoeffBits, + EB_U32 qp, + EB_U64 lambda, EB_U64 lambdaChroma); extern EB_ERRORTYPE IntraLumaModeContext( @@ -81,37 +81,37 @@ extern EB_ERRORTYPE IntraLumaModeContext( extern EB_ERRORTYPE Intra2Nx2NFastCostIsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE Intra2Nx2NFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, + EB_U32 qp, EB_U64 lumaDistortion, - EB_U64 chromaDistortion, + EB_U64 chromaDistortion, EB_U64 lambda, PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE Intra2Nx2NFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE IntraFullCostIslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -126,11 +126,11 @@ extern EB_ERRORTYPE IntraFullCostIslice( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE IntraFullCostPslice( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -145,7 +145,7 @@ extern EB_ERRORTYPE IntraFullCostPslice( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE IntraFullLumaCostIslice( CodingUnit_t *cuPtr, @@ -162,34 +162,34 @@ EB_ERRORTYPE IntraFullLumaCostPslice( EB_U32 cuSize, EB_U32 cuSizeLog2, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U64 *yDistortion, + EB_U64 *yDistortion, EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); extern EB_ERRORTYPE InterFastCostPsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE InterFastCostBsliceOpt( struct ModeDecisionContext_s *contextPtr, - CodingUnit_t *cuPtr, -struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + CodingUnit_t *cuPtr, +struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); extern EB_ERRORTYPE InterFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -204,22 +204,22 @@ extern EB_ERRORTYPE InterFullCost( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE InterFullLumaCost( CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, + EB_U64 *yDistortion, EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); extern EB_ERRORTYPE MergeSkipFullCost( - LargestCodingUnit_t *lcuPtr, - CodingUnit_t *cuPtr, + LargestCodingUnit_t *lcuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, @@ -234,20 +234,20 @@ extern EB_ERRORTYPE MergeSkipFullCost( EB_U64 *crCoeffBits, EB_U32 transformSize, EB_U32 transformChromaSize, - PictureControlSet_t *pictureControlSetPtr); + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE MergeSkipFullLumaCost( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, EB_U32 cuSize, EB_U32 cuSizeLog2, ModeDecisionCandidateBuffer_t *candidateBufferPtr, - EB_U64 *yDistortion, + EB_U64 *yDistortion, EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); extern EB_ERRORTYPE SplitFlagRate( - ModeDecisionContext_t *contextPtr, + ModeDecisionContext_t *contextPtr, CodingUnit_t *cuPtr, EB_U32 splitFlag, EB_U64 *splitRate, @@ -255,13 +255,13 @@ extern EB_ERRORTYPE SplitFlagRate( MdRateEstimationContext_t *mdRateEstimationPtr, EB_U32 tbMaxDepth); -extern EB_ERRORTYPE EncodeTuCalcCost( +extern EB_ERRORTYPE EncodeTuCalcCost( EncDecContext_t *contextPtr, - EB_U32 *countNonZeroCoeffs, - EB_U64 yTuDistortion[DIST_CALC_TOTAL], - EB_U64 *yTuCoeffBits, - EB_U32 componentMask - ); + EB_U32 *countNonZeroCoeffs, + EB_U64 yTuDistortion[DIST_CALC_TOTAL], + EB_U64 *yTuCoeffBits, + EB_U32 componentMask + ); @@ -271,7 +271,7 @@ extern EB_ERRORTYPE Intra4x4FastCostIslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, EB_U64 lumaDistortion, EB_U64 lambda); - + extern EB_ERRORTYPE Intra4x4FastCostPslice( ModeDecisionContext_t *contextPtr, EB_U32 puIndex, @@ -285,7 +285,7 @@ extern EB_ERRORTYPE Intra4x4FullCostIslice( EB_U64 lambda, EB_U64 *yCoeffBits, EB_U32 transformSize); - + extern EB_ERRORTYPE Intra4x4FullCostPslice( struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, EB_U64 *yDistortion, @@ -294,49 +294,49 @@ extern EB_ERRORTYPE Intra4x4FullCostPslice( EB_U32 transformSize); EB_ERRORTYPE IntraNxNFastCostIslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE IntraNxNFastCostPslice( - CodingUnit_t *cuPtr, + CodingUnit_t *cuPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 lumaDistortion, - EB_U64 chromaDistortion, - EB_U64 lambda, - PictureControlSet_t *pictureControlSetPtr); + EB_U32 qp, + EB_U64 lumaDistortion, + EB_U64 chromaDistortion, + EB_U64 lambda, + PictureControlSet_t *pictureControlSetPtr); EB_ERRORTYPE IntraNxNFullCostIslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); EB_ERRORTYPE IntraNxNFullCostPslice( - PictureControlSet_t *pictureControlSetPtr, + PictureControlSet_t *pictureControlSetPtr, struct ModeDecisionCandidateBuffer_s *candidateBufferPtr, - EB_U32 qp, - EB_U64 *yDistortion, - EB_U64 *cbDistortion, - EB_U64 *crDistortion, - EB_U64 lambda, - EB_U64 lambdaChroma, - EB_U64 *yCoeffBits, - EB_U64 *cbCoeffBits, - EB_U64 *crCoeffBits, - EB_U32 transformSize); + EB_U32 qp, + EB_U64 *yDistortion, + EB_U64 *cbDistortion, + EB_U64 *crDistortion, + EB_U64 lambda, + EB_U64 lambdaChroma, + EB_U64 *yCoeffBits, + EB_U64 *cbCoeffBits, + EB_U64 *crCoeffBits, + EB_U32 transformSize); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbReferenceObject.c b/Source/Lib/Codec/EbReferenceObject.c index 1cfd81ed5..89eed5a60 100644 --- a/Source/Lib/Codec/EbReferenceObject.c +++ b/Source/Lib/Codec/EbReferenceObject.c @@ -178,9 +178,9 @@ EB_ERRORTYPE EbReferenceObjectCtor( pictureBufferDescInitData16BitPtr.bitDepth); } - if (return_error == EB_ErrorInsufficientResources){ - return EB_ErrorInsufficientResources; - } + if (return_error == EB_ErrorInsufficientResources){ + return EB_ErrorInsufficientResources; + } @@ -237,8 +237,8 @@ EB_ERRORTYPE EbPaReferenceObjectCtor( return EB_ErrorInsufficientResources; } - // Quarter Decim reference picture constructor - paReferenceObject->quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; + // Quarter Decim reference picture constructor + paReferenceObject->quarterDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; return_error = EbPictureBufferDescCtor( (EB_PTR*) &(paReferenceObject->quarterDecimatedPicturePtr), (EB_PTR ) (pictureBufferDescInitDataPtr + 1)); @@ -247,11 +247,11 @@ EB_ERRORTYPE EbPaReferenceObjectCtor( } // Sixteenth Decim reference picture constructor - paReferenceObject->sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; + paReferenceObject->sixteenthDecimatedPicturePtr = (EbPictureBufferDesc_t*)EB_NULL; return_error = EbPictureBufferDescCtor( (EB_PTR*) &(paReferenceObject->sixteenthDecimatedPicturePtr), (EB_PTR ) (pictureBufferDescInitDataPtr + 2)); - if (return_error == EB_ErrorInsufficientResources){ + if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } diff --git a/Source/Lib/Codec/EbReferenceObject.h b/Source/Lib/Codec/EbReferenceObject.h index 89a868beb..55c920820 100644 --- a/Source/Lib/Codec/EbReferenceObject.h +++ b/Source/Lib/Codec/EbReferenceObject.h @@ -7,34 +7,34 @@ #define EbReferenceObject_h #include "EbDefinitions.h" -#include "EbAdaptiveMotionVectorPrediction.h" +#include "EbAdaptiveMotionVectorPrediction.h" #ifdef __cplusplus extern "C" { #endif typedef struct EbReferenceObject_s { EbPictureBufferDesc_t *referencePicture; - EbPictureBufferDesc_t *referencePicture16bit; - EbPictureBufferDesc_t *refDenSrcPicture; + EbPictureBufferDesc_t *referencePicture16bit; + EbPictureBufferDesc_t *refDenSrcPicture; - TmvpUnit_t *tmvpMap; + TmvpUnit_t *tmvpMap; EB_BOOL tmvpEnableFlag; EB_U64 refPOC; EB_U8 qp; EB_PICTURE sliceType; - EB_U8 intraCodedArea;//percentage of intra coded area 0-100% + EB_U8 intraCodedArea;//percentage of intra coded area 0-100% - EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% - EB_U32 nonMovingIndexArray[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//array to hold non-moving blocks in reference frames - EB_U32 picSampleValue[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT][3];// [Y U V]; + EB_U8 intraCodedAreaLCU[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//percentage of intra coded area 0-100% + EB_U32 nonMovingIndexArray[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE];//array to hold non-moving blocks in reference frames + EB_U32 picSampleValue[MAX_NUMBER_OF_REGIONS_IN_WIDTH][MAX_NUMBER_OF_REGIONS_IN_HEIGHT][3];// [Y U V]; - EB_BOOL penalizeSkipflag; + EB_BOOL penalizeSkipflag; - EB_U8 tmpLayerIdx; - EB_BOOL isSceneChange; - EB_U16 picAvgVariance; + EB_U8 tmpLayerIdx; + EB_BOOL isSceneChange; + EB_U16 picAvgVariance; EB_U8 averageIntensity; } EbReferenceObject_t; @@ -45,13 +45,13 @@ typedef struct EbReferenceObjectDescInitData_s { typedef struct EbPaReferenceObject_s { EbPictureBufferDesc_t *inputPaddedPicturePtr; - EbPictureBufferDesc_t *quarterDecimatedPicturePtr; + EbPictureBufferDesc_t *quarterDecimatedPicturePtr; EbPictureBufferDesc_t *sixteenthDecimatedPicturePtr; - EB_U16 variance[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; - EB_U8 yMean[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; - EB_PICTURE sliceType; + EB_U16 variance[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; + EB_U8 yMean[MAX_NUMBER_OF_TREEBLOCKS_PER_PICTURE]; + EB_PICTURE sliceType; - EB_U32 dependentPicturesCount; //number of pic using this reference frame + EB_U32 dependentPicturesCount; //number of pic using this reference frame PictureParentControlSet_t *pPcsPtr; } EbPaReferenceObject_t; @@ -65,11 +65,11 @@ typedef struct EbPaReferenceObjectDescInitData_s { * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EbReferenceObjectCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); extern EB_ERRORTYPE EbPaReferenceObjectCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbResourceCoordinationProcess.c b/Source/Lib/Codec/EbResourceCoordinationProcess.c index a890a491a..4c107cacd 100644 --- a/Source/Lib/Codec/EbResourceCoordinationProcess.c +++ b/Source/Lib/Codec/EbResourceCoordinationProcess.c @@ -64,24 +64,24 @@ EB_ERRORTYPE ResourceCoordinationContextCtor( contextPtr->pictureNumberArray[instanceIndex] = 0; } - contextPtr->averageEncMod = 0; - contextPtr->prevEncMod = 0; - contextPtr->prevEncModeDelta = 0; - contextPtr->curSpeed = 0; // speed x 1000 - contextPtr->previousModeChangeBuffer = 0; + contextPtr->averageEncMod = 0; + contextPtr->prevEncMod = 0; + contextPtr->prevEncModeDelta = 0; + contextPtr->curSpeed = 0; // speed x 1000 + contextPtr->previousModeChangeBuffer = 0; contextPtr->firstInPicArrivedTimeSeconds = 0; contextPtr->firstInPicArrivedTimeuSeconds = 0; - contextPtr->previousFrameInCheck1 = 0; - contextPtr->previousFrameInCheck2 = 0; - contextPtr->previousFrameInCheck3 = 0; - contextPtr->previousModeChangeFrameIn = 0; + contextPtr->previousFrameInCheck1 = 0; + contextPtr->previousFrameInCheck2 = 0; + contextPtr->previousFrameInCheck3 = 0; + contextPtr->previousModeChangeFrameIn = 0; contextPtr->prevsTimeSeconds = 0; contextPtr->prevsTimeuSeconds = 0; - contextPtr->prevFrameOut = 0; - contextPtr->startFlag = EB_FALSE; + contextPtr->prevFrameOut = 0; + contextPtr->startFlag = EB_FALSE; - contextPtr->previousBufferCheck1 = 0; - contextPtr->prevChangeCond = 0; + contextPtr->previousBufferCheck1 = 0; + contextPtr->prevChangeCond = 0; return EB_ErrorNone; } @@ -91,33 +91,33 @@ EB_ERRORTYPE ResourceCoordinationContextCtor( // Output: EncMod //******************************************************************************// static void SpeedBufferControl( - ResourceCoordinationContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - SequenceControlSet_t *sequenceControlSetPtr) + ResourceCoordinationContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr) { EB_U64 cursTimeSeconds = 0; EB_U64 cursTimeuSeconds = 0; double overallDuration = 0.0; double instDuration = 0.0; - EB_S8 encoderModeDelta = 0; - EB_S64 inputFramesCount = 0; - EB_S8 changeCond = 0; - EB_S64 targetFps = (sequenceControlSetPtr->staticConfig.injectorFrameRate >> 16); + EB_S8 encoderModeDelta = 0; + EB_S64 inputFramesCount = 0; + EB_S8 changeCond = 0; + EB_S64 targetFps = (sequenceControlSetPtr->staticConfig.injectorFrameRate >> 16); EB_S64 bufferTrshold1 = SC_FRAMES_INTERVAL_T1; EB_S64 bufferTrshold2 = SC_FRAMES_INTERVAL_T2; EB_S64 bufferTrshold3 = SC_FRAMES_INTERVAL_T3; EB_S64 bufferTrshold4 = MAX(SC_FRAMES_INTERVAL_T1, targetFps); - EbBlockOnMutex(sequenceControlSetPtr->encodeContextPtr->scBufferMutex); + EbBlockOnMutex(sequenceControlSetPtr->encodeContextPtr->scBufferMutex); - if (sequenceControlSetPtr->encodeContextPtr->scFrameIn == 0) { + if (sequenceControlSetPtr->encodeContextPtr->scFrameIn == 0) { EbHevcStartTime((uint64_t*)&contextPtr->firstInPicArrivedTimeSeconds, (uint64_t*)&contextPtr->firstInPicArrivedTimeuSeconds); - } - else if (sequenceControlSetPtr->encodeContextPtr->scFrameIn == SC_FRAMES_TO_IGNORE) { - contextPtr->startFlag = EB_TRUE; - } + } + else if (sequenceControlSetPtr->encodeContextPtr->scFrameIn == SC_FRAMES_TO_IGNORE) { + contextPtr->startFlag = EB_TRUE; + } // Compute duration since the start of the encode and since the previous checkpoint EbHevcFinishTime((uint64_t*)&cursTimeSeconds, (uint64_t*)&cursTimeuSeconds); @@ -137,121 +137,121 @@ static void SpeedBufferControl( &instDuration); inputFramesCount = (EB_S64)overallDuration *(sequenceControlSetPtr->staticConfig.injectorFrameRate >> 16) / 1000; - sequenceControlSetPtr->encodeContextPtr->scBuffer = inputFramesCount - sequenceControlSetPtr->encodeContextPtr->scFrameIn; + sequenceControlSetPtr->encodeContextPtr->scBuffer = inputFramesCount - sequenceControlSetPtr->encodeContextPtr->scFrameIn; - encoderModeDelta = 0; + encoderModeDelta = 0; - // Check every bufferTsshold1 for the changes (previousFrameInCheck1 variable) - if ((sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousFrameInCheck1 + bufferTrshold1 && sequenceControlSetPtr->encodeContextPtr->scFrameIn >= SC_FRAMES_TO_IGNORE)) { - // Go to a slower mode based on the fullness and changes of the buffer + // Check every bufferTsshold1 for the changes (previousFrameInCheck1 variable) + if ((sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousFrameInCheck1 + bufferTrshold1 && sequenceControlSetPtr->encodeContextPtr->scFrameIn >= SC_FRAMES_TO_IGNORE)) { + // Go to a slower mode based on the fullness and changes of the buffer if (sequenceControlSetPtr->encodeContextPtr->scBuffer < bufferTrshold4 && (contextPtr->prevEncModeDelta >-1 || (contextPtr->prevEncModeDelta < 0 && sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousModeChangeFrameIn + bufferTrshold4 * 2))) { - if (contextPtr->previousBufferCheck1 > sequenceControlSetPtr->encodeContextPtr->scBuffer + bufferTrshold1) { - encoderModeDelta += -1; - changeCond = 2; - } - else if (contextPtr->previousModeChangeBuffer > bufferTrshold1 + sequenceControlSetPtr->encodeContextPtr->scBuffer && sequenceControlSetPtr->encodeContextPtr->scBuffer < bufferTrshold1) { - encoderModeDelta += -1; - changeCond = 4; - } - } - - // Go to a faster mode based on the fullness and changes of the buffer - if (sequenceControlSetPtr->encodeContextPtr->scBuffer >bufferTrshold1 + contextPtr->previousBufferCheck1) { - encoderModeDelta += +1; - changeCond = 1; - } - else if (sequenceControlSetPtr->encodeContextPtr->scBuffer > bufferTrshold1 + contextPtr->previousModeChangeBuffer) { - encoderModeDelta += +1; - changeCond = 3; - } - - // Update the encode mode based on the fullness of the buffer + if (contextPtr->previousBufferCheck1 > sequenceControlSetPtr->encodeContextPtr->scBuffer + bufferTrshold1) { + encoderModeDelta += -1; + changeCond = 2; + } + else if (contextPtr->previousModeChangeBuffer > bufferTrshold1 + sequenceControlSetPtr->encodeContextPtr->scBuffer && sequenceControlSetPtr->encodeContextPtr->scBuffer < bufferTrshold1) { + encoderModeDelta += -1; + changeCond = 4; + } + } + + // Go to a faster mode based on the fullness and changes of the buffer + if (sequenceControlSetPtr->encodeContextPtr->scBuffer >bufferTrshold1 + contextPtr->previousBufferCheck1) { + encoderModeDelta += +1; + changeCond = 1; + } + else if (sequenceControlSetPtr->encodeContextPtr->scBuffer > bufferTrshold1 + contextPtr->previousModeChangeBuffer) { + encoderModeDelta += +1; + changeCond = 3; + } + + // Update the encode mode based on the fullness of the buffer // If previous ChangeCond was the same, double the threshold2 - if (sequenceControlSetPtr->encodeContextPtr->scBuffer > bufferTrshold3 && - (contextPtr->prevChangeCond != 7 || sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousModeChangeFrameIn + bufferTrshold2 * 2) && - sequenceControlSetPtr->encodeContextPtr->scBuffer > contextPtr->previousModeChangeBuffer) { - encoderModeDelta += 1; - changeCond = 7; - } - encoderModeDelta = CLIP3(-1, 1, encoderModeDelta); + if (sequenceControlSetPtr->encodeContextPtr->scBuffer > bufferTrshold3 && + (contextPtr->prevChangeCond != 7 || sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousModeChangeFrameIn + bufferTrshold2 * 2) && + sequenceControlSetPtr->encodeContextPtr->scBuffer > contextPtr->previousModeChangeBuffer) { + encoderModeDelta += 1; + changeCond = 7; + } + encoderModeDelta = CLIP3(-1, 1, encoderModeDelta); sequenceControlSetPtr->encodeContextPtr->encMode = (EB_ENC_MODE)CLIP3(ENC_MODE_0, sequenceControlSetPtr->maxEncMode, (EB_S8)sequenceControlSetPtr->encodeContextPtr->encMode + encoderModeDelta); - // Update previous stats - contextPtr->previousFrameInCheck1 = sequenceControlSetPtr->encodeContextPtr->scFrameIn; - contextPtr->previousBufferCheck1 = sequenceControlSetPtr->encodeContextPtr->scBuffer; + // Update previous stats + contextPtr->previousFrameInCheck1 = sequenceControlSetPtr->encodeContextPtr->scFrameIn; + contextPtr->previousBufferCheck1 = sequenceControlSetPtr->encodeContextPtr->scBuffer; - if (encoderModeDelta) { - contextPtr->previousModeChangeBuffer = sequenceControlSetPtr->encodeContextPtr->scBuffer; - contextPtr->previousModeChangeFrameIn = sequenceControlSetPtr->encodeContextPtr->scFrameIn; - contextPtr->prevEncModeDelta = encoderModeDelta; - } - } + if (encoderModeDelta) { + contextPtr->previousModeChangeBuffer = sequenceControlSetPtr->encodeContextPtr->scBuffer; + contextPtr->previousModeChangeFrameIn = sequenceControlSetPtr->encodeContextPtr->scFrameIn; + contextPtr->prevEncModeDelta = encoderModeDelta; + } + } - // Check every bufferTrshold2 for the changes (previousFrameInCheck2 variable) - if ((sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousFrameInCheck2 + bufferTrshold2 && sequenceControlSetPtr->encodeContextPtr->scFrameIn >= SC_FRAMES_TO_IGNORE)) { - encoderModeDelta = 0; + // Check every bufferTrshold2 for the changes (previousFrameInCheck2 variable) + if ((sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousFrameInCheck2 + bufferTrshold2 && sequenceControlSetPtr->encodeContextPtr->scFrameIn >= SC_FRAMES_TO_IGNORE)) { + encoderModeDelta = 0; - // if no change in the encoder mode and buffer is low enough and level is not increasing, switch to a slower encoder mode + // if no change in the encoder mode and buffer is low enough and level is not increasing, switch to a slower encoder mode // If previous ChangeCond was the same, double the threshold2 - if (encoderModeDelta == 0 && sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousModeChangeFrameIn + bufferTrshold2 && - (contextPtr->prevChangeCond != 8 || sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousModeChangeFrameIn + bufferTrshold2 * 2) && + if (encoderModeDelta == 0 && sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousModeChangeFrameIn + bufferTrshold2 && + (contextPtr->prevChangeCond != 8 || sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousModeChangeFrameIn + bufferTrshold2 * 2) && ((sequenceControlSetPtr->encodeContextPtr->scBuffer - contextPtr->previousModeChangeBuffer < (bufferTrshold4 / 3)) || contextPtr->previousModeChangeBuffer == 0) && - sequenceControlSetPtr->encodeContextPtr->scBuffer < bufferTrshold3) { - encoderModeDelta = -1; - changeCond = 8; - } + sequenceControlSetPtr->encodeContextPtr->scBuffer < bufferTrshold3) { + encoderModeDelta = -1; + changeCond = 8; + } - encoderModeDelta = CLIP3(-1, 1, encoderModeDelta); + encoderModeDelta = CLIP3(-1, 1, encoderModeDelta); sequenceControlSetPtr->encodeContextPtr->encMode = (EB_ENC_MODE)CLIP3(ENC_MODE_0, sequenceControlSetPtr->maxEncMode, (EB_S8)sequenceControlSetPtr->encodeContextPtr->encMode + encoderModeDelta); - // Update previous stats - contextPtr->previousFrameInCheck2 = sequenceControlSetPtr->encodeContextPtr->scFrameIn; + // Update previous stats + contextPtr->previousFrameInCheck2 = sequenceControlSetPtr->encodeContextPtr->scFrameIn; - if (encoderModeDelta) { - contextPtr->previousModeChangeBuffer = sequenceControlSetPtr->encodeContextPtr->scBuffer; - contextPtr->previousModeChangeFrameIn = sequenceControlSetPtr->encodeContextPtr->scFrameIn; - contextPtr->prevEncModeDelta = encoderModeDelta; - } + if (encoderModeDelta) { + contextPtr->previousModeChangeBuffer = sequenceControlSetPtr->encodeContextPtr->scBuffer; + contextPtr->previousModeChangeFrameIn = sequenceControlSetPtr->encodeContextPtr->scFrameIn; + contextPtr->prevEncModeDelta = encoderModeDelta; + } - } - // Check every SC_FRAMES_INTERVAL_SPEED frames for the speed calculation (previousFrameInCheck3 variable) + } + // Check every SC_FRAMES_INTERVAL_SPEED frames for the speed calculation (previousFrameInCheck3 variable) if (contextPtr->startFlag || (sequenceControlSetPtr->encodeContextPtr->scFrameIn > contextPtr->previousFrameInCheck3 + SC_FRAMES_INTERVAL_SPEED && sequenceControlSetPtr->encodeContextPtr->scFrameIn >= SC_FRAMES_TO_IGNORE)) { - if (contextPtr->startFlag) { - contextPtr->curSpeed = (EB_U64)(sequenceControlSetPtr->encodeContextPtr->scFrameOut - 0) * 1000 / (EB_U64)(overallDuration); - } - else { + if (contextPtr->startFlag) { + contextPtr->curSpeed = (EB_U64)(sequenceControlSetPtr->encodeContextPtr->scFrameOut - 0) * 1000 / (EB_U64)(overallDuration); + } + else { if (instDuration != 0) contextPtr->curSpeed = (EB_U64)(sequenceControlSetPtr->encodeContextPtr->scFrameOut - contextPtr->prevFrameOut) * 1000 / (EB_U64)(instDuration); - } - contextPtr->startFlag = EB_FALSE; + } + contextPtr->startFlag = EB_FALSE; - // Update previous stats - contextPtr->previousFrameInCheck3 = sequenceControlSetPtr->encodeContextPtr->scFrameIn; + // Update previous stats + contextPtr->previousFrameInCheck3 = sequenceControlSetPtr->encodeContextPtr->scFrameIn; contextPtr->prevsTimeSeconds = cursTimeSeconds; contextPtr->prevsTimeuSeconds = cursTimeuSeconds; - contextPtr->prevFrameOut = sequenceControlSetPtr->encodeContextPtr->scFrameOut; + contextPtr->prevFrameOut = sequenceControlSetPtr->encodeContextPtr->scFrameOut; - } + } else if (sequenceControlSetPtr->encodeContextPtr->scFrameIn < SC_FRAMES_TO_IGNORE && (overallDuration != 0)) { contextPtr->curSpeed = (EB_U64)(sequenceControlSetPtr->encodeContextPtr->scFrameOut - 0) * 1000 / (EB_U64)(overallDuration); - } + } - if (changeCond) { - contextPtr->prevChangeCond = changeCond; - } - sequenceControlSetPtr->encodeContextPtr->scFrameIn++; - if (sequenceControlSetPtr->encodeContextPtr->scFrameIn >= SC_FRAMES_TO_IGNORE) { - contextPtr->averageEncMod += sequenceControlSetPtr->encodeContextPtr->encMode; - } - else { - contextPtr->averageEncMod = 0; - } + if (changeCond) { + contextPtr->prevChangeCond = changeCond; + } + sequenceControlSetPtr->encodeContextPtr->scFrameIn++; + if (sequenceControlSetPtr->encodeContextPtr->scFrameIn >= SC_FRAMES_TO_IGNORE) { + contextPtr->averageEncMod += sequenceControlSetPtr->encodeContextPtr->encMode; + } + else { + contextPtr->averageEncMod = 0; + } - // Set the encoder level - pictureControlSetPtr->encMode = sequenceControlSetPtr->encodeContextPtr->encMode; + // Set the encoder level + pictureControlSetPtr->encMode = sequenceControlSetPtr->encodeContextPtr->encMode; - EbReleaseMutex(sequenceControlSetPtr->encodeContextPtr->scBufferMutex); + EbReleaseMutex(sequenceControlSetPtr->encodeContextPtr->scBufferMutex); - contextPtr->prevEncMod = sequenceControlSetPtr->encodeContextPtr->encMode; + contextPtr->prevEncMod = sequenceControlSetPtr->encodeContextPtr->encMode; } @@ -296,14 +296,14 @@ static EB_ERRORTYPE SignalDerivationPreAnalysisOq( if (pictureControlSetPtr->encMode <= ENC_MODE_3) { pictureControlSetPtr->noiseDetectionTh = 0; } - else if (pictureControlSetPtr->encMode <= ENC_MODE_8) { - if (inputResolution <= INPUT_SIZE_1080p_RANGE) { - pictureControlSetPtr->noiseDetectionTh = 1; - } - else { - pictureControlSetPtr->noiseDetectionTh = 0; - } - } + else if (pictureControlSetPtr->encMode <= ENC_MODE_8) { + if (inputResolution <= INPUT_SIZE_1080p_RANGE) { + pictureControlSetPtr->noiseDetectionTh = 1; + } + else { + pictureControlSetPtr->noiseDetectionTh = 0; + } + } else{ pictureControlSetPtr->noiseDetectionTh = 1; } @@ -326,22 +326,22 @@ static EB_ERRORTYPE SignalDerivationPreAnalysisOq( pictureControlSetPtr->enableHmeLevel1Flag = EnableHmeLevel1FlagOq[resolutionIndex][hmeMeLevel]; pictureControlSetPtr->enableHmeLevel2Flag = EnableHmeLevel2FlagOq[resolutionIndex][hmeMeLevel]; - pictureControlSetPtr->enableDenoiseSrcFlag = EB_FALSE; - - if (pictureControlSetPtr->encMode <= ENC_MODE_7) { - pictureControlSetPtr->disableVarianceFlag = EB_FALSE; - } - else if (pictureControlSetPtr->encMode <= ENC_MODE_8) { - if (inputResolution == INPUT_SIZE_4K_RANGE) { - pictureControlSetPtr->disableVarianceFlag = EB_TRUE; - } - else { - pictureControlSetPtr->disableVarianceFlag = EB_FALSE; - } - } - else { - pictureControlSetPtr->disableVarianceFlag = EB_TRUE; - } + pictureControlSetPtr->enableDenoiseSrcFlag = EB_FALSE; + + if (pictureControlSetPtr->encMode <= ENC_MODE_7) { + pictureControlSetPtr->disableVarianceFlag = EB_FALSE; + } + else if (pictureControlSetPtr->encMode <= ENC_MODE_8) { + if (inputResolution == INPUT_SIZE_4K_RANGE) { + pictureControlSetPtr->disableVarianceFlag = EB_TRUE; + } + else { + pictureControlSetPtr->disableVarianceFlag = EB_FALSE; + } + } + else { + pictureControlSetPtr->disableVarianceFlag = EB_TRUE; + } return return_error; } @@ -376,12 +376,12 @@ void* ResourceCoordinationKernel(void *inputPtr) EB_BOOL is16BitInput; - EB_U32 inputSize = 0; - EbObjectWrapper_t *prevPictureControlSetWrapperPtr = 0; + EB_U32 inputSize = 0; + EbObjectWrapper_t *prevPictureControlSetWrapperPtr = 0; EB_U32 chromaFormat = EB_YUV420; EB_U32 subWidthCMinus1 = 1; EB_U32 subHeightCMinus1 = 1; - + for(;;) { // Tie instanceIndex to zero for now... @@ -480,7 +480,7 @@ void* ResourceCoordinationKernel(void *inputPtr) sequenceControlSetPtr->pictureHeightInLcu = (EB_U8)((sequenceControlSetPtr->lumaHeight + sequenceControlSetPtr->lcuSize - 1) / sequenceControlSetPtr->lcuSize); sequenceControlSetPtr->lcuTotalCount = sequenceControlSetPtr->pictureWidthInLcu * sequenceControlSetPtr->pictureHeightInLcu; - // Init LCU Params + // Init LCU Params if (contextPtr->sequenceControlSetInstanceArray[instanceIndex]->encodeContextPtr->initialPicture) { DeriveInputResolution( sequenceControlSetPtr, @@ -506,12 +506,12 @@ void* ResourceCoordinationKernel(void *inputPtr) // Set the Encoder mode pictureControlSetPtr->encMode = sequenceControlSetPtr->staticConfig.encMode; - // Keep track of the previous input for the ZZ SADs computation - pictureControlSetPtr->previousPictureControlSetWrapperPtr = (contextPtr->sequenceControlSetInstanceArray[instanceIndex]->encodeContextPtr->initialPicture) ? - pictureControlSetWrapperPtr : - sequenceControlSetPtr->encodeContextPtr->previousPictureControlSetWrapperPtr; + // Keep track of the previous input for the ZZ SADs computation + pictureControlSetPtr->previousPictureControlSetWrapperPtr = (contextPtr->sequenceControlSetInstanceArray[instanceIndex]->encodeContextPtr->initialPicture) ? + pictureControlSetWrapperPtr : + sequenceControlSetPtr->encodeContextPtr->previousPictureControlSetWrapperPtr; - sequenceControlSetPtr->encodeContextPtr->previousPictureControlSetWrapperPtr = pictureControlSetWrapperPtr; + sequenceControlSetPtr->encodeContextPtr->previousPictureControlSetWrapperPtr = pictureControlSetWrapperPtr; // Copy data from the buffer to the input frame // *Note - Assumes 4:2:0 planar @@ -530,15 +530,15 @@ void* ResourceCoordinationKernel(void *inputPtr) // Setup new input picture buffer inputPicturePtr->bitDepth = sequenceControlSetPtr->inputBitdepth; - inputPicturePtr->originX = sequenceControlSetPtr->leftPadding; + inputPicturePtr->originX = sequenceControlSetPtr->leftPadding; inputPicturePtr->originY = sequenceControlSetPtr->topPadding; inputPicturePtr->maxWidth = sequenceControlSetPtr->maxInputLumaWidth; inputPicturePtr->maxHeight = sequenceControlSetPtr->maxInputLumaHeight; inputPicturePtr->lumaSize = - ((sequenceControlSetPtr->maxInputLumaWidth - sequenceControlSetPtr->maxInputPadRight) + sequenceControlSetPtr->leftPadding + sequenceControlSetPtr->rightPadding) * - ((sequenceControlSetPtr->maxInputLumaHeight - sequenceControlSetPtr->maxInputPadBottom) + sequenceControlSetPtr->topPadding + sequenceControlSetPtr->botPadding); + ((sequenceControlSetPtr->maxInputLumaWidth - sequenceControlSetPtr->maxInputPadRight) + sequenceControlSetPtr->leftPadding + sequenceControlSetPtr->rightPadding) * + ((sequenceControlSetPtr->maxInputLumaHeight - sequenceControlSetPtr->maxInputPadBottom) + sequenceControlSetPtr->topPadding + sequenceControlSetPtr->botPadding); inputPicturePtr->chromaSize = inputPicturePtr->lumaSize >> (3 - chromaFormat); inputPicturePtr->width = sequenceControlSetPtr->lumaWidth; @@ -546,9 +546,9 @@ void* ResourceCoordinationKernel(void *inputPtr) inputPicturePtr->strideY = sequenceControlSetPtr->lumaWidth + sequenceControlSetPtr->leftPadding + sequenceControlSetPtr->rightPadding; inputPicturePtr->strideCb = inputPicturePtr->strideCr = inputPicturePtr->strideY >> subWidthCMinus1; - inputPicturePtr->strideBitIncY = inputPicturePtr->strideY; - inputPicturePtr->strideBitIncCb = inputPicturePtr->strideCb; - inputPicturePtr->strideBitIncCr = inputPicturePtr->strideCr; + inputPicturePtr->strideBitIncY = inputPicturePtr->strideY; + inputPicturePtr->strideBitIncCb = inputPicturePtr->strideCb; + inputPicturePtr->strideBitIncCr = inputPicturePtr->strideCr; pictureControlSetPtr->ebInputPtr = ebInputPtr; pictureControlSetPtr->ebInputWrapperPtr = ebInputWrapperPtr; @@ -565,34 +565,34 @@ void* ResourceCoordinationKernel(void *inputPtr) pictureControlSetPtr->qpOnTheFly = EB_FALSE; - //pictureControlSetPtr->lcuTotalCount = sequenceControlSetPtr->lcuTotalCount; + //pictureControlSetPtr->lcuTotalCount = sequenceControlSetPtr->lcuTotalCount; - if (sequenceControlSetPtr->staticConfig.speedControlFlag) { - SpeedBufferControl( - contextPtr, - pictureControlSetPtr, - sequenceControlSetPtr); - } - else { - pictureControlSetPtr->encMode = (EB_ENC_MODE)sequenceControlSetPtr->staticConfig.encMode; - } + if (sequenceControlSetPtr->staticConfig.speedControlFlag) { + SpeedBufferControl( + contextPtr, + pictureControlSetPtr, + sequenceControlSetPtr); + } + else { + pictureControlSetPtr->encMode = (EB_ENC_MODE)sequenceControlSetPtr->staticConfig.encMode; + } - // Set the SCD Mode - sequenceControlSetPtr->scdMode = sequenceControlSetPtr->staticConfig.sceneChangeDetection == 0 ? - SCD_MODE_0 : - SCD_MODE_1 ; + // Set the SCD Mode + sequenceControlSetPtr->scdMode = sequenceControlSetPtr->staticConfig.sceneChangeDetection == 0 ? + SCD_MODE_0 : + SCD_MODE_1 ; SignalDerivationPreAnalysisOq( sequenceControlSetPtr, pictureControlSetPtr); - // Rate Control - // Set the ME Distortion and OIS Historgrams to zero + // Rate Control + // Set the ME Distortion and OIS Historgrams to zero if (sequenceControlSetPtr->staticConfig.rateControlMode){ - EB_MEMSET(pictureControlSetPtr->meDistortionHistogram, 0, NUMBER_OF_SAD_INTERVALS*sizeof(EB_U16)); - EB_MEMSET(pictureControlSetPtr->oisDistortionHistogram, 0, NUMBER_OF_INTRA_SAD_INTERVALS*sizeof(EB_U16)); + EB_MEMSET(pictureControlSetPtr->meDistortionHistogram, 0, NUMBER_OF_SAD_INTERVALS*sizeof(EB_U16)); + EB_MEMSET(pictureControlSetPtr->oisDistortionHistogram, 0, NUMBER_OF_INTRA_SAD_INTERVALS*sizeof(EB_U16)); } - pictureControlSetPtr->fullLcuCount = 0; + pictureControlSetPtr->fullLcuCount = 0; if (sequenceControlSetPtr->staticConfig.useQpFile == 1){ pictureControlSetPtr->qpOnTheFly = EB_TRUE; @@ -629,7 +629,7 @@ void* ResourceCoordinationKernel(void *inputPtr) // Give the new Reference a nominal liveCount of 1 EbObjectIncLiveCount( - pictureControlSetPtr->paReferencePictureWrapperPtr, + pictureControlSetPtr->paReferencePictureWrapperPtr, 2); EbObjectIncLiveCount( diff --git a/Source/Lib/Codec/EbResourceCoordinationProcess.h b/Source/Lib/Codec/EbResourceCoordinationProcess.h index 24b12a2a1..8062bf088 100644 --- a/Source/Lib/Codec/EbResourceCoordinationProcess.h +++ b/Source/Lib/Codec/EbResourceCoordinationProcess.h @@ -15,7 +15,7 @@ extern "C" { * Context ***************************************/ typedef struct ResourceCoordinationContext_s -{ +{ EbFifo_t *inputBufferFifoPtr; EbFifo_t *resourceCoordinationResultsOutputFifoPtr; @@ -24,35 +24,35 @@ typedef struct ResourceCoordinationContext_s EbObjectWrapper_t **sequenceControlSetActiveArray; EbFifo_t *sequenceControlSetEmptyFifoPtr; EbCallback_t **appCallbackPtrArray; - + // Compute Segments EB_U32 *computeSegmentsTotalCountArray; EB_U32 encodeInstancesTotalCount; - + // Picture Number Array EB_U64 *pictureNumberArray; - EB_U64 averageEncMod; - EB_U8 prevEncMod; - EB_S8 prevEncModeDelta; - EB_U8 prevChangeCond; + EB_U64 averageEncMod; + EB_U8 prevEncMod; + EB_S8 prevEncModeDelta; + EB_U8 prevChangeCond; - EB_S64 previousModeChangeBuffer; - EB_S64 previousModeChangeFrameIn; - EB_S64 previousBufferCheck1; - EB_S64 previousFrameInCheck1; - EB_S64 previousFrameInCheck2; - EB_S64 previousFrameInCheck3; + EB_S64 previousModeChangeBuffer; + EB_S64 previousModeChangeFrameIn; + EB_S64 previousBufferCheck1; + EB_S64 previousFrameInCheck1; + EB_S64 previousFrameInCheck2; + EB_S64 previousFrameInCheck3; - EB_U64 curSpeed; // speed x 1000 + EB_U64 curSpeed; // speed x 1000 EB_U64 prevsTimeSeconds; EB_U64 prevsTimeuSeconds; - EB_S64 prevFrameOut; + EB_S64 prevFrameOut; EB_U64 firstInPicArrivedTimeSeconds; EB_U64 firstInPicArrivedTimeuSeconds; - EB_BOOL startFlag; + EB_BOOL startFlag; } ResourceCoordinationContext_t; @@ -69,8 +69,8 @@ extern EB_ERRORTYPE ResourceCoordinationContextCtor( EbCallback_t **appCallbackPtrArray, EB_U32 *computeSegmentsTotalCountArray, EB_U32 encodeInstancesTotalCount); - - + + extern void* ResourceCoordinationKernel(void *inputPtr); #ifdef __cplusplus diff --git a/Source/Lib/Codec/EbResourceCoordinationResults.h b/Source/Lib/Codec/EbResourceCoordinationResults.h index 357eef834..264e1a10b 100644 --- a/Source/Lib/Codec/EbResourceCoordinationResults.h +++ b/Source/Lib/Codec/EbResourceCoordinationResults.h @@ -17,7 +17,7 @@ extern "C" { typedef struct ResourceCoordinationResults_s { EbObjectWrapper_t *pictureControlSetWrapperPtr; - + } ResourceCoordinationResults_t; typedef struct ResourceCoordinationResultInitData_s @@ -29,11 +29,11 @@ typedef struct ResourceCoordinationResultInitData_s * Extern Function Declarations **************************************/ extern EB_ERRORTYPE ResourceCoordinationResultCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); #ifdef __cplusplus } -#endif +#endif #endif //EbResourceCoordinationResults_h \ No newline at end of file diff --git a/Source/Lib/Codec/EbSampleAdaptiveOffset.h b/Source/Lib/Codec/EbSampleAdaptiveOffset.h index 89619a839..156f4ae1f 100644 --- a/Source/Lib/Codec/EbSampleAdaptiveOffset.h +++ b/Source/Lib/Codec/EbSampleAdaptiveOffset.h @@ -22,23 +22,23 @@ extern EB_ERRORTYPE SaoStatsCtor(SaoStats_t **saoStatsPtr); extern EB_ERRORTYPE SaoGenerationDecision( - SaoStats_t *saoStats, - SaoParameters_t *saoParams, - MdRateEstimationContext_t *mdRateEstimationPtr, - EB_U64 fullLambda, + SaoStats_t *saoStats, + SaoParameters_t *saoParams, + MdRateEstimationContext_t *mdRateEstimationPtr, + EB_U64 fullLambda, EB_U64 fullChromaLambdaSao, EB_BOOL mmSAO, struct PictureControlSet_s *pictureControlSetPtr, - EB_U32 tbOriginX, - EB_U32 tbOriginY, - EB_U32 lcuWidth, - EB_U32 lcuHeight, - SaoParameters_t *saoPtr, - SaoParameters_t *leftSaoPtr, - SaoParameters_t *upSaoPtr, - EB_S64 *saoLumaBestCost, - EB_S64 *saoChromaBestCost); + EB_U32 tbOriginX, + EB_U32 tbOriginY, + EB_U32 lcuWidth, + EB_U32 lcuHeight, + SaoParameters_t *saoPtr, + SaoParameters_t *leftSaoPtr, + SaoParameters_t *upSaoPtr, + EB_S64 *saoLumaBestCost, + EB_S64 *saoChromaBestCost); extern EB_ERRORTYPE SaoGenerationDecision16bit( @@ -47,8 +47,8 @@ extern EB_ERRORTYPE SaoGenerationDecision16bit( SaoParameters_t *saoParams, MdRateEstimationContext_t *mdRateEstimationPtr, EB_U64 fullLambda, - EB_U64 fullChromaLambdaSao, - EB_BOOL mmSAO, + EB_U64 fullChromaLambdaSao, + EB_BOOL mmSAO, struct PictureControlSet_s *pictureControlSetPtr, EB_U32 tbOriginX, EB_U32 tbOriginY, @@ -62,16 +62,16 @@ struct PictureControlSet_s *pictureControlSetPtr, EB_ERRORTYPE GatherSaoStatisticsLcu16bit_SSE2( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] typedef EB_ERRORTYPE(*EB_SAOGATHER_FUNC)( @@ -158,22 +158,22 @@ typedef EB_ERRORTYPE(*EB_SAOAPPLY_EO_135_45_16bit_FUNC)( EB_U32 lcuWidth); typedef EB_ERRORTYPE(*EB_SAOGATHER_16bit_FUNC)( - EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr - EB_U32 inputStride, // input parameter, source stride - EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr - EB_U32 reconStride, // input parameter, deblocked stride - EB_U32 lcuWidth, // input parameter, LCU width - EB_U32 lcuHeight, // input parameter, LCU height - EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] - EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 *inputSamplePtr, // input parameter, source Picture Ptr + EB_U32 inputStride, // input parameter, source stride + EB_U16 *reconSamplePtr, // input parameter, deblocked Picture Ptr + EB_U32 reconStride, // input parameter, deblocked stride + EB_U32 lcuWidth, // input parameter, LCU width + EB_U32 lcuHeight, // input parameter, LCU height + EB_S32 *boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] + EB_U16 *boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1], // output parameter, used to store Edge Offset diff, eoDiff[SAO_EO_TYPES] [SAO_EO_CATEGORIES] + EB_U16 eoCount[SAO_EO_TYPES][SAO_EO_CATEGORIES + 1]); // output parameter, used to store Edge Offset count, eoCount[SAO_EO_TYPES] [SAO_EO_CATEGORIES] static const EB_SAOGATHER_16bit_FUNC SaoGatherFunctionTabl_16bit[EB_ASM_TYPE_TOTAL] = { - // C_DEFAULT - GatherSaoStatisticsLcu_62x62_16bit, - // AVX2 - GatherSaoStatisticsLcu16bit_SSE2, + // C_DEFAULT + GatherSaoStatisticsLcu_62x62_16bit, + // AVX2 + GatherSaoStatisticsLcu16bit_SSE2, }; @@ -181,29 +181,29 @@ static const EB_SAOGATHER_16bit_FUNC SaoGatherFunctionTabl_16bit[EB_ASM_TYPE_TOT static const EB_SAOGATHER_FUNC SaoGatherFunctionTableLossy[EB_ASM_TYPE_TOTAL] = { // C_DEFAULT GatherSaoStatisticsLcuLossy_62x62, - // AVX2 + // AVX2 GatherSaoStatisticsLcu_BT_SSE2, }; static const EB_SAOGATHER_90_45_135_FUNC SaoGatherFunctionTableLossy_90_45_135[EB_ASM_TYPE_TOTAL]= { - // C_DEFAULT + // C_DEFAULT GatherSaoStatisticsLcu_OnlyEo_90_45_135_Lossy, - // AVX2 - GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2, + // AVX2 + GatherSaoStatisticsLcu_OnlyEo_90_45_135_BT_SSE2, }; static const EB_SAOGATHER_90_45_135_16bit_SSE2_FUNC SaoGatherFunctionTable_90_45_135_16bit_SSE2[EB_ASM_TYPE_TOTAL][2] = { - // C_DEFAULT - { + // C_DEFAULT + { GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, - }, - // AVX2 - { - GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, - GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN, - }, + }, + // AVX2 + { + GatherSaoStatisticsLcu_62x62_OnlyEo_90_45_135_16bit, + GatherSaoStatisticsLcu_OnlyEo_90_45_135_16bit_SSE2_INTRIN, + }, }; @@ -215,13 +215,13 @@ static const EB_SAOAPPLY_BO_FUNC SaoFunctionTableBo[EB_ASM_TYPE_TOTAL][2] = { }, // AVX2 { - SAOApplyBO, - SAOApplyBO_BT_SSSE3 + SAOApplyBO, + SAOApplyBO_BT_SSSE3 }, }; static const EB_SAOAPPLY_EO_0_90_FUNC SaoFunctionTableEO_0_90[EB_ASM_TYPE_TOTAL][2][2] = { - // C_DEFAULT + // C_DEFAULT { { SAOApplyEO_0, @@ -232,7 +232,7 @@ static const EB_SAOAPPLY_EO_0_90_FUNC SaoFunctionTableEO_0_90[EB_ASM_TYPE_TOTAL] SAOApplyEO_90 } }, - // AVX2 + // AVX2 { { SAOApplyEO_0, @@ -246,70 +246,70 @@ static const EB_SAOAPPLY_EO_0_90_FUNC SaoFunctionTableEO_0_90[EB_ASM_TYPE_TOTAL] }; static const EB_SAOAPPLY_EO_135_45_FUNC SaoFunctionTableEO_135_45[EB_ASM_TYPE_TOTAL][2][2][2] = { - // C_DEFAULT - { + // C_DEFAULT + { { - { - SAOApplyEO_135, - SAOApplyEO_135 - }, - { - SAOApplyEO_135, - SAOApplyEO_135 - } + { + SAOApplyEO_135, + SAOApplyEO_135 + }, + { + SAOApplyEO_135, + SAOApplyEO_135 + } }, { - { + { SAOApplyEO_45, SAOApplyEO_45 - }, - { + }, + { SAOApplyEO_45, SAOApplyEO_45 - } + } } }, - // AVX2 - { + // AVX2 + { { - { - SAOApplyEO_135, + { + SAOApplyEO_135, SAOApplyEO_135_BT_SSSE3 - }, - { - SAOApplyEO_135, + }, + { + SAOApplyEO_135, SAOApplyEO_135_BT_SSSE3 - } + } }, { - { + { SAOApplyEO_45, SAOApplyEO_45_BT_SSSE3 - }, - { + }, + { SAOApplyEO_45, - SAOApplyEO_45_BT_SSSE3 - } + SAOApplyEO_45_BT_SSSE3 + } } }, }; -static const EB_SAOAPPLY_BO_16bit_FUNC SaoFunctionTableBo_16bit[EB_ASM_TYPE_TOTAL][2] = { - // C_DEFAULT - { +static const EB_SAOAPPLY_BO_16bit_FUNC SaoFunctionTableBo_16bit[EB_ASM_TYPE_TOTAL][2] = { + // C_DEFAULT + { SAOApplyBO16bit, SAOApplyBO16bit - }, - // AVX2 - { - SAOApplyBO16bit, - SAOApplyBO16bit_SSE2_INTRIN - }, + }, + // AVX2 + { + SAOApplyBO16bit, + SAOApplyBO16bit_SSE2_INTRIN + }, }; static const EB_SAOAPPLY_EO_0_90_16bit_FUNC SaoFunctionTableEO_0_90_16bit[EB_ASM_TYPE_TOTAL][2][2] = { - // C_DEFAULT + // C_DEFAULT { { SAOApplyEO_0_16bit, @@ -320,7 +320,7 @@ static const EB_SAOAPPLY_EO_0_90_16bit_FUNC SaoFunctionTableEO_0_90_16bit[EB_ASM SAOApplyEO_90_16bit } }, - // AVX2 + // AVX2 { { SAOApplyEO_0_16bit, @@ -334,26 +334,26 @@ static const EB_SAOAPPLY_EO_0_90_16bit_FUNC SaoFunctionTableEO_0_90_16bit[EB_ASM }; static const EB_SAOAPPLY_EO_135_45_16bit_FUNC SaoFunctionTableEO_135_45_16bit[EB_ASM_TYPE_TOTAL][2][2] = { - // C_DEFAULT + // C_DEFAULT { { - SAOApplyEO_135_16bit, - SAOApplyEO_135_16bit + SAOApplyEO_135_16bit, + SAOApplyEO_135_16bit }, { SAOApplyEO_45_16bit, SAOApplyEO_45_16bit } }, - // AVX2 + // AVX2 { { - SAOApplyEO_135_16bit, + SAOApplyEO_135_16bit, SAOApplyEO_135_16bit_SSE2_INTRIN }, { - SAOApplyEO_45_16bit, - SAOApplyEO_45_16bit_SSE2_INTRIN + SAOApplyEO_45_16bit, + SAOApplyEO_45_16bit_SSE2_INTRIN } }, }; diff --git a/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c b/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c index f08660987..e8be8fa8d 100644 --- a/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c +++ b/Source/Lib/Codec/EbSampleAdaptiveOffsetGenerationDecision.c @@ -23,7 +23,7 @@ static EB_S32 MinSaoOffsetvalueBO[2 /*8bit+10bit*/] = { -7 ,-31 }; ********************************************/ EB_ERRORTYPE SaoStatsCtor(SaoStats_t **saoStatsPtr) { - EB_U32 videoComponent; + EB_U32 videoComponent; SaoStats_t *saoStats; EB_MALLOC(SaoStats_t*, saoStats, sizeof(SaoStats_t), EB_N_PTR); @@ -228,7 +228,7 @@ static void DetermineSaoChromaModeOffsets( #else // BO Candidates for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - boBestCost = (maxCost >> 1); + boBestCost = (maxCost >> 1); for (boIndex = 0; boIndex < SAO_BO_INTERVALS; ++boIndex) { boOffset[chromaComponent - 1][boIndex] = (saoStats->boCount[chromaComponent][boIndex] == 0) ? 0 : @@ -267,7 +267,7 @@ static void DetermineSaoChromaModeOffsets( boChromaBestCost += boBestCost; } #endif - // EO Candidates + // EO Candidates eoChromaBestCost = (maxCost >> 1); @@ -353,21 +353,21 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( EB_U64 lambda, // input parameter, lambda, used to compute the cost MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost EB_S64 *saoLumaBestCost, // output parameter, best SAO Luma cost - EB_BOOL is10bit ) + EB_BOOL is10bit ) { EB_U32 eoType, eoIndex, bestEotype=0, saoOffset; EB_U64 maxCost = (EB_U64) ~0; EB_S32 eoOffset[SAO_EO_TYPES][SAO_EO_CATEGORIES]; EB_S64 eoCategoryDistortion[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - EB_S64 eoTypeDistortion[SAO_EO_TYPES] = {0}; + EB_S64 eoTypeDistortion[SAO_EO_TYPES] = {0}; EB_S64 eoTypeRate[SAO_EO_TYPES] = {0}; EB_S64 eoTypeCost[SAO_EO_TYPES]; - EB_S64 eoBestCost = (maxCost >> 1); + EB_S64 eoBestCost = (maxCost >> 1); EB_U64 saoOffsetFlagBitsNum; EB_S64 saoOffRate; - EB_S64 saoOffCost; + EB_S64 saoOffCost; EB_U32 distortionShift = is10bit ? 4 : 0; // *Note: in all Cost Computations we are not including the Cost of the Merge Left & Up Costs - they will be added later in TestSaoCopyModes() @@ -380,7 +380,7 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( saoParams->saoOffset[SAO_COMPONENT_LUMA][2] = 0; saoParams->saoOffset[SAO_COMPONENT_LUMA][3] = 0; saoParams->saoBandPosition[SAO_COMPONENT_LUMA] = 0; - + // EO Candidates for (eoType = 1; eoType < SAO_EO_TYPES; ++eoType ) { @@ -410,14 +410,14 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( eoBestCost = eoTypeCost[eoType]; bestEotype = eoType; - } + } } - eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] *lambda) + MD_OFFSET) >> MD_SHIFT); + eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] *lambda) + MD_OFFSET) >> MD_SHIFT); if ( eoBestCost < saoOffCost) { - + *saoLumaBestCost = eoBestCost; saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = bestEotype + 1; for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { @@ -439,72 +439,72 @@ static void DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( ********************************************/ static void TestSaoCopyModes( EB_S32 **boDiff, // output parameter, used to store Band Offset diff, boDiff[SAO_BO_INTERVALS] - EB_U16 **boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] - EB_S32 eoDiff[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1], + EB_U16 **boCount, // output parameter, used to store Band Offset count, boCount[SAO_BO_INTERVALS] + EB_S32 eoDiff[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1], EB_U16 eoCount[3][SAO_EO_TYPES][SAO_EO_CATEGORIES+1], SaoParameters_t *saoPtr, // input/output parameter, LCU Ptr, used to store SAO results - SaoParameters_t *leftSaoPtr, // input parameter, left LCU Ptr, used to detect the availability of the left neighbor candidate - SaoParameters_t *upSaoPtr, // input parameter, up LCU Ptr, used to detect the availability of the top neighbor candidate + SaoParameters_t *leftSaoPtr, // input parameter, left LCU Ptr, used to detect the availability of the left neighbor candidate + SaoParameters_t *upSaoPtr, // input parameter, up LCU Ptr, used to detect the availability of the top neighbor candidate EB_U64 lambda, // input parameter, lambda, used to compute the cost MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost EB_S64 *saoLumaBestCost, // input/output parameter, best SAO Luma cost EB_S64 *saoChromaBestCost, // input/output parameter, best SAO Chroma cost EB_BOOL is10bit - ) + ) { EB_U32 chromaComponent, videoComponent, isChromaComponent, saoOffset; EB_U64 maxCost = (EB_U64)~0; - EB_S64 saoLumaLeftMergeDistortion = 0; - EB_S64 saoChromaLeftMergeDistortion = 0; + EB_S64 saoLumaLeftMergeDistortion = 0; + EB_S64 saoChromaLeftMergeDistortion = 0; EB_U64 saoMergeLeftFlagBitsNum; EB_S64 saoMergeLeftRate; - EB_S64 saoLumaMergeLeftCost = 0; + EB_S64 saoLumaMergeLeftCost = 0; EB_S64 saoChromaMergeLeftCost = 0; EB_S64 saoMergeLeftCost = (maxCost >> 1); - EB_S64 saoLumaUpMergeDistortion = 0; - EB_S64 saoChromaUpMergeDistortion = 0; - EB_U64 saoMergeUpFlagBitsNum; + EB_S64 saoLumaUpMergeDistortion = 0; + EB_S64 saoChromaUpMergeDistortion = 0; + EB_U64 saoMergeUpFlagBitsNum; EB_S64 saoMergeUpRate; - EB_S64 saoLumaMergeUpCost = 0; - EB_S64 saoChromaMergeUpCost = 0; + EB_S64 saoLumaMergeUpCost = 0; + EB_S64 saoChromaMergeUpCost = 0; EB_S64 saoMergeUpCost = (maxCost >> 1); EB_S64 saoBestCost; EB_U32 distortionShift = is10bit ? 4 : 0; - + // Add Left Flag & Up Flag costs to the best Luma & Chroma Costs in order to get the best SAO Cost - // The best SAO Cost is either SAO Off Cost or BO Cost or EO Cost - saoMergeLeftFlagBitsNum = (leftSaoPtr) ? + // The best SAO Cost is either SAO Off Cost or BO Cost or EO Cost + saoMergeLeftFlagBitsNum = (leftSaoPtr) ? mdRateEstimationPtr->saoMergeFlagBits[0] : 0; - - saoMergeUpFlagBitsNum = (upSaoPtr) ? + + saoMergeUpFlagBitsNum = (upSaoPtr) ? mdRateEstimationPtr->saoMergeFlagBits[0] : - 0; + 0; - saoBestCost = *saoLumaBestCost + *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); - *saoLumaBestCost = *saoLumaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); - *saoChromaBestCost = *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); + saoBestCost = *saoLumaBestCost + *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); + *saoLumaBestCost = *saoLumaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); + *saoChromaBestCost = *saoChromaBestCost + ((((saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum) * lambda) + MD_OFFSET) >> MD_SHIFT); // Left-Neighbor Candidate - if(leftSaoPtr) { + if(leftSaoPtr) { - // Luma + // Luma if(leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] > 0) { - + if (leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] == 5) { // BO - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * boDiff[SAO_COMPONENT_LUMA][leftSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset]) + ((EB_S32)boCount[SAO_COMPONENT_LUMA][leftSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset] * SQR(leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } - } + } else { // EO - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * eoDiff[SAO_COMPONENT_LUMA][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset]) + ((EB_S32)eoCount[SAO_COMPONENT_LUMA][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset] * SQR(leftSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } } @@ -512,29 +512,29 @@ static void TestSaoCopyModes( // Chroma if(leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] > 0) { - + if (leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] == 5) { // BO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[chromaComponent][saoOffset] * boDiff[chromaComponent][leftSaoPtr->saoBandPosition[chromaComponent] + saoOffset]) + ((EB_S32)boCount[chromaComponent][leftSaoPtr->saoBandPosition[chromaComponent] + saoOffset] * SQR(leftSaoPtr->saoOffset[chromaComponent][saoOffset])); } - } + } } else { // EO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaLeftMergeDistortion += - (2 * leftSaoPtr->saoOffset[chromaComponent][saoOffset] * eoDiff[chromaComponent][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset]) + ((EB_S32)eoCount[chromaComponent][leftSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset] * SQR(leftSaoPtr->saoOffset[chromaComponent][saoOffset])); } } } } - + saoMergeLeftRate = mdRateEstimationPtr->saoMergeFlagBits[1]; //CHKN @@ -550,19 +550,19 @@ static void TestSaoCopyModes( // Top-Neighbor Candidate if(upSaoPtr) { - // Luma + // Luma if(upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] > 0) { - + if (upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] == 5) { // BO for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * boDiff[SAO_COMPONENT_LUMA][upSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset]) + ((EB_S32)boCount[SAO_COMPONENT_LUMA][upSaoPtr->saoBandPosition[SAO_COMPONENT_LUMA] + saoOffset] * SQR(upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } } else { // EO for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoLumaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset] * eoDiff[SAO_COMPONENT_LUMA][upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset]) + ((EB_S32)eoCount[SAO_COMPONENT_LUMA][upSaoPtr->saoTypeIndex[SAO_COMPONENT_LUMA] - 1][saoOffset] * SQR(upSaoPtr->saoOffset[SAO_COMPONENT_LUMA][saoOffset])); } } @@ -570,23 +570,23 @@ static void TestSaoCopyModes( // Chroma if(upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] > 0) { - + if (upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] == 5) { // BO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[chromaComponent][saoOffset] * boDiff[chromaComponent][upSaoPtr->saoBandPosition[chromaComponent] + saoOffset]) + ((EB_S32)boCount[chromaComponent][upSaoPtr->saoBandPosition[chromaComponent] + saoOffset] * SQR(upSaoPtr->saoOffset[chromaComponent][saoOffset])); } - } + } } else { // EO - + for (chromaComponent = SAO_COMPONENT_CHROMA; chromaComponent < SAO_COMPONENT_CHROMA_CR; ++chromaComponent) { - + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - + saoChromaUpMergeDistortion += - (2 * upSaoPtr->saoOffset[chromaComponent][saoOffset] * eoDiff[chromaComponent][upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset]) + ((EB_S32)eoCount[chromaComponent][upSaoPtr->saoTypeIndex[SAO_COMPONENT_CHROMA] - 1][saoOffset] * SQR(upSaoPtr->saoOffset[chromaComponent][saoOffset])); } } @@ -596,13 +596,13 @@ static void TestSaoCopyModes( //CHKN saoLumaUpMergeDistortion = saoLumaUpMergeDistortion >> distortionShift; saoChromaUpMergeDistortion = saoChromaUpMergeDistortion >> distortionShift; - + saoMergeUpFlagBitsNum = mdRateEstimationPtr->saoMergeFlagBits[1]; saoMergeUpRate = saoMergeLeftFlagBitsNum + saoMergeUpFlagBitsNum; saoLumaMergeUpCost = (saoLumaUpMergeDistortion << COST_PRECISION) + (((saoMergeUpRate *lambda) + MD_OFFSET) >> MD_SHIFT); saoChromaMergeUpCost = (saoChromaUpMergeDistortion << COST_PRECISION) + (((saoMergeUpRate *lambda) + MD_OFFSET) >> MD_SHIFT); saoMergeUpCost = (saoLumaUpMergeDistortion << COST_PRECISION) + (saoChromaUpMergeDistortion << COST_PRECISION) + (((saoMergeUpRate *lambda) + MD_OFFSET) >> MD_SHIFT); - + } if ((saoMergeLeftCost < saoBestCost) || (saoMergeUpCost < saoBestCost) ) { @@ -610,32 +610,32 @@ static void TestSaoCopyModes( saoBestCost = MIN(saoMergeLeftCost, saoMergeUpCost); if (saoBestCost == saoMergeLeftCost && leftSaoPtr) { - + saoPtr->saoMergeLeftFlag = EB_TRUE; - + for (videoComponent = SAO_COMPONENT_LUMA; videoComponent < SAO_COMPONENT_CHROMA_CR; ++videoComponent) { - + isChromaComponent = (videoComponent == SAO_COMPONENT_LUMA) ? SAO_COMPONENT_LUMA : SAO_COMPONENT_CHROMA; saoPtr->saoTypeIndex[isChromaComponent] = leftSaoPtr->saoTypeIndex[isChromaComponent]; saoPtr->saoBandPosition[videoComponent] = leftSaoPtr->saoBandPosition[videoComponent]; - EB_MEMCPY(saoPtr->saoOffset[videoComponent], leftSaoPtr->saoOffset[videoComponent], NUMBER_SAO_OFFSETS * sizeof(EB_S32)); + EB_MEMCPY(saoPtr->saoOffset[videoComponent], leftSaoPtr->saoOffset[videoComponent], NUMBER_SAO_OFFSETS * sizeof(EB_S32)); *saoLumaBestCost = saoLumaMergeLeftCost; - *saoChromaBestCost = saoChromaMergeLeftCost; + *saoChromaBestCost = saoChromaMergeLeftCost; } } else if (saoBestCost == saoMergeUpCost && upSaoPtr) { - + saoPtr->saoMergeUpFlag = EB_TRUE; for (videoComponent = SAO_COMPONENT_LUMA; videoComponent < SAO_COMPONENT_CHROMA_CR; ++videoComponent) { - + isChromaComponent = (videoComponent == SAO_COMPONENT_LUMA) ? SAO_COMPONENT_LUMA : SAO_COMPONENT_CHROMA; saoPtr->saoTypeIndex[isChromaComponent] = upSaoPtr->saoTypeIndex[isChromaComponent]; saoPtr->saoBandPosition[videoComponent] = upSaoPtr->saoBandPosition[videoComponent]; EB_MEMCPY(saoPtr->saoOffset[videoComponent], upSaoPtr->saoOffset[videoComponent], NUMBER_SAO_OFFSETS * sizeof(EB_S32)); *saoLumaBestCost = saoLumaMergeUpCost; - *saoChromaBestCost = saoChromaMergeUpCost; + *saoChromaBestCost = saoChromaMergeUpCost; } } } @@ -648,7 +648,7 @@ static void TestSaoCopyModes( * generates SAO offsets and chooses best SAO mode ********************************************/ EB_ERRORTYPE SaoGenerationDecision( - SaoStats_t *saoStats, + SaoStats_t *saoStats, SaoParameters_t *saoParams, MdRateEstimationContext_t *mdRateEstimationPtr, EB_U64 fullLambda, @@ -668,7 +668,7 @@ EB_ERRORTYPE SaoGenerationDecision( { EB_ERRORTYPE return_error = EB_ErrorNone; - EbPictureBufferDesc_t *inputPicturePtr; + EbPictureBufferDesc_t *inputPicturePtr; inputPicturePtr = pictureControlSetPtr->ParentPcsPtr->enhancedPicturePtr; @@ -676,13 +676,13 @@ EB_ERRORTYPE SaoGenerationDecision( if(pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) reconPicturePtr = ((EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr)->referencePicture; else - reconPicturePtr = pictureControlSetPtr->reconPicturePtr; + reconPicturePtr = pictureControlSetPtr->reconPicturePtr; const EB_COLOR_FORMAT colorFormat = reconPicturePtr->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - // Intialise SAO Parameters + // Intialise SAO Parameters saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; saoParams->saoTypeIndex[SAO_COMPONENT_CHROMA] = 0; saoParams->saoOffset[SAO_COMPONENT_LUMA][0] = 0; @@ -753,7 +753,7 @@ EB_ERRORTYPE SaoGenerationDecision( saoChromaBestCost, EB_FALSE); - // Check Merge Mode Y + U + V + // Check Merge Mode Y + U + V TestSaoCopyModes( saoStats->boDiff, saoStats->boCount, @@ -827,7 +827,7 @@ EB_ERRORTYPE SaoGenerationDecision( } - //Check Merge Mode (Luma+Chroma) + //Check Merge Mode (Luma+Chroma) if (pictureControlSetPtr->temporalLayerIndex < 2) { TestSaoCopyModes( @@ -854,82 +854,82 @@ EB_ERRORTYPE SaoGenerationDecision( * generates Sao Luma Offsets ********************************************/ static void DetermineSaoEOLumaModeOffsets( - SaoStats_t *saoStats, - SaoParameters_t *saoParams, - EB_U64 lambda, // input parameter, lambda, used to compute the cost - MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost - EB_S64 *saoLumaBestCost, // output parameter, best SAO Luma cost - EB_BOOL is10bit) + SaoStats_t *saoStats, + SaoParameters_t *saoParams, + EB_U64 lambda, // input parameter, lambda, used to compute the cost + MdRateEstimationContext_t *mdRateEstimationPtr, // input parameter, MD table bits, used to compute the cost + EB_S64 *saoLumaBestCost, // output parameter, best SAO Luma cost + EB_BOOL is10bit) { - EB_U32 eoType, eoIndex, bestEotype = 0, saoOffset; - EB_U64 maxCost = (EB_U64)~0; + EB_U32 eoType, eoIndex, bestEotype = 0, saoOffset; + EB_U64 maxCost = (EB_U64)~0; - EB_S32 eoOffset[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - EB_S64 eoCategoryDistortion[SAO_EO_TYPES][SAO_EO_CATEGORIES]; - EB_S64 eoTypeDistortion[SAO_EO_TYPES] = { 0 }; - EB_S64 eoTypeRate[SAO_EO_TYPES] = { 0 }; - EB_S64 eoTypeCost[SAO_EO_TYPES]; - EB_S64 eoBestCost = (maxCost >> 1); + EB_S32 eoOffset[SAO_EO_TYPES][SAO_EO_CATEGORIES]; + EB_S64 eoCategoryDistortion[SAO_EO_TYPES][SAO_EO_CATEGORIES]; + EB_S64 eoTypeDistortion[SAO_EO_TYPES] = { 0 }; + EB_S64 eoTypeRate[SAO_EO_TYPES] = { 0 }; + EB_S64 eoTypeCost[SAO_EO_TYPES]; + EB_S64 eoBestCost = (maxCost >> 1); - EB_U64 saoOffsetFlagBitsNum; - EB_S64 saoOffRate; - EB_S64 saoOffCost; - EB_U32 distortionShift = is10bit ? 4 : 0; + EB_U64 saoOffsetFlagBitsNum; + EB_S64 saoOffRate; + EB_S64 saoOffCost; + EB_U32 distortionShift = is10bit ? 4 : 0; - // *Note: in all Cost Computations we are not including the Cost of the Merge Left & Up Costs - they will be added later in TestSaoCopyModes() - saoOffRate = mdRateEstimationPtr->saoTypeIndexBits[0]; - saoOffCost = ((saoOffRate *lambda) + MD_OFFSET) >> MD_SHIFT; + // *Note: in all Cost Computations we are not including the Cost of the Merge Left & Up Costs - they will be added later in TestSaoCopyModes() + saoOffRate = mdRateEstimationPtr->saoTypeIndexBits[0]; + saoOffCost = ((saoOffRate *lambda) + MD_OFFSET) >> MD_SHIFT; - // EO Candidates - for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { + // EO Candidates + for (eoType = 0; eoType < SAO_EO_TYPES; ++eoType) { - for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES; ++eoIndex) { - eoOffset[eoType][eoIndex] = (saoStats->eoCount[0][eoType][eoIndex] == 0) ? - 0 : - ROUND(saoStats->eoDiff[0][eoType][eoIndex] / (EB_S32)saoStats->eoCount[0][eoType][eoIndex]); + for (eoIndex = 0; eoIndex < SAO_EO_CATEGORIES; ++eoIndex) { + eoOffset[eoType][eoIndex] = (saoStats->eoCount[0][eoType][eoIndex] == 0) ? + 0 : + ROUND(saoStats->eoDiff[0][eoType][eoIndex] / (EB_S32)saoStats->eoCount[0][eoType][eoIndex]); - eoOffset[eoType][eoIndex] = CLIP3(MinSaoOffsetvalueEO[is10bit][eoIndex], MaxSaoOffsetvalueEO[is10bit][eoIndex], eoOffset[eoType][eoIndex]); + eoOffset[eoType][eoIndex] = CLIP3(MinSaoOffsetvalueEO[is10bit][eoIndex], MaxSaoOffsetvalueEO[is10bit][eoIndex], eoOffset[eoType][eoIndex]); - //eoCategoryDistortion[eoType][eoIndex] = - (2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex])); - eoCategoryDistortion[eoType][eoIndex] = (-(2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex]))) >> distortionShift; + //eoCategoryDistortion[eoType][eoIndex] = - (2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex])); + eoCategoryDistortion[eoType][eoIndex] = (-(2 * eoOffset[eoType][eoIndex] * saoStats->eoDiff[0][eoType][eoIndex]) + ((EB_S32)saoStats->eoCount[0][eoType][eoIndex] * SQR(eoOffset[eoType][eoIndex]))) >> distortionShift; - eoTypeDistortion[eoType] += eoCategoryDistortion[eoType][eoIndex]; + eoTypeDistortion[eoType] += eoCategoryDistortion[eoType][eoIndex]; - } + } - GetSaoOffsetsFractionBits( - eoType + 1, - &(eoOffset[eoType][0]), - mdRateEstimationPtr, - &saoOffsetFlagBitsNum); + GetSaoOffsetsFractionBits( + eoType + 1, + &(eoOffset[eoType][0]), + mdRateEstimationPtr, + &saoOffsetFlagBitsNum); - eoTypeRate[eoType] = saoOffsetFlagBitsNum; - eoTypeCost[eoType] = (eoTypeDistortion[eoType] << COST_PRECISION) + (((eoTypeRate[eoType] * lambda) + MD_OFFSET) >> MD_SHIFT); + eoTypeRate[eoType] = saoOffsetFlagBitsNum; + eoTypeCost[eoType] = (eoTypeDistortion[eoType] << COST_PRECISION) + (((eoTypeRate[eoType] * lambda) + MD_OFFSET) >> MD_SHIFT); - if (eoTypeCost[eoType] < eoBestCost) { + if (eoTypeCost[eoType] < eoBestCost) { - eoBestCost = eoTypeCost[eoType]; - bestEotype = eoType; - } - } + eoBestCost = eoTypeCost[eoType]; + bestEotype = eoType; + } + } - // Add SAO Type Cost - eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] * lambda) + MD_OFFSET) >> MD_SHIFT); - if ((eoBestCost < saoOffCost)) { + // Add SAO Type Cost + eoBestCost += (((mdRateEstimationPtr->saoTypeIndexBits[bestEotype + 1] * lambda) + MD_OFFSET) >> MD_SHIFT); + if ((eoBestCost < saoOffCost)) { - *saoLumaBestCost = eoBestCost; - saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = bestEotype + 1; - for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { - saoParams->saoOffset[SAO_COMPONENT_LUMA][saoOffset] = eoOffset[bestEotype][saoOffset]; - } - } - else { + *saoLumaBestCost = eoBestCost; + saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = bestEotype + 1; + for (saoOffset = 0; saoOffset < NUMBER_SAO_OFFSETS; ++saoOffset) { + saoParams->saoOffset[SAO_COMPONENT_LUMA][saoOffset] = eoOffset[bestEotype][saoOffset]; + } + } + else { - saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; - *saoLumaBestCost = saoOffCost; - } + saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; + *saoLumaBestCost = saoOffCost; + } - return; + return; } /******************************************** @@ -943,8 +943,8 @@ EB_ERRORTYPE SaoGenerationDecision16bit( MdRateEstimationContext_t *mdRateEstimationPtr, EB_U64 fullLambda, - EB_U64 fullChromaLambdaSao, - EB_BOOL mmSao, + EB_U64 fullChromaLambdaSao, + EB_BOOL mmSao, PictureControlSet_t *pictureControlSetPtr, EB_U32 tbOriginX, @@ -962,13 +962,13 @@ EB_ERRORTYPE SaoGenerationDecision16bit( if(pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag == EB_TRUE) recon16 = ((EbReferenceObject_t*)pictureControlSetPtr->ParentPcsPtr->referencePictureWrapperPtr->objectPtr)->referencePicture16bit; else - recon16 = pictureControlSetPtr->reconPicture16bitPtr; + recon16 = pictureControlSetPtr->reconPicture16bitPtr; const EB_COLOR_FORMAT colorFormat = recon16->colorFormat; const EB_U16 subWidthCMinus1 = (colorFormat == EB_YUV444 ? 1 : 2) - 1; const EB_U16 subHeightCMinus1 = (colorFormat >= EB_YUV422 ? 1 : 2) - 1; - - // Intialise SAO Parameters + + // Intialise SAO Parameters saoParams->saoTypeIndex[SAO_COMPONENT_LUMA] = 0; saoParams->saoTypeIndex[SAO_COMPONENT_CHROMA] = 0; saoParams->saoOffset[SAO_COMPONENT_LUMA][0] = 0; @@ -981,94 +981,94 @@ EB_ERRORTYPE SaoGenerationDecision16bit( *saoLumaBestCost = 0; *saoChromaBestCost = 0; - if (mmSao) { - - EB_U32 lcuChromaWidth = lcuWidth >> subWidthCMinus1; - EB_U32 lcuChromaHeight = lcuHeight >> subHeightCMinus1; - - // Y - // Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 - // Requirement: lcuHeight > 2 - - // This function is only written in C. To be implemented in ASM - SaoGatherFunctionTabl_16bit[((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( - (EB_U16*)inputLcuPtr->bufferY, - inputLcuPtr->strideY, - (EB_U16*)(recon16->bufferY) + (recon16->originY + tbOriginY)*recon16->strideY + (recon16->originX + tbOriginX), - recon16->strideY, - lcuWidth, - lcuHeight, - saoStats->boDiff[0], - saoStats->boCount[0], - saoStats->eoDiff[0], - saoStats->eoCount[0]); - - // U - SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( - (EB_U16*)inputLcuPtr->bufferCb, - inputLcuPtr->strideCb, - (EB_U16*)(recon16->bufferCb) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), - recon16->strideCb, - lcuChromaWidth, - lcuChromaHeight, - saoStats->boDiff[1], - saoStats->boCount[1], - saoStats->eoDiff[1], - saoStats->eoCount[1]); - - // V - SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( - (EB_U16*)inputLcuPtr->bufferCr, - inputLcuPtr->strideCr, - (EB_U16*)(recon16->bufferCr) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), - recon16->strideCr, - lcuChromaWidth, - lcuChromaHeight, - saoStats->boDiff[2], - saoStats->boCount[2], - saoStats->eoDiff[2], - saoStats->eoCount[2]); - - // Y - DetermineSaoEOLumaModeOffsets( - saoStats, - saoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - EB_TRUE); - - //Chroma U+V - DetermineSaoChromaModeOffsets( - saoStats, - saoPtr, - fullChromaLambdaSao, - mdRateEstimationPtr, - saoChromaBestCost, - EB_TRUE); - - TestSaoCopyModes( - saoStats->boDiff, - saoStats->boCount, - saoStats->eoDiff, - saoStats->eoCount, - saoPtr, - leftSaoPtr, - upSaoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - saoChromaBestCost, - EB_TRUE); - - } - else { - // Y - if (pictureControlSetPtr->temporalLayerIndex == 0) { - //; Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 - //; Requirement: lcuHeight > 2 - - { + if (mmSao) { + + EB_U32 lcuChromaWidth = lcuWidth >> subWidthCMinus1; + EB_U32 lcuChromaHeight = lcuHeight >> subHeightCMinus1; + + // Y + // Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 + // Requirement: lcuHeight > 2 + + // This function is only written in C. To be implemented in ASM + SaoGatherFunctionTabl_16bit[((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( + (EB_U16*)inputLcuPtr->bufferY, + inputLcuPtr->strideY, + (EB_U16*)(recon16->bufferY) + (recon16->originY + tbOriginY)*recon16->strideY + (recon16->originX + tbOriginX), + recon16->strideY, + lcuWidth, + lcuHeight, + saoStats->boDiff[0], + saoStats->boCount[0], + saoStats->eoDiff[0], + saoStats->eoCount[0]); + + // U + SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( + (EB_U16*)inputLcuPtr->bufferCb, + inputLcuPtr->strideCb, + (EB_U16*)(recon16->bufferCb) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), + recon16->strideCb, + lcuChromaWidth, + lcuChromaHeight, + saoStats->boDiff[1], + saoStats->boCount[1], + saoStats->eoDiff[1], + saoStats->eoCount[1]); + + // V + SaoGatherFunctionTabl_16bit[((lcuChromaWidth & 15) == 0) || (lcuChromaWidth == 28) || (lcuChromaWidth == 56)]( + (EB_U16*)inputLcuPtr->bufferCr, + inputLcuPtr->strideCr, + (EB_U16*)(recon16->bufferCr) + ((((recon16->originY + tbOriginY) * recon16->strideCb) >> subHeightCMinus1) + ((recon16->originX + tbOriginX) >> subWidthCMinus1)), + recon16->strideCr, + lcuChromaWidth, + lcuChromaHeight, + saoStats->boDiff[2], + saoStats->boCount[2], + saoStats->eoDiff[2], + saoStats->eoCount[2]); + + // Y + DetermineSaoEOLumaModeOffsets( + saoStats, + saoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + EB_TRUE); + + //Chroma U+V + DetermineSaoChromaModeOffsets( + saoStats, + saoPtr, + fullChromaLambdaSao, + mdRateEstimationPtr, + saoChromaBestCost, + EB_TRUE); + + TestSaoCopyModes( + saoStats->boDiff, + saoStats->boCount, + saoStats->eoDiff, + saoStats->eoCount, + saoPtr, + leftSaoPtr, + upSaoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + saoChromaBestCost, + EB_TRUE); + + } + else { + // Y + if (pictureControlSetPtr->temporalLayerIndex == 0) { + //; Requirement: lcuWidth = 28, 56 or lcuWidth % 16 = 0 + //; Requirement: lcuHeight > 2 + + { SaoGatherFunctionTable_90_45_135_16bit_SSE2[!!(ASM_TYPES & PREAVX2_MASK)][((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( (EB_U16*)inputLcuPtr->bufferY, inputLcuPtr->strideY, @@ -1078,10 +1078,10 @@ EB_ERRORTYPE SaoGenerationDecision16bit( lcuHeight, saoStats->eoDiff[0], saoStats->eoCount[0]); - } - } + } + } - if (pictureControlSetPtr->temporalLayerIndex == 1) { + if (pictureControlSetPtr->temporalLayerIndex == 1) { SaoGatherFunctionTable_90_45_135_16bit_SSE2[!!(ASM_TYPES & PREAVX2_MASK)][((lcuWidth & 15) == 0) || (lcuWidth == 28) || (lcuWidth == 56)]( (EB_U16*)inputLcuPtr->bufferY, inputLcuPtr->strideY, @@ -1091,53 +1091,53 @@ EB_ERRORTYPE SaoGenerationDecision16bit( lcuHeight, saoStats->eoDiff[0], saoStats->eoCount[0]); - } - - // Generate SAO Offsets - //Luma - if (pictureControlSetPtr->temporalLayerIndex == 0) { - - { - DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( - saoStats, - saoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - EB_TRUE); - - } - } - - if (pictureControlSetPtr->temporalLayerIndex == 1) { - - DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( - saoStats, - saoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - EB_TRUE); - } - - //Check Merge Mode (Luma+Chroma) - if (pictureControlSetPtr->temporalLayerIndex < 2) { - - TestSaoCopyModes( - saoStats->boDiff, - saoStats->boCount, - saoStats->eoDiff, - saoStats->eoCount, - saoPtr, - leftSaoPtr, - upSaoPtr, - fullLambda, - mdRateEstimationPtr, - saoLumaBestCost, - saoChromaBestCost, - EB_TRUE); - } - } + } + + // Generate SAO Offsets + //Luma + if (pictureControlSetPtr->temporalLayerIndex == 0) { + + { + DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( + saoStats, + saoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + EB_TRUE); + + } + } + + if (pictureControlSetPtr->temporalLayerIndex == 1) { + + DetermineSaoLumaModeOffsets_OnlyEo_90_45_135( + saoStats, + saoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + EB_TRUE); + } + + //Check Merge Mode (Luma+Chroma) + if (pictureControlSetPtr->temporalLayerIndex < 2) { + + TestSaoCopyModes( + saoStats->boDiff, + saoStats->boCount, + saoStats->eoDiff, + saoStats->eoCount, + saoPtr, + leftSaoPtr, + upSaoPtr, + fullLambda, + mdRateEstimationPtr, + saoLumaBestCost, + saoChromaBestCost, + EB_TRUE); + } + } return return_error; } diff --git a/Source/Lib/Codec/EbSei.c b/Source/Lib/Codec/EbSei.c index 312117854..981deba2d 100644 --- a/Source/Lib/Codec/EbSei.c +++ b/Source/Lib/Codec/EbSei.c @@ -221,7 +221,7 @@ void EbActiveParameterSetSeiCtor( activeParameterSetSei->noParameterSetUpdateFlag = EB_FALSE; activeParameterSetSei->numSpsIdsMinus1 = 0; activeParameterSetSei->activeSeqParameterSetId = 0; -// activeParameterSetSei->layerSpsIdx = 0; +// activeParameterSetSei->layerSpsIdx = 0; return; } diff --git a/Source/Lib/Codec/EbSei.h b/Source/Lib/Codec/EbSei.h index b9d25a0fc..ed2866ca0 100644 --- a/Source/Lib/Codec/EbSei.h +++ b/Source/Lib/Codec/EbSei.h @@ -28,7 +28,7 @@ extern "C" { typedef struct RegistedUserData_s { - EB_U8 *userData; // First byte is itu_t_t35_country_code. + EB_U8 *userData; // First byte is itu_t_t35_country_code. // If itu_t_t35_country_code == 0xFF, second byte is itu_t_t35_country_code_extension_byte. // the rest are the payloadByte EB_U32 userDataSize; @@ -184,8 +184,8 @@ extern "C" { } AppRecoveryPoint_t; - // Below is an example of PanScanRectangle SEI data structure - // Other SEI messages can have data structure in this format + // Below is an example of PanScanRectangle SEI data structure + // Other SEI messages can have data structure in this format typedef struct AppPanScanRectangleSei_s { EB_U32 panScanRectId; @@ -229,10 +229,10 @@ extern "C" { typedef struct EB_LATENCY_CALC { - EB_U64 startTimesSeconds; - EB_U64 finishTimesSeconds; - EB_U64 startTimesuSeconds; - EB_U64 finishTimesuSeconds; + EB_U64 startTimesSeconds; + EB_U64 finishTimesSeconds; + EB_U64 startTimesuSeconds; + EB_U64 finishTimesuSeconds; EB_U64 poc; } EB_LATENCY_CALC; @@ -254,7 +254,7 @@ extern "C" { - // Signals that the default prediction structure and controls are to be + // Signals that the default prediction structure and controls are to be // overwritten and manually controlled. Manual control should be active // for an entire encode, from beginning to termination. Mixing of default // prediction structure control and override prediction structure control @@ -274,18 +274,18 @@ extern "C" { EB_U32 refList0Count; // A count of zero indicates the list is inactive EB_U32 refList1Count; // A count of zero indicates the list is inactive EB_BOOL isReferenced; // Indicates whether or not the picture is used as - // future reference. + // future reference. EB_U32 futureReferenceCount; EB_S32 *futureReferenceList;// Contains a list of delta POCs whose references shall // be saved for future reference. This signalling must - // be done with respect to decode picture order. Must + // be done with respect to decode picture order. Must // be conformant with the DPB rules. } EB_PRED_STRUCTURE_CFG; // EB_PICTURE_PLANE defines the data formatting of a singple plane of picture data. typedef struct EB_PICTURE_PLANE { - // "start" is the starting position of the first + // "start" is the starting position of the first // valid pixel in the picture plane. EB_U8* start; @@ -348,7 +348,7 @@ extern EB_U32 GetBufPeriodSEILength( AppVideoUsabilityInfo_t *vuiPtr); extern EB_U32 GetActiveParameterSetSEILength( - AppActiveparameterSetSei_t *activeParameterSet); + AppActiveparameterSetSei_t *activeParameterSet); extern EB_U32 GetRecoveryPointSEILength( AppRecoveryPoint_t *recoveryPointSeiPtr); diff --git a/Source/Lib/Codec/EbSequenceControlSet.c b/Source/Lib/Codec/EbSequenceControlSet.c index d3f6ff192..478a0c82f 100644 --- a/Source/Lib/Codec/EbSequenceControlSet.c +++ b/Source/Lib/Codec/EbSequenceControlSet.c @@ -11,8 +11,8 @@ /************************************************************************************************** General notes on how Sequence Control Sets (SCS) are used. - SequenceControlSetInstance - is the master copy that interacts with the API in real-time. When a + SequenceControlSetInstance + is the master copy that interacts with the API in real-time. When a change happens, the changeFlag is signaled so that appropriate action can be taken. There is one scsInstance per stream/encode instance. The scsInstance owns the encodeContext @@ -23,28 +23,28 @@ SequenceControlSets general SCSs are controled by a system resource manager. They are kept completely separate from the instances. In general there is one active SCS at a time. When the - changeFlag is signaled, the old active SCS is no longer used for new input pictures. + changeFlag is signaled, the old active SCS is no longer used for new input pictures. A fresh copy of the scsInstance is made to a new SCS, which becomes the active SCS. The old SCS will eventually be released back into the SCS pool when its current pictures are finished encoding. - + Motivations The whole reason for this structure is due to the nature of the pipeline. We have to - take great care not to have pipeline mismanagement. Once an object enters use in the + take great care not to have pipeline mismanagement. Once an object enters use in the pipeline, it cannot be changed on the fly or you will have pipeline coherency problems. ***************************************************************************************************/ EB_ERRORTYPE EbSequenceControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr) { EbSequenceControlSetInitData_t *scsInitData = (EbSequenceControlSetInitData_t*) objectInitDataPtr; - EB_U32 layerIndex; + EB_U32 layerIndex; EB_ERRORTYPE return_error = EB_ErrorNone; SequenceControlSet_t *sequenceControlSetPtr; EB_MALLOC(SequenceControlSet_t*, sequenceControlSetPtr, sizeof(SequenceControlSet_t), EB_N_PTR); *objectDblPtr = (EB_PTR) sequenceControlSetPtr; - + sequenceControlSetPtr->staticConfig.qp = 32; // Segments @@ -56,7 +56,7 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->tileGroupColCountArray[layerIndex] = 1; sequenceControlSetPtr->tileGroupRowCountArray[layerIndex] = 1; } - + // Encode Context if(scsInitData != EB_NULL) { sequenceControlSetPtr->encodeContextPtr = scsInitData->encodeContextPtr; @@ -65,8 +65,8 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->encodeContextPtr = (EncodeContext_t *)EB_NULL; } - sequenceControlSetPtr->conformanceWindowFlag = 0; - + sequenceControlSetPtr->conformanceWindowFlag = 0; + // Profile & ID sequenceControlSetPtr->spsId = 0; sequenceControlSetPtr->vpsId = 0; @@ -76,9 +76,9 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->tierIdc = 0; sequenceControlSetPtr->chromaFormatIdc = EB_YUV420; sequenceControlSetPtr->maxTemporalLayers = 1; - + sequenceControlSetPtr->bitsForPictureOrderCount = 16; - + // Picture Dimensions sequenceControlSetPtr->lumaWidth = 0; sequenceControlSetPtr->lumaHeight = 0; @@ -87,20 +87,20 @@ EB_ERRORTYPE EbSequenceControlSetCtor( sequenceControlSetPtr->chromaHeight = 0; sequenceControlSetPtr->frameRate = 0; sequenceControlSetPtr->encoderBitDepth = 8; - + // Bitdepth sequenceControlSetPtr->inputBitdepth = EB_8BIT; sequenceControlSetPtr->outputBitdepth = EB_8BIT; - + // GOP Structure - sequenceControlSetPtr->maxRefCount = 1; + sequenceControlSetPtr->maxRefCount = 1; sequenceControlSetPtr->intraPeriodLength = 0; sequenceControlSetPtr->intraRefreshType = 0; - + // LCU sequenceControlSetPtr->lcuSize = 64; sequenceControlSetPtr->maxLcuDepth = 3; - + // Interlaced Video sequenceControlSetPtr->interlacedVideo = EB_FALSE; @@ -113,12 +113,12 @@ EB_ERRORTYPE EbSequenceControlSetCtor( // Strong Intra Smoothing sequenceControlSetPtr->enableStrongIntraSmoothing = EB_TRUE; - + // Rate Control - sequenceControlSetPtr->rateControlMode = 0; - sequenceControlSetPtr->targetBitrate = 0x1000; + sequenceControlSetPtr->rateControlMode = 0; + sequenceControlSetPtr->targetBitrate = 0x1000; sequenceControlSetPtr->availableBandwidth = 0x1000; - + // Quantization sequenceControlSetPtr->qp = 20; @@ -127,7 +127,7 @@ EB_ERRORTYPE EbSequenceControlSetCtor( // Video Usability Info EB_MALLOC(AppVideoUsabilityInfo_t*, sequenceControlSetPtr->videoUsabilityInfoPtr, sizeof(AppVideoUsabilityInfo_t), EB_N_PTR); - + // Initialize vui parameters return_error = EbVideoUsabilityInfoCtor( sequenceControlSetPtr->videoUsabilityInfoPtr); @@ -167,11 +167,11 @@ EB_ERRORTYPE EbSequenceControlSetCtor( EbUnRegUserDataSEICtor( &sequenceControlSetPtr->unRegUserDataSeiPtr); - sequenceControlSetPtr->maxDpbSize = 0; - + sequenceControlSetPtr->maxDpbSize = 0; + return EB_ErrorNone; } - + /************************************************ * Sequence Control Set Copy @@ -198,7 +198,7 @@ EB_ERRORTYPE CopySequenceControlSet( return EB_ErrorNone; } - + EB_ERRORTYPE EbSequenceControlSetInstanceCtor( EbSequenceControlSetInstance_t **objectDblPtr) { @@ -213,53 +213,53 @@ EB_ERRORTYPE EbSequenceControlSetInstanceCtor( return EB_ErrorInsufficientResources; } scsInitData.encodeContextPtr = (*objectDblPtr)->encodeContextPtr; - + return_error = EbSequenceControlSetCtor( (void **) &(*objectDblPtr)->sequenceControlSetPtr, (void *) &scsInitData); if (return_error == EB_ErrorInsufficientResources){ return EB_ErrorInsufficientResources; } - + EB_CREATEMUTEX(EB_HANDLE*, (*objectDblPtr)->configMutex, sizeof(EB_HANDLE), EB_MUTEX); - + return EB_ErrorNone; -} +} extern EB_ERRORTYPE LcuParamsInit( - SequenceControlSet_t *sequenceControlSetPtr) { + SequenceControlSet_t *sequenceControlSetPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; - EB_U16 lcuIndex; - EB_U16 rasterScanCuIndex; + EB_ERRORTYPE return_error = EB_ErrorNone; + EB_U16 lcuIndex; + EB_U16 rasterScanCuIndex; - EB_U8 pictureLcuWidth = sequenceControlSetPtr->pictureWidthInLcu; - EB_U8 pictureLcuHeight = sequenceControlSetPtr->pictureHeightInLcu; - EB_MALLOC(LcuParams_t*, sequenceControlSetPtr->lcuParamsArray, sizeof(LcuParams_t) * pictureLcuWidth * pictureLcuHeight, EB_N_PTR); + EB_U8 pictureLcuWidth = sequenceControlSetPtr->pictureWidthInLcu; + EB_U8 pictureLcuHeight = sequenceControlSetPtr->pictureHeightInLcu; + EB_MALLOC(LcuParams_t*, sequenceControlSetPtr->lcuParamsArray, sizeof(LcuParams_t) * pictureLcuWidth * pictureLcuHeight, EB_N_PTR); - for (lcuIndex = 0; lcuIndex < pictureLcuWidth * pictureLcuHeight; ++lcuIndex) { - sequenceControlSetPtr->lcuParamsArray[lcuIndex].horizontalIndex = (EB_U8)(lcuIndex % pictureLcuWidth); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex = (EB_U8)(lcuIndex / pictureLcuWidth); + for (lcuIndex = 0; lcuIndex < pictureLcuWidth * pictureLcuHeight; ++lcuIndex) { + sequenceControlSetPtr->lcuParamsArray[lcuIndex].horizontalIndex = (EB_U8)(lcuIndex % pictureLcuWidth); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex = (EB_U8)(lcuIndex / pictureLcuWidth); sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX = sequenceControlSetPtr->lcuParamsArray[lcuIndex].horizontalIndex * sequenceControlSetPtr->lcuSize; - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY = sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex * sequenceControlSetPtr->lcuSize; + sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY = sequenceControlSetPtr->lcuParamsArray[lcuIndex].verticalIndex * sequenceControlSetPtr->lcuSize; - sequenceControlSetPtr->lcuParamsArray[lcuIndex].width = (EB_U8)(((sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX) < sequenceControlSetPtr->lcuSize) ? - sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX : - sequenceControlSetPtr->lcuSize); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].width = (EB_U8)(((sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX) < sequenceControlSetPtr->lcuSize) ? + sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX : + sequenceControlSetPtr->lcuSize); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].height = (EB_U8)(((sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY) < sequenceControlSetPtr->lcuSize) ? - sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY : - sequenceControlSetPtr->lcuSize); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].height = (EB_U8)(((sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY) < sequenceControlSetPtr->lcuSize) ? + sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY : + sequenceControlSetPtr->lcuSize); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].isCompleteLcu = (EB_U8)(((sequenceControlSetPtr->lcuParamsArray[lcuIndex].width == sequenceControlSetPtr->lcuSize) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].height == sequenceControlSetPtr->lcuSize)) ? - 1 : - 0); + sequenceControlSetPtr->lcuParamsArray[lcuIndex].isCompleteLcu = (EB_U8)(((sequenceControlSetPtr->lcuParamsArray[lcuIndex].width == sequenceControlSetPtr->lcuSize) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].height == sequenceControlSetPtr->lcuSize)) ? + 1 : + 0); - sequenceControlSetPtr->lcuParamsArray[lcuIndex].isEdgeLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX < sequenceControlSetPtr->lcuSize) || - (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < sequenceControlSetPtr->lcuSize) || - (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX > sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuSize) || - (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY > sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuSize) ? 1 : 0; + sequenceControlSetPtr->lcuParamsArray[lcuIndex].isEdgeLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX < sequenceControlSetPtr->lcuSize) || + (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < sequenceControlSetPtr->lcuSize) || + (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX > sequenceControlSetPtr->lumaWidth - sequenceControlSetPtr->lcuSize) || + (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY > sequenceControlSetPtr->lumaHeight - sequenceControlSetPtr->lcuSize) ? 1 : 0; EB_U8 potentialLogoLcu = 0; @@ -267,38 +267,38 @@ extern EB_ERRORTYPE LcuParamsInit( // 4K /*__ 14 __ __ 14__*/ /////////////////////////// - // | | // - // 8 8 // - //___14_ | |_14___// - // // - // // + // | | // + // 8 8 // + //___14_ | |_14___// + // // + // // //-----------------------// | - // // 8 - /////////////////////////// | + // // 8 + /////////////////////////// | // 1080p/720P /*__ 7 __ __ 7__*/ /////////////////////////// - // | | // - // 4 4 // - //___7__ | |__7___// - // // - // // + // | | // + // 4 4 // + //___7__ | |__7___// + // // + // // //-----------------------// | - // // 4 - /////////////////////////// | + // // 4 + /////////////////////////// | // 480P /*__ 3 __ __ 3__*/ /////////////////////////// - // | | // - // 2 2 // - //___3__ | |__3___// - // // - // // + // | | // + // 2 2 // + //___3__ | |__3___// + // // + // // //-----------------------// | - // // 2 - /////////////////////////// | + // // 2 + /////////////////////////// | if (sequenceControlSetPtr->inputResolution <= INPUT_SIZE_576p_RANGE_OR_LOWER){ potentialLogoLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX >= (sequenceControlSetPtr->lumaWidth - (3 * sequenceControlSetPtr->lcuSize))) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < 2 * sequenceControlSetPtr->lcuSize) ? 1 : potentialLogoLcu; potentialLogoLcu = (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX < ((3 * sequenceControlSetPtr->lcuSize))) && (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY < 2 * sequenceControlSetPtr->lcuSize) ? 1 : potentialLogoLcu; @@ -321,32 +321,32 @@ extern EB_ERRORTYPE LcuParamsInit( } sequenceControlSetPtr->lcuParamsArray[lcuIndex].potentialLogoLcu = potentialLogoLcu; - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_8x8_63; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_8x8_63; rasterScanCuIndex++) { - sequenceControlSetPtr->lcuParamsArray[lcuIndex].rasterScanCuValidity[rasterScanCuIndex] = ((sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX + RASTER_SCAN_CU_X[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaWidth ) || (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY + RASTER_SCAN_CU_Y[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaHeight)) ? - EB_FALSE : - EB_TRUE; - } - } + sequenceControlSetPtr->lcuParamsArray[lcuIndex].rasterScanCuValidity[rasterScanCuIndex] = ((sequenceControlSetPtr->lcuParamsArray[lcuIndex].originX + RASTER_SCAN_CU_X[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaWidth ) || (sequenceControlSetPtr->lcuParamsArray[lcuIndex].originY + RASTER_SCAN_CU_Y[rasterScanCuIndex] + RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > sequenceControlSetPtr->lumaHeight)) ? + EB_FALSE : + EB_TRUE; + } + } //ConfigureTiles(sequenceControlSetPtr); - return return_error; + return return_error; } extern EB_ERRORTYPE DeriveInputResolution( - SequenceControlSet_t *sequenceControlSetPtr, - EB_U32 inputSize) { - EB_ERRORTYPE return_error = EB_ErrorNone; - - sequenceControlSetPtr->inputResolution = (inputSize < INPUT_SIZE_1080i_TH) ? - INPUT_SIZE_576p_RANGE_OR_LOWER : - (inputSize < INPUT_SIZE_1080p_TH) ? - INPUT_SIZE_1080i_RANGE : - (inputSize < INPUT_SIZE_4K_TH) ? - INPUT_SIZE_1080p_RANGE : - INPUT_SIZE_4K_RANGE; - - return return_error; + SequenceControlSet_t *sequenceControlSetPtr, + EB_U32 inputSize) { + EB_ERRORTYPE return_error = EB_ErrorNone; + + sequenceControlSetPtr->inputResolution = (inputSize < INPUT_SIZE_1080i_TH) ? + INPUT_SIZE_576p_RANGE_OR_LOWER : + (inputSize < INPUT_SIZE_1080p_TH) ? + INPUT_SIZE_1080i_RANGE : + (inputSize < INPUT_SIZE_4K_TH) ? + INPUT_SIZE_1080p_RANGE : + INPUT_SIZE_4K_RANGE; + + return return_error; } diff --git a/Source/Lib/Codec/EbSequenceControlSet.h b/Source/Lib/Codec/EbSequenceControlSet.h index 704487c45..184d95674 100644 --- a/Source/Lib/Codec/EbSequenceControlSet.h +++ b/Source/Lib/Codec/EbSequenceControlSet.h @@ -27,7 +27,7 @@ typedef struct SequenceControlSet_s // Encoding Context EncodeContext_t *encodeContextPtr; - + // Profile & ID EB_U32 spsId; EB_U32 vpsId; @@ -43,7 +43,7 @@ typedef struct SequenceControlSet_s EB_U16 maxInputLumaWidth; EB_U16 maxInputLumaHeight; //EB_U16 maxInputChromaWidth; - //EB_U16 maxInputChromaHeight; + //EB_U16 maxInputChromaHeight; EB_U16 maxInputPadRight; EB_U16 maxInputPadBottom; EB_U16 lumaWidth; @@ -57,50 +57,50 @@ typedef struct SequenceControlSet_s EB_U16 rightPadding; EB_U16 botPadding; - EB_U32 frameRate; + EB_U32 frameRate; EB_U32 encoderBitDepth; // Cropping Definitions EB_S32 croppingLeftOffset; EB_S32 croppingRightOffset; EB_S32 croppingTopOffset; - EB_S32 croppingBottomOffset; + EB_S32 croppingBottomOffset; // Conformance Window flag EB_U32 conformanceWindowFlag; - + // Bitdepth EB_BITDEPTH inputBitdepth; EB_BITDEPTH outputBitdepth; - + // Group of Pictures (GOP) Structure EB_U32 maxRefCount; // Maximum number of reference pictures, however each pred // entry can be less. - PredictionStructure_t *predStructPtr; + PredictionStructure_t *predStructPtr; EB_S32 intraPeriodLength; // The frequency of intra pictures EB_S32 intraRefreshType; // -1: CRA, >=0: IDR - + // LCU EB_U8 lcuSize; EB_U8 maxLcuDepth; - // Interlaced Video + // Interlaced Video EB_BOOL interlacedVideo; EB_U32 generalProgressiveSourceFlag; EB_U32 generalInterlacedSourceFlag; EB_U32 generalFrameOnlyConstraintFlag; - + // Rate Control EB_U32 rateControlMode; EB_U32 targetBitrate; - EB_U32 availableBandwidth; - + EB_U32 availableBandwidth; + // Quantization EB_U32 qp; EB_BOOL enableQpScalingFlag; - - // tmvp enable + + // tmvp enable EB_U32 enableTmvpSps; // Strong Intra Smoothing @@ -114,7 +114,7 @@ typedef struct SequenceControlSet_s // Video Usability Info AppVideoUsabilityInfo_t *videoUsabilityInfoPtr; - + // Picture timing sei AppPictureTimingSei_t picTimingSei; @@ -138,7 +138,7 @@ typedef struct SequenceControlSet_s // Maximum Decoded Picture Buffer size. EB_U32 maxDpbSize; - + // Picture Analysis EB_U32 pictureAnalysisNumberOfRegionsPerWidth; EB_U32 pictureAnalysisNumberOfRegionsPerHeight; @@ -157,28 +157,28 @@ typedef struct SequenceControlSet_s EB_U16 tileGroupRowCountArray[MAX_TEMPORAL_LAYERS]; // Buffers - EB_U32 pictureControlSetPoolInitCount; - EB_U32 pictureControlSetPoolInitCountChild; + EB_U32 pictureControlSetPoolInitCount; + EB_U32 pictureControlSetPoolInitCountChild; EB_U32 paReferencePictureBufferInitCount; EB_U32 referencePictureBufferInitCount; EB_U32 reconBufferFifoInitCount; EB_U32 inputOutputBufferFifoInitCount; - EB_U32 resourceCoordinationFifoInitCount; + EB_U32 resourceCoordinationFifoInitCount; EB_U32 pictureAnalysisFifoInitCount; EB_U32 pictureDecisionFifoInitCount; EB_U32 motionEstimationFifoInitCount; EB_U32 initialRateControlFifoInitCount; - EB_U32 pictureDemuxFifoInitCount; - EB_U32 rateControlTasksFifoInitCount; - EB_U32 rateControlFifoInitCount; + EB_U32 pictureDemuxFifoInitCount; + EB_U32 rateControlTasksFifoInitCount; + EB_U32 rateControlFifoInitCount; EB_U32 modeDecisionConfigurationFifoInitCount; - //EB_U32 modeDecisionFifoInitCount; + //EB_U32 modeDecisionFifoInitCount; EB_U32 encDecFifoInitCount; EB_U32 entropyCodingFifoInitCount; - EB_U32 pictureAnalysisProcessInitCount; - EB_U32 motionEstimationProcessInitCount; + EB_U32 pictureAnalysisProcessInitCount; + EB_U32 motionEstimationProcessInitCount; EB_U32 sourceBasedOperationsProcessInitCount; - EB_U32 modeDecisionConfigurationProcessInitCount; + EB_U32 modeDecisionConfigurationProcessInitCount; EB_U32 encDecProcessInitCount; EB_U32 entropyCodingProcessInitCount; EB_U32 unpackProcessInitCount; @@ -209,26 +209,26 @@ typedef struct EbSequenceControlSetInitData_s } EbSequenceControlSetInitData_t; typedef struct EbSequenceControlSetInstance_s -{ +{ EncodeContext_t *encodeContextPtr; SequenceControlSet_t *sequenceControlSetPtr; EB_HANDLE configMutex; - + } EbSequenceControlSetInstance_t; /************************************** * Extern Function Declarations **************************************/ extern EB_ERRORTYPE EbSequenceControlSetCtor( - EB_PTR *objectDblPtr, + EB_PTR *objectDblPtr, EB_PTR objectInitDataPtr); - + extern EB_ERRORTYPE CopySequenceControlSet( SequenceControlSet_t *dst, SequenceControlSet_t *src); - + extern EB_ERRORTYPE EbSequenceControlSetInstanceCtor( EbSequenceControlSetInstance_t **objectDblPtr); @@ -240,5 +240,5 @@ extern EB_ERRORTYPE DeriveInputResolution( #ifdef __cplusplus } -#endif +#endif #endif // EbSequenceControlSet_h diff --git a/Source/Lib/Codec/EbSourceBasedOperationsProcess.c b/Source/Lib/Codec/EbSourceBasedOperationsProcess.c index c53257991..fe0fe1ad3 100644 --- a/Source/Lib/Codec/EbSourceBasedOperationsProcess.c +++ b/Source/Lib/Codec/EbSourceBasedOperationsProcess.c @@ -25,7 +25,7 @@ #define PAN_LCU_PERCENTAGE 75 #define LOW_AMPLITUDE_TH 16 -#define Y_MEAN_RANGE_03 52 +#define Y_MEAN_RANGE_03 52 #define Y_MEAN_RANGE_02 70 #define Y_MEAN_RANGE_01 130 #define CB_MEAN_RANGE_02 115 @@ -33,13 +33,13 @@ #define CR_MEAN_RANGE_02 135 #define DARK_FRM_TH 45 -#define CB_MEAN_RANGE_00 80 +#define CB_MEAN_RANGE_00 80 #define SAD_DEVIATION_LCU_TH_0 15 #define SAD_DEVIATION_LCU_TH_1 20 -#define MAX_DELTA_QP_SHAPE_TH 4 +#define MAX_DELTA_QP_SHAPE_TH 4 #define MIN_DELTA_QP_SHAPE_TH 1 #define MIN_BLACK_AREA_PERCENTAGE 20 @@ -53,10 +53,10 @@ const EB_U32 THRESHOLD_NOISE[MAX_TEMPORAL_LAYERS] = { 33, 28, 27, 26, 26, 26 }; // [Temporal Layer Index] // Used ComplexityClassifier32x32 // Outlier removal threshold per depth {2%, 2%, 4%, 4%} const EB_S8 EbHevcMinDeltaQPdefault[3] = { - -4, -3, -2 + -4, -3, -2 }; const EB_U8 EbHevcMaxDeltaQPdefault[3] = { - 4, 5, 6 + 4, 5, 6 }; /************************************************ @@ -65,17 +65,17 @@ const EB_U8 EbHevcMaxDeltaQPdefault[3] = { EB_ERRORTYPE SourceBasedOperationsContextCtor( SourceBasedOperationsContext_t **contextDblPtr, - EbFifo_t *initialRateControlResultsInputFifoPtr, - EbFifo_t *pictureDemuxResultsOutputFifoPtr) + EbFifo_t *initialRateControlResultsInputFifoPtr, + EbFifo_t *pictureDemuxResultsOutputFifoPtr) { - SourceBasedOperationsContext_t *contextPtr; + SourceBasedOperationsContext_t *contextPtr; - EB_MALLOC(SourceBasedOperationsContext_t*, contextPtr, sizeof(SourceBasedOperationsContext_t), EB_N_PTR); - *contextDblPtr = contextPtr; - contextPtr->initialrateControlResultsInputFifoPtr = initialRateControlResultsInputFifoPtr; - contextPtr->pictureDemuxResultsOutputFifoPtr = pictureDemuxResultsOutputFifoPtr; + EB_MALLOC(SourceBasedOperationsContext_t*, contextPtr, sizeof(SourceBasedOperationsContext_t), EB_N_PTR); + *contextDblPtr = contextPtr; + contextPtr->initialrateControlResultsInputFifoPtr = initialRateControlResultsInputFifoPtr; + contextPtr->pictureDemuxResultsOutputFifoPtr = pictureDemuxResultsOutputFifoPtr; - return EB_ErrorNone; + return EB_ErrorNone; } /*************************************************** @@ -83,13 +83,13 @@ EB_ERRORTYPE SourceBasedOperationsContextCtor( ***************************************************/ static void DerivePictureActivityStatistics( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U64 nonMovingIndexSum = 0; + EB_U64 nonMovingIndexSum = 0; - EB_U32 lcuIndex; + EB_U32 lcuIndex; EB_U32 zzSum = 0; EB_U32 completeLcuCount = 0; @@ -107,7 +107,7 @@ static void DerivePictureActivityStatistics( completeLcuCount++; } - } + } if (completeLcuCount > 0) { pictureControlSetPtr->nonMovingIndexAverage = (EB_U16)(nonMovingIndexSum / completeLcuCount); @@ -115,7 +115,7 @@ static void DerivePictureActivityStatistics( } pictureControlSetPtr->lowMotionContentFlag = pictureControlSetPtr->zzCostAverage == 0 ? EB_TRUE : EB_FALSE; - return; + return; } /*************************************************** @@ -171,9 +171,9 @@ static void ComplexityClassifier32x32( * Pre-MD Uncovered Area Detection ******************************************************/ static void FailingMotionLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { EB_U32 rasterScanCuIndex; @@ -194,21 +194,21 @@ static void FailingMotionLcu( // Get ME SAD - cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; + cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; - OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + - oisResultsPtr->sortedOisCandidate[2][0].distortion + - oisResultsPtr->sortedOisCandidate[3][0].distortion + - oisResultsPtr->sortedOisCandidate[4][0].distortion; - } - else { //32x32 - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; - } + OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + + oisResultsPtr->sortedOisCandidate[2][0].distortion + + oisResultsPtr->sortedOisCandidate[3][0].distortion + + oisResultsPtr->sortedOisCandidate[4][0].distortion; + } + else { //32x32 + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; + } @@ -230,73 +230,73 @@ static void FailingMotionLcu( * Pre-MD Uncovered Area Detection ******************************************************/ static void DetectUncoveredLcu( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 rasterScanCuIndex; + EB_U32 rasterScanCuIndex; - // LCU Loop : Uncovered area detector -- ON only for 4k + // LCU Loop : Uncovered area detector -- ON only for 4k LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - // Detection variables - EB_U64 sortedcuOisSAD = 0; - EB_U64 cuMeSAD = 0; - EB_S64 meToOisSadDeviation = 0; - // LCU loop variables + // Detection variables + EB_U64 sortedcuOisSAD = 0; + EB_U64 cuMeSAD = 0; + EB_S64 meToOisSadDeviation = 0; + // LCU loop variables - EB_S64 uncoveredAreaLcuFlag = 0; + EB_S64 uncoveredAreaLcuFlag = 0; - if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ + if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ if (lcuParams->isCompleteLcu && (!pictureControlSetPtr->similarColocatedLcuArray[lcuIndex])){ - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_32x32_3; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_64x64; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_32x32_3; rasterScanCuIndex++) { - meToOisSadDeviation = 0; + meToOisSadDeviation = 0; - // Get ME SAD + // Get ME SAD - cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; + cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][rasterScanCuIndex].distortionDirection[0].distortion; - OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + - oisResultsPtr->sortedOisCandidate[2][0].distortion + - oisResultsPtr->sortedOisCandidate[3][0].distortion + - oisResultsPtr->sortedOisCandidate[4][0].distortion; - } - else if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] == 32) { - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; - } - else { - sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; - } + OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 32){ + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + + oisResultsPtr->sortedOisCandidate[2][0].distortion + + oisResultsPtr->sortedOisCandidate[3][0].distortion + + oisResultsPtr->sortedOisCandidate[4][0].distortion; + } + else if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] == 32) { + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; + } + else { + sortedcuOisSAD = oisResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; + } - EB_S64 meToOisSadDiff = (EB_S32)cuMeSAD - (EB_S32)sortedcuOisSAD; - meToOisSadDeviation = (sortedcuOisSAD == 0) || (meToOisSadDiff < 0) ? 0 : (meToOisSadDiff * 100) / sortedcuOisSAD; + EB_S64 meToOisSadDiff = (EB_S32)cuMeSAD - (EB_S32)sortedcuOisSAD; + meToOisSadDeviation = (sortedcuOisSAD == 0) || (meToOisSadDiff < 0) ? 0 : (meToOisSadDiff * 100) / sortedcuOisSAD; - if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 16){ + if (RASTER_SCAN_CU_SIZE[rasterScanCuIndex] > 16){ if (meToOisSadDeviation > SAD_DEVIATION_LCU_TH_1){ - uncoveredAreaLcuFlag += 1; - } + uncoveredAreaLcuFlag += 1; + } - } - } + } + } - // Update Uncovered area flag - pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = uncoveredAreaLcuFlag ? EB_TRUE : EB_FALSE; - } + // Update Uncovered area flag + pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = uncoveredAreaLcuFlag ? EB_TRUE : EB_FALSE; + } - } + } } @@ -304,380 +304,380 @@ static void DetectUncoveredLcu( * Calculates AC Energy ******************************************************/ static void CalculateAcEnergy( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; - EB_U32 inputLumaStride = inputPicturePtr->strideY; - EB_U32 inputOriginIndex; + EbPictureBufferDesc_t *inputPicturePtr = pictureControlSetPtr->enhancedPicturePtr; + EB_U32 inputLumaStride = inputPicturePtr->strideY; + EB_U32 inputOriginIndex; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - EB_U8 *meanPtr = pictureControlSetPtr->yMean[lcuIndex]; - inputOriginIndex = (lcuParams->originY + inputPicturePtr->originY) * inputLumaStride + (lcuParams->originX + inputPicturePtr->originX); + EB_U8 *meanPtr = pictureControlSetPtr->yMean[lcuIndex]; + inputOriginIndex = (lcuParams->originY + inputPicturePtr->originY) * inputLumaStride + (lcuParams->originX + inputPicturePtr->originX); - if (lcuParams->isCompleteLcu && pictureControlSetPtr->sliceType == EB_I_PICTURE && + if (lcuParams->isCompleteLcu && pictureControlSetPtr->sliceType == EB_I_PICTURE && pictureControlSetPtr->predStructure != EB_PRED_LOW_DELAY_P) { - EB_U32 inputCuOriginIndex; - EB_U32 cuNum, cuSize; - EB_U16 cuH, cuW; - - - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = ComputeNxMSatdSadLCU( - &(inputPicturePtr->bufferY[inputOriginIndex]), - inputPicturePtr->strideY, - lcuParams->width, - lcuParams->height); - - //64 x 64 - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = meanPtr[0]; - - // 32x32 - cuSize = 32; - cuNum = 64 / cuSize; - for (cuH = 0; cuH < cuNum; cuH++){ - for (cuW = 0; cuW < cuNum; cuW++){ - inputCuOriginIndex = inputOriginIndex + cuH*(64 / cuNum)*inputLumaStride + cuW*(64 / cuNum); - - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1 + cuH*cuNum + cuW] = ComputeNxMSatdSadLCU( - &(inputPicturePtr->bufferY[inputCuOriginIndex]), - inputPicturePtr->strideY, - cuSize, - cuSize); - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1 + cuH*cuNum + cuW] = meanPtr[1 + cuH*cuNum + cuW]; - } - } - - - } - else{ - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][2] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][3] = 100000000; - pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][4] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][2] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][3] = 100000000; - pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][4] = 100000000; - } + EB_U32 inputCuOriginIndex; + EB_U32 cuNum, cuSize; + EB_U16 cuH, cuW; + + + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = ComputeNxMSatdSadLCU( + &(inputPicturePtr->bufferY[inputOriginIndex]), + inputPicturePtr->strideY, + lcuParams->width, + lcuParams->height); + + //64 x 64 + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = meanPtr[0]; + + // 32x32 + cuSize = 32; + cuNum = 64 / cuSize; + for (cuH = 0; cuH < cuNum; cuH++){ + for (cuW = 0; cuW < cuNum; cuW++){ + inputCuOriginIndex = inputOriginIndex + cuH*(64 / cuNum)*inputLumaStride + cuW*(64 / cuNum); + + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1 + cuH*cuNum + cuW] = ComputeNxMSatdSadLCU( + &(inputPicturePtr->bufferY[inputCuOriginIndex]), + inputPicturePtr->strideY, + cuSize, + cuSize); + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1 + cuH*cuNum + cuW] = meanPtr[1 + cuH*cuNum + cuW]; + } + } + + + } + else{ + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][0] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][1] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][2] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][3] = 100000000; + pictureControlSetPtr->lcuYSrcEnergyCuArray[lcuIndex][4] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][0] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][1] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][2] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][3] = 100000000; + pictureControlSetPtr->lcuYSrcMeanCuArray[lcuIndex][4] = 100000000; + } } static void LumaContrastDetectorLcu( - SourceBasedOperationsContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SourceBasedOperationsContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U64 cuOisSAD = 0; - EB_U64 cuMeSAD = 0; + EB_U64 cuOisSAD = 0; + EB_U64 cuMeSAD = 0; - // Calculate Luma mean of the frame by averaging the mean of LCUs to Detect Dark Frames (On only for 4k and BQMode) - EB_U8 *yMeanPtr = contextPtr->yMeanPtr; + // Calculate Luma mean of the frame by averaging the mean of LCUs to Detect Dark Frames (On only for 4k and BQMode) + EB_U8 *yMeanPtr = contextPtr->yMeanPtr; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - if (lcuParams->isCompleteLcu){ - if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0) { + if (lcuParams->isCompleteLcu){ + if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0) { - OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; - cuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + - oisResultsPtr->sortedOisCandidate[2][0].distortion + - oisResultsPtr->sortedOisCandidate[3][0].distortion + - oisResultsPtr->sortedOisCandidate[4][0].distortion; + OisCu32Cu16Results_t *oisResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + cuOisSAD = oisResultsPtr->sortedOisCandidate[1][0].distortion + + oisResultsPtr->sortedOisCandidate[2][0].distortion + + oisResultsPtr->sortedOisCandidate[3][0].distortion + + oisResultsPtr->sortedOisCandidate[4][0].distortion; - cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][0].distortionDirection[0].distortion; + cuMeSAD = pictureControlSetPtr->meResults[lcuIndex][0].distortionDirection[0].distortion; - contextPtr->toBeIntraCodedProbability += cuOisSAD < cuMeSAD ? 1 : 0; - contextPtr->depth1BlockNum++; - } - } + contextPtr->toBeIntraCodedProbability += cuOisSAD < cuMeSAD ? 1 : 0; + contextPtr->depth1BlockNum++; + } + } - if (pictureControlSetPtr->nonMovingIndexArray[lcuIndex] < 10) - { - contextPtr->yNonMovingMean += yMeanPtr[0]; - contextPtr->countOfNonMovingLcus++; - } - else { - contextPtr->yMovingMean += yMeanPtr[0]; - contextPtr->countOfMovingLcus++; - } + if (pictureControlSetPtr->nonMovingIndexArray[lcuIndex] < 10) + { + contextPtr->yNonMovingMean += yMeanPtr[0]; + contextPtr->countOfNonMovingLcus++; + } + else { + contextPtr->yMovingMean += yMeanPtr[0]; + contextPtr->countOfMovingLcus++; + } } static void LumaContrastDetectorPicture( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr) { + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - contextPtr->yNonMovingMean = (contextPtr->countOfNonMovingLcus != 0) ? (contextPtr->yNonMovingMean / contextPtr->countOfNonMovingLcus) : 0; - contextPtr->yMovingMean = (contextPtr->countOfMovingLcus != 0) ? (contextPtr->yMovingMean / contextPtr->countOfMovingLcus) : 0; + contextPtr->yNonMovingMean = (contextPtr->countOfNonMovingLcus != 0) ? (contextPtr->yNonMovingMean / contextPtr->countOfNonMovingLcus) : 0; + contextPtr->yMovingMean = (contextPtr->countOfMovingLcus != 0) ? (contextPtr->yMovingMean / contextPtr->countOfMovingLcus) : 0; - pictureControlSetPtr->darkBackGroundlightForeGround = ((contextPtr->yMovingMean > (2 * contextPtr->yNonMovingMean)) && (contextPtr->yNonMovingMean < DARK_FRM_TH)) ? - EB_TRUE : - EB_FALSE; + pictureControlSetPtr->darkBackGroundlightForeGround = ((contextPtr->yMovingMean > (2 * contextPtr->yNonMovingMean)) && (contextPtr->yNonMovingMean < DARK_FRM_TH)) ? + EB_TRUE : + EB_FALSE; - pictureControlSetPtr->intraCodedBlockProbability = 0; + pictureControlSetPtr->intraCodedBlockProbability = 0; - if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0){ - pictureControlSetPtr->intraCodedBlockProbability = (EB_U8)(contextPtr->depth1BlockNum != 0 ? contextPtr->toBeIntraCodedProbability * 100 / contextPtr->depth1BlockNum : 0); - } + if (pictureControlSetPtr->sliceType != EB_I_PICTURE && pictureControlSetPtr->temporalLayerIndex == 0){ + pictureControlSetPtr->intraCodedBlockProbability = (EB_U8)(contextPtr->depth1BlockNum != 0 ? contextPtr->toBeIntraCodedProbability * 100 / contextPtr->depth1BlockNum : 0); + } } static void GrassSkinLcu( - SourceBasedOperationsContext_t *contextPtr, - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) { + SourceBasedOperationsContext_t *contextPtr, + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 childIndex; + EB_U32 childIndex; - EB_BOOL lcuGrassFlag = EB_FALSE; + EB_BOOL lcuGrassFlag = EB_FALSE; - EB_U32 grassLcuInrange; - EB_U32 processedCus; - EB_U32 rasterScanCuIndex; + EB_U32 grassLcuInrange; + EB_U32 processedCus; + EB_U32 rasterScanCuIndex; LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->lcuStatArray[lcuIndex]); + LcuStat_t *lcuStatPtr = &(pictureControlSetPtr->lcuStatArray[lcuIndex]); - _mm_prefetch((const char*)lcuStatPtr, _MM_HINT_T0); + _mm_prefetch((const char*)lcuStatPtr, _MM_HINT_T0); - lcuGrassFlag = EB_FALSE; - grassLcuInrange = 0; - processedCus = 0; + lcuGrassFlag = EB_FALSE; + grassLcuInrange = 0; + processedCus = 0; - for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { + for (rasterScanCuIndex = RASTER_SCAN_CU_INDEX_16x16_0; rasterScanCuIndex <= RASTER_SCAN_CU_INDEX_16x16_15; rasterScanCuIndex++) { if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { - const EB_U32 mdScanCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanCuIndex]; - const EB_U32 rasterScanParentCuIndex = RASTER_SCAN_CU_PARENT_INDEX[rasterScanCuIndex]; - const EB_U32 mdScanParentCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanParentCuIndex]; - CuStat_t *cuStatPtr = &(lcuStatPtr->cuStatArray[mdScanCuIndex]); + const EB_U32 mdScanCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanCuIndex]; + const EB_U32 rasterScanParentCuIndex = RASTER_SCAN_CU_PARENT_INDEX[rasterScanCuIndex]; + const EB_U32 mdScanParentCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanParentCuIndex]; + CuStat_t *cuStatPtr = &(lcuStatPtr->cuStatArray[mdScanCuIndex]); - const EB_U32 perfectCondition = 7; - const EB_U8 yMean = contextPtr->yMeanPtr[rasterScanCuIndex]; - const EB_U8 cbMean = contextPtr->cbMeanPtr[rasterScanCuIndex]; - const EB_U8 crMean = contextPtr->crMeanPtr[rasterScanCuIndex]; - EB_U32 grassCondition = 0; - EB_U32 skinCondition = 0; + const EB_U32 perfectCondition = 7; + const EB_U8 yMean = contextPtr->yMeanPtr[rasterScanCuIndex]; + const EB_U8 cbMean = contextPtr->cbMeanPtr[rasterScanCuIndex]; + const EB_U8 crMean = contextPtr->crMeanPtr[rasterScanCuIndex]; + EB_U32 grassCondition = 0; + EB_U32 skinCondition = 0; - EB_U32 highChromaCondition = 0; - EB_U32 highLumaCondition = 0; + EB_U32 highChromaCondition = 0; + EB_U32 highLumaCondition = 0; - // GRASS - grassCondition += (yMean > Y_MEAN_RANGE_02 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; - grassCondition += (cbMean > CB_MEAN_RANGE_00 && cbMean < CB_MEAN_RANGE_02) ? 2 : 0; - grassCondition += (crMean > CR_MEAN_RANGE_00 && crMean < CR_MEAN_RANGE_02) ? 4 : 0; + // GRASS + grassCondition += (yMean > Y_MEAN_RANGE_02 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; + grassCondition += (cbMean > CB_MEAN_RANGE_00 && cbMean < CB_MEAN_RANGE_02) ? 2 : 0; + grassCondition += (crMean > CR_MEAN_RANGE_00 && crMean < CR_MEAN_RANGE_02) ? 4 : 0; - grassLcuInrange += (grassCondition == perfectCondition) ? 1 : 0; - processedCus++; + grassLcuInrange += (grassCondition == perfectCondition) ? 1 : 0; + processedCus++; - lcuGrassFlag = grassCondition == perfectCondition ? EB_TRUE : lcuGrassFlag; + lcuGrassFlag = grassCondition == perfectCondition ? EB_TRUE : lcuGrassFlag; - cuStatPtr->grassArea = (EB_BOOL)(grassCondition == perfectCondition); - // SKIN - skinCondition += (yMean > Y_MEAN_RANGE_03 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; - skinCondition += (cbMean > 100 && cbMean < 120) ? 2 : 0; - skinCondition += (crMean > 135 && crMean < 160) ? 4 : 0; + cuStatPtr->grassArea = (EB_BOOL)(grassCondition == perfectCondition); + // SKIN + skinCondition += (yMean > Y_MEAN_RANGE_03 && yMean < Y_MEAN_RANGE_01) ? 1 : 0; + skinCondition += (cbMean > 100 && cbMean < 120) ? 2 : 0; + skinCondition += (crMean > 135 && crMean < 160) ? 4 : 0; - cuStatPtr->skinArea = (EB_BOOL)(skinCondition == perfectCondition); + cuStatPtr->skinArea = (EB_BOOL)(skinCondition == perfectCondition); - highChromaCondition = (crMean >= 127 || cbMean > 150) ? 1 : 0; - highLumaCondition = (crMean >= 80 && yMean > 180) ? 1 : 0; - cuStatPtr->highLuma = (highLumaCondition == 1) ? EB_TRUE : EB_FALSE; - cuStatPtr->highChroma = (highChromaCondition == 1) ? EB_TRUE : EB_FALSE; + highChromaCondition = (crMean >= 127 || cbMean > 150) ? 1 : 0; + highLumaCondition = (crMean >= 80 && yMean > 180) ? 1 : 0; + cuStatPtr->highLuma = (highLumaCondition == 1) ? EB_TRUE : EB_FALSE; + cuStatPtr->highChroma = (highChromaCondition == 1) ? EB_TRUE : EB_FALSE; - for (childIndex = mdScanCuIndex + 1; childIndex < mdScanCuIndex + 5; ++childIndex){ - lcuStatPtr->cuStatArray[childIndex].grassArea = cuStatPtr->grassArea; - lcuStatPtr->cuStatArray[childIndex].skinArea = cuStatPtr->skinArea; - lcuStatPtr->cuStatArray[childIndex].highChroma = cuStatPtr->highChroma; - lcuStatPtr->cuStatArray[childIndex].highLuma = cuStatPtr->highLuma; + for (childIndex = mdScanCuIndex + 1; childIndex < mdScanCuIndex + 5; ++childIndex){ + lcuStatPtr->cuStatArray[childIndex].grassArea = cuStatPtr->grassArea; + lcuStatPtr->cuStatArray[childIndex].skinArea = cuStatPtr->skinArea; + lcuStatPtr->cuStatArray[childIndex].highChroma = cuStatPtr->highChroma; + lcuStatPtr->cuStatArray[childIndex].highLuma = cuStatPtr->highLuma; - } + } - lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea = cuStatPtr->grassArea ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea; - lcuStatPtr->cuStatArray[0].grassArea = cuStatPtr->grassArea ? EB_TRUE : - lcuStatPtr->cuStatArray[0].grassArea; - lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea = cuStatPtr->skinArea ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea; - lcuStatPtr->cuStatArray[0].skinArea = cuStatPtr->skinArea ? EB_TRUE : - lcuStatPtr->cuStatArray[0].skinArea; - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma = cuStatPtr->highChroma ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma; - lcuStatPtr->cuStatArray[0].highChroma = cuStatPtr->highChroma ? EB_TRUE : - lcuStatPtr->cuStatArray[0].highChroma; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea = cuStatPtr->grassArea ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].grassArea; + lcuStatPtr->cuStatArray[0].grassArea = cuStatPtr->grassArea ? EB_TRUE : + lcuStatPtr->cuStatArray[0].grassArea; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea = cuStatPtr->skinArea ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].skinArea; + lcuStatPtr->cuStatArray[0].skinArea = cuStatPtr->skinArea ? EB_TRUE : + lcuStatPtr->cuStatArray[0].skinArea; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma = cuStatPtr->highChroma ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highChroma; + lcuStatPtr->cuStatArray[0].highChroma = cuStatPtr->highChroma ? EB_TRUE : + lcuStatPtr->cuStatArray[0].highChroma; - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma = cuStatPtr->highLuma ? EB_TRUE : - lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma; - lcuStatPtr->cuStatArray[0].highLuma = cuStatPtr->highLuma ? EB_TRUE : - lcuStatPtr->cuStatArray[0].highLuma; + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma = cuStatPtr->highLuma ? EB_TRUE : + lcuStatPtr->cuStatArray[mdScanParentCuIndex].highLuma; + lcuStatPtr->cuStatArray[0].highLuma = cuStatPtr->highLuma ? EB_TRUE : + lcuStatPtr->cuStatArray[0].highLuma; - } - } + } + } - contextPtr->pictureNumGrassLcu += lcuGrassFlag ? 1 : 0; + contextPtr->pictureNumGrassLcu += lcuGrassFlag ? 1 : 0; } static void GrassSkinPicture( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr) { - pictureControlSetPtr->grassPercentageInPicture = (EB_U8)(contextPtr->pictureNumGrassLcu * 100 / pictureControlSetPtr->lcuTotalCount); + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { + pictureControlSetPtr->grassPercentageInPicture = (EB_U8)(contextPtr->pictureNumGrassLcu * 100 / pictureControlSetPtr->lcuTotalCount); } /****************************************************** * Detect and mark LCU and 32x32 CUs which belong to an isolated non-homogeneous region surrounding a homogenous and flat region ******************************************************/ static inline void DetermineIsolatedNonHomogeneousRegionInPicture( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U32 lcuIndex; - EB_U32 cuuIndex; - EB_S32 lcuHor, lcuVer, lcuVerOffset; - EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; - EB_U32 pictureWidthInLcu = sequenceControlSetPtr->pictureWidthInLcu; - EB_U32 pictureHeightInLcu = sequenceControlSetPtr->pictureHeightInLcu; + EB_U32 lcuIndex; + EB_U32 cuuIndex; + EB_S32 lcuHor, lcuVer, lcuVerOffset; + EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; + EB_U32 pictureWidthInLcu = sequenceControlSetPtr->pictureWidthInLcu; + EB_U32 pictureHeightInLcu = sequenceControlSetPtr->pictureHeightInLcu; - for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { + for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - // Initialize - pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_FALSE; + // Initialize + pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_FALSE; if ((lcuParams->horizontalIndex > 0) && (lcuParams->horizontalIndex < pictureWidthInLcu - 1) && (lcuParams->verticalIndex > 0) && (lcuParams->verticalIndex < pictureHeightInLcu - 1)) { - EB_U32 countOfMedVarianceLcu; - countOfMedVarianceLcu = 0; + EB_U32 countOfMedVarianceLcu; + countOfMedVarianceLcu = 0; // top neighbors - countOfMedVarianceLcu += ((pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64]) <= MEDIUM_LCU_VARIANCE) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex - pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; - // bottom - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu - 1].isCompleteLcu) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu].isCompleteLcu) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; - // left right - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + 1].isCompleteLcu) ? 1 : 0; - countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; - - // At least two neighbors are flat - if ((countOfMedVarianceLcu > 2)|| countOfMedVarianceLcu > 1) - { - // Search within an LCU if any of the 32x32 CUs is non-homogeneous - EB_U32 count32x32NonhomCusInLcu = 0; - for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) - { - if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) - count32x32NonhomCusInLcu++; - } - // If atleast one is non-homogeneous, then check all its neighbors (top left, top, top right, left, right, btm left, btm, btm right) - EB_U32 countOfHomogeneousNeighborLcus = 0; - if (count32x32NonhomCusInLcu > 0) { - for (lcuVer = -1; lcuVer <= 1; lcuVer++) { - lcuVerOffset = lcuVer * (EB_S32)pictureWidthInLcu; - for (lcuHor = -1; lcuHor <= 1; lcuHor++) { - if (lcuVer != 0 && lcuHor != 0) - countOfHomogeneousNeighborLcus += (pictureControlSetPtr->lcuHomogeneousAreaArray[lcuIndex + lcuVerOffset + lcuHor] == EB_TRUE); - - } - } - } - - // To determine current lcu is isolated non-homogeneous, at least 2 neighbors must be homogeneous - if (countOfHomogeneousNeighborLcus >= 2){ - for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) - { - if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) - { - pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_TRUE; - } - } - } - - } - } - } - return; + countOfMedVarianceLcu += ((pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64]) <= MEDIUM_LCU_VARIANCE) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex - pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; + // bottom + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu - 1].isCompleteLcu) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu].isCompleteLcu) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + pictureWidthInLcu + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + pictureWidthInLcu + 1].isCompleteLcu) ? 1 : 0; + // left right + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex + 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE && sequenceControlSetPtr->lcuParamsArray[lcuIndex + 1].isCompleteLcu) ? 1 : 0; + countOfMedVarianceLcu += (pictureControlSetPtr->variance[lcuIndex - 1][ME_TIER_ZERO_PU_64x64] <= MEDIUM_LCU_VARIANCE) ? 1 : 0; + + // At least two neighbors are flat + if ((countOfMedVarianceLcu > 2)|| countOfMedVarianceLcu > 1) + { + // Search within an LCU if any of the 32x32 CUs is non-homogeneous + EB_U32 count32x32NonhomCusInLcu = 0; + for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) + { + if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) + count32x32NonhomCusInLcu++; + } + // If atleast one is non-homogeneous, then check all its neighbors (top left, top, top right, left, right, btm left, btm, btm right) + EB_U32 countOfHomogeneousNeighborLcus = 0; + if (count32x32NonhomCusInLcu > 0) { + for (lcuVer = -1; lcuVer <= 1; lcuVer++) { + lcuVerOffset = lcuVer * (EB_S32)pictureWidthInLcu; + for (lcuHor = -1; lcuHor <= 1; lcuHor++) { + if (lcuVer != 0 && lcuHor != 0) + countOfHomogeneousNeighborLcus += (pictureControlSetPtr->lcuHomogeneousAreaArray[lcuIndex + lcuVerOffset + lcuHor] == EB_TRUE); + + } + } + } + + // To determine current lcu is isolated non-homogeneous, at least 2 neighbors must be homogeneous + if (countOfHomogeneousNeighborLcus >= 2){ + for (cuuIndex = 0; cuuIndex < 4; cuuIndex++) + { + if (pictureControlSetPtr->varOfVar32x32BasedLcuArray[lcuIndex][cuuIndex] > VAR_BASED_DETAIL_PRESERVATION_SELECTOR_THRSLHD) + { + pictureControlSetPtr->lcuIsolatedNonHomogeneousAreaArray[lcuIndex] = EB_TRUE; + } + } + } + + } + } + } + return; } static void SetDefaultDeltaQpRange( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr) { - - EB_S8 minDeltaQP; - EB_U8 maxDeltaQP; - if (pictureControlSetPtr->temporalLayerIndex == 0) { - minDeltaQP = EbHevcMinDeltaQPdefault[0]; - maxDeltaQP = EbHevcMaxDeltaQPdefault[0]; - } - else if (pictureControlSetPtr->isUsedAsReferenceFlag) { - minDeltaQP = EbHevcMinDeltaQPdefault[1]; - maxDeltaQP = EbHevcMaxDeltaQPdefault[1]; - } - else { - minDeltaQP = EbHevcMinDeltaQPdefault[2]; - maxDeltaQP = EbHevcMaxDeltaQPdefault[2]; - } - - // Shape the min degrade - minDeltaQP = (((EB_S8)(minDeltaQP + MIN_DELTA_QP_SHAPE_TH) > 0) ? 0 : (minDeltaQP + MIN_DELTA_QP_SHAPE_TH)); - - // Shape the max degrade - maxDeltaQP = (((EB_S8)(maxDeltaQP - MAX_DELTA_QP_SHAPE_TH) < 0) ? 0 : (maxDeltaQP - MAX_DELTA_QP_SHAPE_TH)); - - contextPtr->minDeltaQP = minDeltaQP; - contextPtr->maxDeltaQP = maxDeltaQP; + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr) { + + EB_S8 minDeltaQP; + EB_U8 maxDeltaQP; + if (pictureControlSetPtr->temporalLayerIndex == 0) { + minDeltaQP = EbHevcMinDeltaQPdefault[0]; + maxDeltaQP = EbHevcMaxDeltaQPdefault[0]; + } + else if (pictureControlSetPtr->isUsedAsReferenceFlag) { + minDeltaQP = EbHevcMinDeltaQPdefault[1]; + maxDeltaQP = EbHevcMaxDeltaQPdefault[1]; + } + else { + minDeltaQP = EbHevcMinDeltaQPdefault[2]; + maxDeltaQP = EbHevcMaxDeltaQPdefault[2]; + } + + // Shape the min degrade + minDeltaQP = (((EB_S8)(minDeltaQP + MIN_DELTA_QP_SHAPE_TH) > 0) ? 0 : (minDeltaQP + MIN_DELTA_QP_SHAPE_TH)); + + // Shape the max degrade + maxDeltaQP = (((EB_S8)(maxDeltaQP - MAX_DELTA_QP_SHAPE_TH) < 0) ? 0 : (maxDeltaQP - MAX_DELTA_QP_SHAPE_TH)); + + contextPtr->minDeltaQP = minDeltaQP; + contextPtr->maxDeltaQP = maxDeltaQP; } static inline void DetermineMorePotentialAuraAreas( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { - EB_U16 lcuIndex; - EB_S32 lcuHor, lcuVer, lcuVerOffset; - EB_U32 countOfEdgeBlocks = 0, countOfNonEdgeBlocks = 0; + EB_U16 lcuIndex; + EB_S32 lcuHor, lcuVer, lcuVerOffset; + EB_U32 countOfEdgeBlocks = 0, countOfNonEdgeBlocks = 0; - EB_U32 lightLumaValue = 150; + EB_U32 lightLumaValue = 150; - EB_U16 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; + EB_U16 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; - for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { + for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - // For all the internal LCUs - if (!lcuParams->isEdgeLcu) { - countOfNonEdgeBlocks = 0; + // For all the internal LCUs + if (!lcuParams->isEdgeLcu) { + countOfNonEdgeBlocks = 0; if (pictureControlSetPtr->edgeResultsPtr[lcuIndex].edgeBlockNum - && pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] >= lightLumaValue) { + && pictureControlSetPtr->yMean[lcuIndex][ME_TIER_ZERO_PU_64x64] >= lightLumaValue) { - for (lcuVer = -1; lcuVer <= 1; lcuVer++) { - lcuVerOffset = lcuVer * (EB_S32)sequenceControlSetPtr->pictureWidthInLcu; - for (lcuHor = -1; lcuHor <= 1; lcuHor++) { + for (lcuVer = -1; lcuVer <= 1; lcuVer++) { + lcuVerOffset = lcuVer * (EB_S32)sequenceControlSetPtr->pictureWidthInLcu; + for (lcuHor = -1; lcuHor <= 1; lcuHor++) { countOfNonEdgeBlocks += (!pictureControlSetPtr->edgeResultsPtr[lcuIndex + lcuVerOffset + lcuHor].edgeBlockNum) && - (pictureControlSetPtr->nonMovingIndexArray[lcuIndex + lcuVerOffset + lcuHor] < 30); - } - } - } + (pictureControlSetPtr->nonMovingIndexArray[lcuIndex + lcuVerOffset + lcuHor] < 30); + } + } + } - if (countOfNonEdgeBlocks > 1) { - countOfEdgeBlocks++; - } - } - } + if (countOfNonEdgeBlocks > 1) { + countOfEdgeBlocks++; + } + } + } - // To check the percentage of potential aura in the picture.. If a large area is detected then this is not isolated + // To check the percentage of potential aura in the picture.. If a large area is detected then this is not isolated pictureControlSetPtr->percentageOfEdgeinLightBackground = (EB_U8)(countOfEdgeBlocks * 100 / lcuTotalCount); } @@ -686,30 +686,30 @@ static inline void DetermineMorePotentialAuraAreas( * Detects the presence of dark area ***************************************************/ static void DeriveHighDarkAreaDensityFlag( - SequenceControlSet_t *sequenceControlSetPtr, - PictureParentControlSet_t *pictureControlSetPtr) { - - - EB_U32 regionInPictureWidthIndex; - EB_U32 regionInPictureHeightIndex; - EB_U32 lumaHistogramBin; - EB_U32 blackSamplesCount = 0; - EB_U32 blackAreaPercentage; - // Loop over regions inside the picture - for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions - for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions - for (lumaHistogramBin = 0; lumaHistogramBin < LOW_MEAN_TH_0; lumaHistogramBin++){ // loop over the 1st LOW_MEAN_THLD bins - blackSamplesCount += pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][lumaHistogramBin]; - } - } - } - - blackAreaPercentage = (blackSamplesCount * 100) / (sequenceControlSetPtr->lumaWidth * sequenceControlSetPtr->lumaHeight); + SequenceControlSet_t *sequenceControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr) { + + + EB_U32 regionInPictureWidthIndex; + EB_U32 regionInPictureHeightIndex; + EB_U32 lumaHistogramBin; + EB_U32 blackSamplesCount = 0; + EB_U32 blackAreaPercentage; + // Loop over regions inside the picture + for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions + for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions + for (lumaHistogramBin = 0; lumaHistogramBin < LOW_MEAN_TH_0; lumaHistogramBin++){ // loop over the 1st LOW_MEAN_THLD bins + blackSamplesCount += pictureControlSetPtr->pictureHistogram[regionInPictureWidthIndex][regionInPictureHeightIndex][0][lumaHistogramBin]; + } + } + } + + blackAreaPercentage = (blackSamplesCount * 100) / (sequenceControlSetPtr->lumaWidth * sequenceControlSetPtr->lumaHeight); pictureControlSetPtr->highDarkAreaDensityFlag = (EB_BOOL)(blackAreaPercentage >= MIN_BLACK_AREA_PERCENTAGE); blackSamplesCount = 0; - EB_U32 whiteSamplesCount = 0; - EB_U32 whiteAreaPercentage; + EB_U32 whiteSamplesCount = 0; + EB_U32 whiteAreaPercentage; // Loop over regions inside the picture for (regionInPictureWidthIndex = 0; regionInPictureWidthIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerWidth; regionInPictureWidthIndex++){ // loop over horizontal regions for (regionInPictureHeightIndex = 0; regionInPictureHeightIndex < sequenceControlSetPtr->pictureAnalysisNumberOfRegionsPerHeight; regionInPictureHeightIndex++){ // loop over vertical regions @@ -729,76 +729,76 @@ static void DeriveHighDarkAreaDensityFlag( pictureControlSetPtr->highDarkLowLightAreaDensityFlag = (EB_BOOL)(blackAreaPercentage >= MIN_BLACK_AREA_PERCENTAGE) && (whiteAreaPercentage >= MIN_WHITE_AREA_PERCENTAGE); } -#define NORM_FACTOR 10 -#define VAR_MIN 10 -#define VAR_MAX 300 -#define MIN_Y 70 -#define MAX_Y 145 -#define MID_CB 140 -#define MID_CR 115 -#define TH_CB 10 -#define TH_CR 15 +#define NORM_FACTOR 10 +#define VAR_MIN 10 +#define VAR_MAX 300 +#define MIN_Y 70 +#define MAX_Y 145 +#define MID_CB 140 +#define MID_CR 115 +#define TH_CB 10 +#define TH_CR 15 /****************************************************** * High contrast classifier ******************************************************/ static void TemporalHighContrastClassifier( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 blkIt; - EB_U32 nsadTable[] = { 10, 5, 5, 5, 5, 5 }; - EB_U32 thRes = 0; - EB_U32 nsad; - EB_U32 meDist = 0; + EB_U32 blkIt; + EB_U32 nsadTable[] = { 10, 5, 5, 5, 5, 5 }; + EB_U32 thRes = 0; + EB_U32 nsad; + EB_U32 meDist = 0; - if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ + if (pictureControlSetPtr->sliceType == EB_B_PICTURE){ - for (blkIt = 0; blkIt < 4; blkIt++) { + for (blkIt = 0; blkIt < 4; blkIt++) { - nsad = ((EB_U32)pictureControlSetPtr->meResults[lcuIndex][1 + blkIt].distortionDirection[0].distortion) >> NORM_FACTOR; + nsad = ((EB_U32)pictureControlSetPtr->meResults[lcuIndex][1 + blkIt].distortionDirection[0].distortion) >> NORM_FACTOR; - if (nsad >= nsadTable[pictureControlSetPtr->temporalLayerIndex] + thRes) - meDist++; - } + if (nsad >= nsadTable[pictureControlSetPtr->temporalLayerIndex] + thRes) + meDist++; + } - } - contextPtr->highDist = meDist>0 ? EB_TRUE : EB_FALSE; + } + contextPtr->highDist = meDist>0 ? EB_TRUE : EB_FALSE; } static void SpatialHighContrastClassifier( - SourceBasedOperationsContext_t *contextPtr, - PictureParentControlSet_t *pictureControlSetPtr, - EB_U32 lcuIndex) + SourceBasedOperationsContext_t *contextPtr, + PictureParentControlSet_t *pictureControlSetPtr, + EB_U32 lcuIndex) { - EB_U32 blkIt; + EB_U32 blkIt; - contextPtr->highContrastNum = 0; + contextPtr->highContrastNum = 0; - //16x16 blocks - for (blkIt = 0; blkIt < 16; blkIt++) { + //16x16 blocks + for (blkIt = 0; blkIt < 16; blkIt++) { - EB_U8 ymean = contextPtr->yMeanPtr[5 + blkIt]; - EB_U8 umean = contextPtr->cbMeanPtr[5 + blkIt]; - EB_U8 vmean = contextPtr->crMeanPtr[5 + blkIt]; + EB_U8 ymean = contextPtr->yMeanPtr[5 + blkIt]; + EB_U8 umean = contextPtr->cbMeanPtr[5 + blkIt]; + EB_U8 vmean = contextPtr->crMeanPtr[5 + blkIt]; - EB_U16 var = pictureControlSetPtr->variance[lcuIndex][5 + blkIt]; + EB_U16 var = pictureControlSetPtr->variance[lcuIndex][5 + blkIt]; - if (var>VAR_MIN && varMIN_Y && ymean < MAX_Y && //medium brightness(not too dark and not too bright) - ABS((EB_S64)umean - MID_CB) < TH_CB && //middle of the color plane - ABS((EB_S64)vmean - MID_CR) < TH_CR //middle of the color plane - ) - { - contextPtr->highContrastNum++; + if (var>VAR_MIN && varMIN_Y && ymean < MAX_Y && //medium brightness(not too dark and not too bright) + ABS((EB_S64)umean - MID_CB) < TH_CB && //middle of the color plane + ABS((EB_S64)vmean - MID_CR) < TH_CR //middle of the color plane + ) + { + contextPtr->highContrastNum++; - } + } - } + } } /****************************************************** @@ -807,8 +807,8 @@ Output : populate to neighbor LCUs ******************************************************/ static void PopulateFromCurrentLcuToNeighborLcus( PictureParentControlSet_t *pictureControlSetPtr, - EB_BOOL inputToPopulate, - EB_BOOL *outputBuffer, + EB_BOOL inputToPopulate, + EB_BOOL *outputBuffer, EB_U32 lcuAddr, EB_U32 lcuOriginX, EB_U32 lcuOriginY) @@ -862,7 +862,7 @@ Input : variance Output : true if current & neighbors are spatially complex ******************************************************/ static EB_BOOL IsSpatiallyComplexArea( - PictureParentControlSet_t *pictureControlSetPtr, + PictureParentControlSet_t *pictureControlSetPtr, EB_U32 lcuAddr, EB_U32 lcuOriginX, EB_U32 lcuOriginY) @@ -1001,7 +1001,7 @@ static void DeriveBlockinessPresentFlag( } static void QpmGatherStatistics( - SequenceControlSet_t *sequenceControlSetPtr, + SequenceControlSet_t *sequenceControlSetPtr, PictureParentControlSet_t *pictureControlSetPtr, EB_U32 lcuIndex) { @@ -1025,14 +1025,14 @@ static void QpmGatherStatistics( if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { mdScanCuIndex = RASTER_SCAN_TO_MD_SCAN[rasterScanCuIndex]; - OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; + OisCu8Results_t *oisCu8ResultsPtr = pictureControlSetPtr->oisCu8Results[lcuIndex]; if (pictureControlSetPtr->cu8x8Mode == CU_8x8_MODE_0 && oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0][0].validDistortion) { oisSad = oisCu8ResultsPtr->sortedOisCandidate[rasterScanCuIndex - RASTER_SCAN_CU_INDEX_8x8_0][0].distortion; } else { - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; const CodedUnitStats_t *cuStats = GetCodedUnitStats(ParentBlockIndex[mdScanCuIndex]); const EB_U32 me2Nx2NTableOffset = cuStats->cuNumInDepth + me2Nx2NOffset[cuStats->depth]; if (oisCu32Cu16ResultsPtr->sortedOisCandidate[me2Nx2NTableOffset][0].validDistortion) { @@ -1068,7 +1068,7 @@ static void QpmGatherStatistics( if (lcuParams->rasterScanCuValidity[rasterScanCuIndex]) { - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; oisSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; @@ -1093,7 +1093,7 @@ static void QpmGatherStatistics( - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; oisSad = oisCu32Cu16ResultsPtr->sortedOisCandidate[rasterScanCuIndex][0].distortion; @@ -1117,7 +1117,7 @@ static void QpmGatherStatistics( if (lcuParams->rasterScanCuValidity[RASTER_SCAN_CU_INDEX_64x64]) { - OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; + OisCu32Cu16Results_t *oisCu32Cu16ResultsPtr = pictureControlSetPtr->oisCu32Cu16Results[lcuIndex]; @@ -1145,7 +1145,7 @@ static void QpmGatherStatistics( static void StationaryEdgeOverUpdateOverTimeLcu( SequenceControlSet_t *sequenceControlSetPtr, - EB_U32 totalCheckedPictures, + EB_U32 totalCheckedPictures, PictureParentControlSet_t *pictureControlSetPtr, EB_U32 totalLcuCount) { @@ -1200,7 +1200,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1261,7 +1261,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1291,7 +1291,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1333,7 +1333,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1363,7 +1363,7 @@ static void StationaryEdgeOverUpdateOverTimeLcu( for (lcuIndex = 0; lcuIndex < pictureControlSetPtr->lcuTotalCount; ++lcuIndex) { - LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; + LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; LcuStat_t *lcuStatPtr = &pictureControlSetPtr->lcuStatArray[lcuIndex]; lcu_X = lcuParams->horizontalIndex; @@ -1400,13 +1400,13 @@ static void StationaryEdgeOverUpdateOverTimeLcu( ************************************************/ void* SourceBasedOperationsKernel(void *inputPtr) { - SourceBasedOperationsContext_t *contextPtr = (SourceBasedOperationsContext_t*)inputPtr; + SourceBasedOperationsContext_t *contextPtr = (SourceBasedOperationsContext_t*)inputPtr; PictureParentControlSet_t *pictureControlSetPtr; - SequenceControlSet_t *sequenceControlSetPtr; + SequenceControlSet_t *sequenceControlSetPtr; EbObjectWrapper_t *inputResultsWrapperPtr; - InitialRateControlResults_t *inputResultsPtr; + InitialRateControlResults_t *inputResultsPtr; EbObjectWrapper_t *outputResultsWrapperPtr; - PictureDemuxResults_t *outputResultsPtr; + PictureDemuxResults_t *outputResultsPtr; for (;;) { @@ -1416,74 +1416,74 @@ void* SourceBasedOperationsKernel(void *inputPtr) &inputResultsWrapperPtr); EB_CHECK_END_OBJ(inputResultsWrapperPtr); - inputResultsPtr = (InitialRateControlResults_t*)inputResultsWrapperPtr->objectPtr; + inputResultsPtr = (InitialRateControlResults_t*)inputResultsWrapperPtr->objectPtr; pictureControlSetPtr = (PictureParentControlSet_t*)inputResultsPtr->pictureControlSetWrapperPtr->objectPtr; - sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; + sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->sequenceControlSetWrapperPtr->objectPtr; #if DEADLOCK_DEBUG SVT_LOG("POC %lld SRC IN \n", pictureControlSetPtr->pictureNumber); #endif - pictureControlSetPtr->darkBackGroundlightForeGround = EB_FALSE; - contextPtr->pictureNumGrassLcu = 0; - contextPtr->countOfMovingLcus = 0; - contextPtr->countOfNonMovingLcus = 0; - contextPtr->yNonMovingMean = 0; - contextPtr->yMovingMean = 0; - contextPtr->toBeIntraCodedProbability = 0; - contextPtr->depth1BlockNum = 0; - - EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; - EB_U32 lcuIndex; + pictureControlSetPtr->darkBackGroundlightForeGround = EB_FALSE; + contextPtr->pictureNumGrassLcu = 0; + contextPtr->countOfMovingLcus = 0; + contextPtr->countOfNonMovingLcus = 0; + contextPtr->yNonMovingMean = 0; + contextPtr->yMovingMean = 0; + contextPtr->toBeIntraCodedProbability = 0; + contextPtr->depth1BlockNum = 0; + + EB_U32 lcuTotalCount = pictureControlSetPtr->lcuTotalCount; + EB_U32 lcuIndex; - /***********************************************LCU-based operations************************************************************/ - for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { + /***********************************************LCU-based operations************************************************************/ + for (lcuIndex = 0; lcuIndex < lcuTotalCount; ++lcuIndex) { LcuParams_t *lcuParams = &sequenceControlSetPtr->lcuParamsArray[lcuIndex]; - pictureControlSetPtr->lcuCmplxContrastArray[lcuIndex] = 0; + pictureControlSetPtr->lcuCmplxContrastArray[lcuIndex] = 0; EB_BOOL isCompleteLcu = lcuParams->isCompleteLcu; - EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; + EB_U8 *yMeanPtr = pictureControlSetPtr->yMean[lcuIndex]; - _mm_prefetch((const char*)yMeanPtr, _MM_HINT_T0); + _mm_prefetch((const char*)yMeanPtr, _MM_HINT_T0); - EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; - EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; + EB_U8 *crMeanPtr = pictureControlSetPtr->crMean[lcuIndex]; + EB_U8 *cbMeanPtr = pictureControlSetPtr->cbMean[lcuIndex]; - _mm_prefetch((const char*)crMeanPtr, _MM_HINT_T0); - _mm_prefetch((const char*)cbMeanPtr, _MM_HINT_T0); + _mm_prefetch((const char*)crMeanPtr, _MM_HINT_T0); + _mm_prefetch((const char*)cbMeanPtr, _MM_HINT_T0); - contextPtr->yMeanPtr = yMeanPtr; - contextPtr->crMeanPtr = crMeanPtr; - contextPtr->cbMeanPtr = cbMeanPtr; + contextPtr->yMeanPtr = yMeanPtr; + contextPtr->crMeanPtr = crMeanPtr; + contextPtr->cbMeanPtr = cbMeanPtr; - // Grass & Skin detection + // Grass & Skin detection GrassSkinLcu( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - - // Spatial high contrast classifier - if (isCompleteLcu) { - SpatialHighContrastClassifier( - contextPtr, - pictureControlSetPtr, - lcuIndex); - } - - // Luma Contrast detection - LumaContrastDetectorLcu( - contextPtr, - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - - // AC energy computation - CalculateAcEnergy( - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - - // Failing Motion Detection + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + + // Spatial high contrast classifier + if (isCompleteLcu) { + SpatialHighContrastClassifier( + contextPtr, + pictureControlSetPtr, + lcuIndex); + } + + // Luma Contrast detection + LumaContrastDetectorLcu( + contextPtr, + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + + // AC energy computation + CalculateAcEnergy( + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + + // Failing Motion Detection pictureControlSetPtr->failingMotionLcuFlag[lcuIndex] = EB_FALSE; if (pictureControlSetPtr->sliceType != EB_I_PICTURE && isCompleteLcu){ @@ -1494,24 +1494,24 @@ void* SourceBasedOperationsKernel(void *inputPtr) lcuIndex); } - pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = EB_FALSE; - if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ - - if (isCompleteLcu && (!pictureControlSetPtr->similarColocatedLcuArray[lcuIndex])){ - DetectUncoveredLcu( - sequenceControlSetPtr, - pictureControlSetPtr, - lcuIndex); - } - } - - // Uncovered area detection II - // Temporal high contrast classifier - if (isCompleteLcu) { - TemporalHighContrastClassifier( - contextPtr, - pictureControlSetPtr, - lcuIndex); + pictureControlSetPtr->uncoveredAreaLcuFlag[lcuIndex] = EB_FALSE; + if (pictureControlSetPtr->temporalLayerIndex == 0 && pictureControlSetPtr->sliceType != EB_I_PICTURE){ + + if (isCompleteLcu && (!pictureControlSetPtr->similarColocatedLcuArray[lcuIndex])){ + DetectUncoveredLcu( + sequenceControlSetPtr, + pictureControlSetPtr, + lcuIndex); + } + } + + // Uncovered area detection II + // Temporal high contrast classifier + if (isCompleteLcu) { + TemporalHighContrastClassifier( + contextPtr, + pictureControlSetPtr, + lcuIndex); if (contextPtr->highContrastNum && contextPtr->highDist) { PopulateFromCurrentLcuToNeighborLcus( @@ -1523,50 +1523,50 @@ void* SourceBasedOperationsKernel(void *inputPtr) lcuParams->originY); } - } + } - } + } - /*********************************************Picture-based operations**********************************************************/ - LumaContrastDetectorPicture( - contextPtr, - pictureControlSetPtr); + /*********************************************Picture-based operations**********************************************************/ + LumaContrastDetectorPicture( + contextPtr, + pictureControlSetPtr); - // Delta QP range adjustments - SetDefaultDeltaQpRange( - contextPtr, - pictureControlSetPtr); + // Delta QP range adjustments + SetDefaultDeltaQpRange( + contextPtr, + pictureControlSetPtr); - // Dark density derivation (histograms not available when no SCD) - DeriveHighDarkAreaDensityFlag( - sequenceControlSetPtr, - pictureControlSetPtr); + // Dark density derivation (histograms not available when no SCD) + DeriveHighDarkAreaDensityFlag( + sequenceControlSetPtr, + pictureControlSetPtr); - // Detect and mark LCU and 32x32 CUs which belong to an isolated non-homogeneous region surrounding a homogenous and flat region. - DetermineIsolatedNonHomogeneousRegionInPicture( - sequenceControlSetPtr, - pictureControlSetPtr); + // Detect and mark LCU and 32x32 CUs which belong to an isolated non-homogeneous region surrounding a homogenous and flat region. + DetermineIsolatedNonHomogeneousRegionInPicture( + sequenceControlSetPtr, + pictureControlSetPtr); - // Detect aura areas in lighter background when subject is moving similar to background - DetermineMorePotentialAuraAreas( - sequenceControlSetPtr, - pictureControlSetPtr); + // Detect aura areas in lighter background when subject is moving similar to background + DetermineMorePotentialAuraAreas( + sequenceControlSetPtr, + pictureControlSetPtr); - // Activity statistics derivation - DerivePictureActivityStatistics( - sequenceControlSetPtr, - pictureControlSetPtr); + // Activity statistics derivation + DerivePictureActivityStatistics( + sequenceControlSetPtr, + pictureControlSetPtr); // Derive blockinessPresentFlag DeriveBlockinessPresentFlag( sequenceControlSetPtr, pictureControlSetPtr); - // Skin & Grass detection - GrassSkinPicture( - contextPtr, - pictureControlSetPtr); + // Skin & Grass detection + GrassSkinPicture( + contextPtr, + pictureControlSetPtr); // Complexity Classification ComplexityClassifier32x32( @@ -1678,9 +1678,9 @@ void* SourceBasedOperationsKernel(void *inputPtr) contextPtr->pictureDemuxResultsOutputFifoPtr, &outputResultsWrapperPtr); - outputResultsPtr = (PictureDemuxResults_t*)outputResultsWrapperPtr->objectPtr; + outputResultsPtr = (PictureDemuxResults_t*)outputResultsWrapperPtr->objectPtr; outputResultsPtr->pictureControlSetWrapperPtr = inputResultsPtr->pictureControlSetWrapperPtr; - outputResultsPtr->pictureType = EB_PIC_INPUT; + outputResultsPtr->pictureType = EB_PIC_INPUT; // Release the Input Results EbReleaseObject(inputResultsWrapperPtr); diff --git a/Source/Lib/Codec/EbSourceBasedOperationsProcess.h b/Source/Lib/Codec/EbSourceBasedOperationsProcess.h index 3ce13ed33..c2b67e83a 100644 --- a/Source/Lib/Codec/EbSourceBasedOperationsProcess.h +++ b/Source/Lib/Codec/EbSourceBasedOperationsProcess.h @@ -15,15 +15,15 @@ extern "C" { typedef struct CuComplexityInfo_s { - EB_U32 spatioTemporalWeight; - EB_U32 currentTemporalComplexity; - EB_U32 currentSpatialComplexity; - EB_U64 spatioTemporalComplexity; - EB_U32 currentMotionComplexity; - EB_U32 currentspatioTemporalComplexity; - EB_U32 spatialComplexity; - EB_U32 temporalComplexity; - EB_U8 complextityDecreaseFactor; + EB_U32 spatioTemporalWeight; + EB_U32 currentTemporalComplexity; + EB_U32 currentSpatialComplexity; + EB_U64 spatioTemporalComplexity; + EB_U32 currentMotionComplexity; + EB_U32 currentspatioTemporalComplexity; + EB_U32 spatialComplexity; + EB_U32 temporalComplexity; + EB_U8 complextityDecreaseFactor; } CuComplexityInfo_t; @@ -33,37 +33,37 @@ typedef struct CuComplexityInfo_s typedef struct SourceBasedOperationsContext_s { - EbFifo_t *initialrateControlResultsInputFifoPtr; - EbFifo_t *pictureDemuxResultsOutputFifoPtr; + EbFifo_t *initialrateControlResultsInputFifoPtr; + EbFifo_t *pictureDemuxResultsOutputFifoPtr; - // Delta QP Map - EB_S8 minDeltaQP; - EB_U8 maxDeltaQP; + // Delta QP Map + EB_S8 minDeltaQP; + EB_U8 maxDeltaQP; - EB_S16 minDeltaQpWeight[3][4]; - EB_S16 maxDeltaQpWeight[3][4]; + EB_S16 minDeltaQpWeight[3][4]; + EB_S16 maxDeltaQpWeight[3][4]; - // Skin - EB_U8 grassPercentageInPicture; - EB_U8 picturePercentageFaceSkinLcu; + // Skin + EB_U8 grassPercentageInPicture; + EB_U8 picturePercentageFaceSkinLcu; - // local zz cost array - EB_U32 pictureNumGrassLcu; + // local zz cost array + EB_U32 pictureNumGrassLcu; - EB_U32 highContrastNum; + EB_U32 highContrastNum; - EB_BOOL highDist; - EB_U32 countOfMovingLcus; - EB_U32 countOfNonMovingLcus; - EB_U64 yNonMovingMean; - EB_U64 yMovingMean; - EB_U32 toBeIntraCodedProbability; - EB_U32 depth1BlockNum; + EB_BOOL highDist; + EB_U32 countOfMovingLcus; + EB_U32 countOfNonMovingLcus; + EB_U64 yNonMovingMean; + EB_U64 yMovingMean; + EB_U32 toBeIntraCodedProbability; + EB_U32 depth1BlockNum; EB_U8 *yMeanPtr; - EB_U8 *crMeanPtr; - EB_U8 *cbMeanPtr; + EB_U8 *crMeanPtr; + EB_U8 *cbMeanPtr; } SourceBasedOperationsContext_t; @@ -73,8 +73,8 @@ typedef struct SourceBasedOperationsContext_s extern EB_ERRORTYPE SourceBasedOperationsContextCtor( SourceBasedOperationsContext_t **contextDblPtr, - EbFifo_t *initialrateControlResultsInputFifoPtr, - EbFifo_t *pictureDemuxResultsOutputFifoPtr); + EbFifo_t *initialrateControlResultsInputFifoPtr, + EbFifo_t *pictureDemuxResultsOutputFifoPtr); extern void* SourceBasedOperationsKernel(void *inputPtr); diff --git a/Source/Lib/Codec/EbSyntaxElements.h b/Source/Lib/Codec/EbSyntaxElements.h index 5ea243e64..b793d8d47 100644 --- a/Source/Lib/Codec/EbSyntaxElements.h +++ b/Source/Lib/Codec/EbSyntaxElements.h @@ -51,8 +51,8 @@ typedef enum NalRefIdc { #define EB_INTRA_MODE_32 32 #define EB_INTRA_MODE_33 33 #define EB_INTRA_MODE_34 34 -#define EB_INTRA_MODE_35 35 -#define EB_INTRA_MODE_4x4 36 +#define EB_INTRA_MODE_35 35 +#define EB_INTRA_MODE_4x4 36 #define EB_INTRA_MODE_INVALID ~0u #define EB_INTRA_CHROMA_PLANAR 0 diff --git a/Source/Lib/Codec/EbSystemResourceManager.c b/Source/Lib/Codec/EbSystemResourceManager.c index 4f39c69ce..7fb315f43 100644 --- a/Source/Lib/Codec/EbSystemResourceManager.c +++ b/Source/Lib/Codec/EbSystemResourceManager.c @@ -92,7 +92,7 @@ static EB_BOOL EbFifoPeakFront( return EB_TRUE; } else { - return EB_FALSE; + return EB_FALSE; } } @@ -197,7 +197,7 @@ static EB_ERRORTYPE EbCircularBufferPushFront( // Increment the Current Count ++bufferPtr->currentCount; - + return return_error; } @@ -321,18 +321,18 @@ static EB_ERRORTYPE EbMuxingQueueObjectPushBack( * EbMuxingQueueObjectPushFront **************************************/ static EB_ERRORTYPE EbMuxingQueueObjectPushFront( - EbMuxingQueue_t *queuePtr, - EbObjectWrapper_t *objectPtr) + EbMuxingQueue_t *queuePtr, + EbObjectWrapper_t *objectPtr) { - EB_ERRORTYPE return_error = EB_ErrorNone; + EB_ERRORTYPE return_error = EB_ErrorNone; - EbCircularBufferPushFront( - queuePtr->objectQueue, - objectPtr); + EbCircularBufferPushFront( + queuePtr->objectQueue, + objectPtr); - EbMuxingQueueAssignation(queuePtr); + EbMuxingQueueAssignation(queuePtr); - return return_error; + return return_error; } /********************************************************************* @@ -602,9 +602,9 @@ EB_ERRORTYPE EbReleaseObject( // Set liveCount to EB_ObjectWrapperReleasedValue objectPtr->liveCount = EB_ObjectWrapperReleasedValue; - EbMuxingQueueObjectPushFront( - objectPtr->systemResourcePtr->emptyQueue, - objectPtr); + EbMuxingQueueObjectPushFront( + objectPtr->systemResourcePtr->emptyQueue, + objectPtr); } diff --git a/Source/Lib/Codec/EbThreads.c b/Source/Lib/Codec/EbThreads.c index fee3919c4..941850248 100644 --- a/Source/Lib/Codec/EbThreads.c +++ b/Source/Lib/Codec/EbThreads.c @@ -34,11 +34,11 @@ #include void printfTime(const char *fmt, ...) { - va_list args; - va_start(args, fmt); + va_list args; + va_start(args, fmt); SVT_LOG(" [%i ms]\t", ((int)clock())); - vprintf(fmt, args); - va_end(args); + vprintf(fmt, args); + va_end(args); } #endif #endif diff --git a/Source/Lib/Codec/EbThreads.h b/Source/Lib/Codec/EbThreads.h index 05cf105d9..cca364075 100644 --- a/Source/Lib/Codec/EbThreads.h +++ b/Source/Lib/Codec/EbThreads.h @@ -109,12 +109,12 @@ extern cpu_set_t groupAffinity; pthread_setaffinity_np(*((pthread_t*)pointer),sizeof(cpu_set_t),&groupAffinity); \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ @@ -129,12 +129,12 @@ extern cpu_set_t groupAffinity; else { \ memoryMap[*(memoryMapIndex)].ptrType = pointerClass; \ memoryMap[(*(memoryMapIndex))++].ptr = pointer; \ - if (nElements % 8 == 0) { \ - *totalLibMemory += (nElements); \ - } \ - else { \ - *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ - } \ + if (nElements % 8 == 0) { \ + *totalLibMemory += (nElements); \ + } \ + else { \ + *totalLibMemory += ((nElements) + (8 - ((nElements) % 8))); \ + } \ } \ if (*(memoryMapIndex) >= MAX_NUM_PTR) { \ return EB_ErrorInsufficientResources; \ diff --git a/Source/Lib/Codec/EbTransQuantBuffers.c b/Source/Lib/Codec/EbTransQuantBuffers.c index 740d03305..9ecc50eaf 100644 --- a/Source/Lib/Codec/EbTransQuantBuffers.c +++ b/Source/Lib/Codec/EbTransQuantBuffers.c @@ -20,10 +20,10 @@ EB_ERRORTYPE EbTransQuantBuffersCtor( transCoeffInitArray.bitDepth = EB_16BIT; transCoeffInitArray.colorFormat = EB_YUV420; transCoeffInitArray.bufferEnableMask = PICTURE_BUFFER_DESC_FULL_MASK; - transCoeffInitArray.leftPadding = 0; - transCoeffInitArray.rightPadding = 0; - transCoeffInitArray.topPadding = 0; - transCoeffInitArray.botPadding = 0; + transCoeffInitArray.leftPadding = 0; + transCoeffInitArray.rightPadding = 0; + transCoeffInitArray.topPadding = 0; + transCoeffInitArray.botPadding = 0; transCoeffInitArray.splitMode = EB_FALSE; return_error = EbPictureBufferDescCtor( diff --git a/Source/Lib/Codec/EbTransQuantBuffers.h b/Source/Lib/Codec/EbTransQuantBuffers.h index 9613f1daa..c00fcaab3 100644 --- a/Source/Lib/Codec/EbTransQuantBuffers.h +++ b/Source/Lib/Codec/EbTransQuantBuffers.h @@ -14,19 +14,19 @@ extern "C" { #endif typedef struct EbTransQuantBuffers_s { - EbPictureBufferDesc_t *tuTransCoeff2Nx2NPtr; - EbPictureBufferDesc_t *tuTransCoeffNxNPtr; - EbPictureBufferDesc_t *tuTransCoeffN2xN2Ptr; - EbPictureBufferDesc_t *tuQuantCoeffNxNPtr; - EbPictureBufferDesc_t *tuQuantCoeffN2xN2Ptr; + EbPictureBufferDesc_t *tuTransCoeff2Nx2NPtr; + EbPictureBufferDesc_t *tuTransCoeffNxNPtr; + EbPictureBufferDesc_t *tuTransCoeffN2xN2Ptr; + EbPictureBufferDesc_t *tuQuantCoeffNxNPtr; + EbPictureBufferDesc_t *tuQuantCoeffN2xN2Ptr; } EbTransQuantBuffers_t; - + extern EB_ERRORTYPE EbTransQuantBuffersCtor( - EbTransQuantBuffers_t *transQuantBuffersPtr); - - + EbTransQuantBuffers_t *transQuantBuffersPtr); + + #ifdef __cplusplus } #endif diff --git a/Source/Lib/Codec/EbTransformUnit.h b/Source/Lib/Codec/EbTransformUnit.h index ab5abcc1a..99dc765cb 100644 --- a/Source/Lib/Codec/EbTransformUnit.h +++ b/Source/Lib/Codec/EbTransformUnit.h @@ -23,18 +23,18 @@ typedef struct TransformUnit_s { unsigned cbCbf : 1; unsigned crCbf : 1; unsigned lumaCbf : 1; - unsigned transCoeffShapeLuma : 2; - unsigned transCoeffShapeChroma : 2; - unsigned transCoeffShapeChroma2 : 2; + unsigned transCoeffShapeLuma : 2; + unsigned transCoeffShapeChroma : 2; + unsigned transCoeffShapeChroma2 : 2; unsigned cbCbf2 : 1; unsigned crCbf2 : 1; EB_U16 nzCoefCount[3]; - EB_BOOL isOnlyDc[3]; + EB_BOOL isOnlyDc[3]; EB_U16 nzCoefCount2[2]; EB_BOOL isOnlyDc2[3]; -} TransformUnit_t; +} TransformUnit_t; #pragma pack(pop) #ifdef __cplusplus } diff --git a/Source/Lib/Codec/EbTransforms.c b/Source/Lib/Codec/EbTransforms.c index 3968ffbf3..74213c065 100644 --- a/Source/Lib/Codec/EbTransforms.c +++ b/Source/Lib/Codec/EbTransforms.c @@ -13,107 +13,107 @@ #include "EbLambdaRateTables.h" static inline EB_U32 CheckNZero4x4( - EB_S16 *coeff, - EB_U32 coeffStride - ) + EB_S16 *coeff, + EB_U32 coeffStride + ) { - const EB_U32 stride = coeffStride / 4; + const EB_U32 stride = coeffStride / 4; - EB_U64 * coefPtr = (EB_U64 *)coeff; + EB_U64 * coefPtr = (EB_U64 *)coeff; - if (coefPtr[0] > 0) - return 1; - else if (coefPtr[stride] > 0) - return 1; - else if (coefPtr[2 * stride] > 0) - return 1; - else if (coefPtr[3 * stride] > 0) - return 1; + if (coefPtr[0] > 0) + return 1; + else if (coefPtr[stride] > 0) + return 1; + else if (coefPtr[2 * stride] > 0) + return 1; + else if (coefPtr[3 * stride] > 0) + return 1; - return 0; + return 0; } void MatMultOut( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32 *nonzerocoeff){ - - EB_U32 coeffLocation = 0, coeffOutLocation=0; - EB_U32 rowIndex, colIndex; - EB_S32 coeffTemp; - - *nonzerocoeff = 0; - - for (rowIndex = 0; rowIndex < computeSize; ++rowIndex) { - for (colIndex = 0; colIndex < computeSize; ++colIndex) { - coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex +rowIndex *maskingMatrixStride] + offset) >> shiftNum; - coeffTemp = (coeff[coeffLocation] < 0) ? -coeffTemp : coeffTemp; - - coeffOut[coeffOutLocation] = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp); - - (*nonzerocoeff) += (coeffTemp != 0); - ++coeffLocation; - ++coeffOutLocation; - } - coeffLocation += coeffStride - computeSize; - coeffOutLocation += coeffOutStride - computeSize; - } + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32 *nonzerocoeff){ + + EB_U32 coeffLocation = 0, coeffOutLocation=0; + EB_U32 rowIndex, colIndex; + EB_S32 coeffTemp; + + *nonzerocoeff = 0; + + for (rowIndex = 0; rowIndex < computeSize; ++rowIndex) { + for (colIndex = 0; colIndex < computeSize; ++colIndex) { + coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex +rowIndex *maskingMatrixStride] + offset) >> shiftNum; + coeffTemp = (coeff[coeffLocation] < 0) ? -coeffTemp : coeffTemp; + + coeffOut[coeffOutLocation] = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp); + + (*nonzerocoeff) += (coeffTemp != 0); + ++coeffLocation; + ++coeffOutLocation; + } + coeffLocation += coeffStride - computeSize; + coeffOutLocation += coeffOutStride - computeSize; + } } EB_ERRORTYPE PmEstimateQuantCoeffLuma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); EB_ERRORTYPE PmEstimateQuantCoeffChroma_SSE2( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, // Input: TU size - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, // Input: TU size + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); typedef EB_ERRORTYPE(*PM_RATE_EST_TYPE)( - CabacCost_t *CabacCost, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U32 size, - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_S16 *coeffBufferPtr, - const EB_U32 coeffStride, - EB_U32 componentType, - EB_U32 numNonZeroCoeffs, - EB_U64 *coeffBitsLong); + CabacCost_t *CabacCost, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U32 size, + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_S16 *coeffBufferPtr, + const EB_U32 coeffStride, + EB_U32 componentType, + EB_U32 numNonZeroCoeffs, + EB_U64 *coeffBitsLong); static PM_RATE_EST_TYPE FUNC_TABLE CoeffRateEst4x4_funcPtrArray[EB_ASM_TYPE_TOTAL][2/*Luma+Chroma*/] = { - { EstimateQuantizedCoefficients_Lossy, EstimateQuantizedCoefficients_Lossy }, - { PmEstimateQuantCoeffLuma_SSE2, PmEstimateQuantCoeffChroma_SSE2 } + { EstimateQuantizedCoefficients_Lossy, EstimateQuantizedCoefficients_Lossy }, + { PmEstimateQuantCoeffLuma_SSE2, PmEstimateQuantCoeffChroma_SSE2 } }; @@ -122,32 +122,32 @@ static PM_RATE_EST_TYPE FUNC_TABLE CoeffRateEst4x4_funcPtrArray[EB_ASM_TYPE_TOTA *****************************/ EB_U64 EbHevcGetPMCost( - EB_U64 lambda, - EB_U64 tuDistortion, - EB_U64 yTuCoeffBits - ); + EB_U64 lambda, + EB_U64 tuDistortion, + EB_U64 yTuCoeffBits + ); EB_ERRORTYPE TuEstimateCoeffBits_R( - EB_U32 tuOriginIndex, - EB_U32 tuChromaOriginIndex, - EB_U32 componentMask, - EntropyCoder_t *entropyCoderPtr, - EbPictureBufferDesc_t *coeffPtr, - EB_U32 yCountNonZeroCoeffs, - EB_U32 cbCountNonZeroCoeffs, - EB_U32 crCountNonZeroCoeffs, - EB_U64 *yTuCoeffBits, - EB_U64 *cbTuCoeffBits, - EB_U64 *crTuCoeffBits, - EB_U32 transformSize, - EB_U32 transformChromaSize, - EB_MODETYPE type, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 partialFrequencyN2Flag, + EB_U32 tuOriginIndex, + EB_U32 tuChromaOriginIndex, + EB_U32 componentMask, + EntropyCoder_t *entropyCoderPtr, + EbPictureBufferDesc_t *coeffPtr, + EB_U32 yCountNonZeroCoeffs, + EB_U32 cbCountNonZeroCoeffs, + EB_U32 crCountNonZeroCoeffs, + EB_U64 *yTuCoeffBits, + EB_U64 *cbTuCoeffBits, + EB_U64 *crTuCoeffBits, + EB_U32 transformSize, + EB_U32 transformChromaSize, + EB_MODETYPE type, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 partialFrequencyN2Flag, EB_BOOL coeffCabacUpdate, CoeffCtxtMdl_t *updatedCoeffCtxModel, - CabacCost_t *CabacCost); + CabacCost_t *CabacCost); /***************************** * Defines @@ -480,7 +480,7 @@ EB_ALIGN(16) const EB_S16 TransformAsmConst_SSE4_1[] = { #define M_25 25*PMP_MAX/100 #define M_20 20*PMP_MAX/100 #define M_10 10*PMP_MAX/100 -#define M_0 0*PMP_MAX/100 +#define M_0 0*PMP_MAX/100 // Level0 // 4K @@ -1230,22 +1230,22 @@ static const EB_U16 *MaskingMatrix[2][8][4] =// #define M_000 0 * PMP_MAX / 100 static const EB_U16 MaskingMatrix4x4_100[] = { - M_100, M_100, M_100, M_100, - M_100, M_100, M_100, M_100, - M_100, M_100, M_100, M_100, - M_100, M_100, M_100, M_100 + M_100, M_100, M_100, M_100, + M_100, M_100, M_100, M_100, + M_100, M_100, M_100, M_100, + M_100, M_100, M_100, M_100 }; static const EB_U16 MaskingMatrix4x4_70[] = { - M_70, M_70, M_70, M_70, - M_70, M_70, M_70, M_70, - M_70, M_70, M_70, M_70, - M_70, M_70, M_70, M_70 + M_70, M_70, M_70, M_70, + M_70, M_70, M_70, M_70, + M_70, M_70, M_70, M_70, + M_70, M_70, M_70, M_70 }; static const EB_U16 MaskingMatrix4x4_50[] = { - M_50, M_50, M_50, M_50, - M_50, M_50, M_50, M_50, - M_50, M_50, M_50, M_50, - M_50, M_50, M_50, M_50 + M_50, M_50, M_50, M_50, + M_50, M_50, M_50, M_50, + M_50, M_50, M_50, M_50, + M_50, M_50, M_50, M_50 }; // Group 0 (identity) @@ -1546,172 +1546,172 @@ static const EB_U16 MaskingMatrix32x32_2_1[] = { // Group3_1 // 4x4 static const EB_U16 MaskingMatrix4x4_3_1[] = { - M_095, M_095, M_000, M_000, - M_095, M_095, M_000, M_000, - M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, + M_095, M_095, M_000, M_000, + M_095, M_095, M_000, M_000, + M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, }; // 8x8 static const EB_U16 MaskingMatrix8x8_3_1[] = { - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 16x16 static const EB_U16 MaskingMatrix16x16_3_1[] = { - M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 32x32 static const EB_U16 MaskingMatrix32x32_3_1[] = { - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_090, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_090, M_090, M_090, M_090, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // Group4_1 // 4x4 static const EB_U16 MaskingMatrix4x4_4_1[] = { - M_095, M_080, M_000, M_000, - M_080, M_080, M_000, M_000, - M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, + M_095, M_080, M_000, M_000, + M_080, M_080, M_000, M_000, + M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, }; // 8x8 static const EB_U16 MaskingMatrix8x8_4_1[] = { - M_095, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_095, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 16x16 static const EB_U16 MaskingMatrix16x16_4_1[] = { - M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; // 32x32 static const EB_U16 MaskingMatrix32x32_4_1[] = { - M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_095, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_080, M_080, M_080, M_080, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_070, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, - M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, + M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, M_000, }; @@ -2064,18 +2064,18 @@ static const EB_U16 MaskingMatrix32x32_6[] = { // Set0 static const EB_U16 *MaskingMatrixSet0[8][4] = { - /************************* L01_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_1 }, - /************************* L23_SETTING *************************/ - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, - { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + /************************* L01_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_1 }, + /************************* L23_SETTING *************************/ + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + /************************* L45_SETTING *************************/ + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + /************************* L67_SETTING *************************/ + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, + { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, }; // Set1 static const EB_U16 *MaskingMatrixSet1[8][4] = @@ -2087,27 +2087,27 @@ static const EB_U16 *MaskingMatrixSet1[8][4] = { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, { MaskingMatrix4x4_1_1, MaskingMatrix8x8_1_1, MaskingMatrix16x16_1_1, MaskingMatrix32x32_2_1 }, /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, - { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, + { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, + { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, - { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, + { MaskingMatrix4x4_3_1, MaskingMatrix8x8_3_1, MaskingMatrix16x16_3_1, MaskingMatrix32x32_3_1 }, + { MaskingMatrix4x4_4_1, MaskingMatrix8x8_4_1, MaskingMatrix16x16_4_1, MaskingMatrix32x32_4_1 }, }; // Set1 1080P static const EB_U16 *MaskingMatrix1080PSet1[8][4] = { - /************************* L01_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0}, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2}, - /************************* L23_SETTING *************************/ - { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, - { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, - /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, - { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, - /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, - { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, + /************************* L01_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0}, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2}, + /************************* L23_SETTING *************************/ + { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, + { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, + /************************* L45_SETTING *************************/ + { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, + { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, + /************************* L67_SETTING *************************/ + { MaskingMatrix4x4_3, MaskingMatrix8x8_3, MaskingMatrix16x16_3, MaskingMatrix32x32_3}, + { MaskingMatrix4x4_4, MaskingMatrix8x8_4, MaskingMatrix16x16_4, MaskingMatrix32x32_4}, }; // Set2 @@ -2130,18 +2130,18 @@ static const EB_U16 *MaskingMatrixSet2[8][4] = static const EB_U16 *MaskingMatrix1080PSet0[8][4] = { - /************************* L01_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - /************************* L23_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - /************************* L45_SETTING *************************/ - { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, - /************************* L67_SETTING *************************/ - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, - { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, + /************************* L01_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + /************************* L23_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + /************************* L45_SETTING *************************/ + { MaskingMatrix4x4_0, MaskingMatrix8x8_0, MaskingMatrix16x16_0, MaskingMatrix32x32_0 }, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, + /************************* L67_SETTING *************************/ + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, + { MaskingMatrix4x4_1, MaskingMatrix8x8_1, MaskingMatrix16x16_1, MaskingMatrix32x32_2 }, }; @@ -2157,7 +2157,7 @@ void MatMult( const EB_U32 computeSize, const EB_S32 offset, const EB_S32 shiftNum, - EB_U32 *nonzerocoeff){ + EB_U32 *nonzerocoeff){ EB_U32 coeffLocation = 0; EB_U32 rowIndex, colIndex; @@ -2167,7 +2167,7 @@ void MatMult( for (rowIndex = 0; rowIndex < computeSize; ++rowIndex) { for (colIndex = 0; colIndex < computeSize; ++colIndex) { - coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex + rowIndex*maskingMatrixStride] + offset) >> shiftNum; + coeffTemp = (ABS(coeff[coeffLocation]) * maskingMatrix[colIndex + rowIndex*maskingMatrixStride] + offset) >> shiftNum; coeffTemp = (coeff[coeffLocation] < 0) ? -coeffTemp : coeffTemp; coeff[coeffLocation] = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp); @@ -2193,9 +2193,9 @@ void MaskTransformCoeffs( EB_U8 pmpMaskingClass = (sequenceControlSetPtr->inputResolution == INPUT_SIZE_4K_RANGE) ? 0 : 1; depthIndex = LOG2F(areaSize) - 2; - depthIndex = depthIndex < 4 ? depthIndex : 0; + depthIndex = depthIndex < 4 ? depthIndex : 0; - MatMul_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + MatMul_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, &MaskingMatrix[pmpMaskingClass][pmpMaskingLevelEncDec][depthIndex][0], @@ -2219,7 +2219,7 @@ void MaskTransformCoeffs( void PerformTwoStagePm( SequenceControlSet_t *sequenceControlSetPtr, PictureControlSet_t *pictureControlSetPtr, - EncDecContext_t *contextPtr, + EncDecContext_t *contextPtr, EB_S16 *coeff, const EB_U32 coeffStride, EB_S16 *quantCoeff, @@ -2233,8 +2233,8 @@ void PerformTwoStagePm( EB_U32 areaSize, const EB_U32 activeAreaSize, EB_U32 *yCountNonZeroCoeffs, - EB_U8 pmpMaskingLevelEncDec, - EB_MODETYPE type, + EB_U8 pmpMaskingLevelEncDec, + EB_MODETYPE type, EB_U32 componentType) { EbPMCand_t *pmCandBuffer = contextPtr->pmCandBuffer; @@ -2254,16 +2254,16 @@ void PerformTwoStagePm( const EB_U16 *maskingMatrixPtr = &MaskingMatrixSet1[pmpMaskingLevelEncDec][depthIndex][0]; - EB_U32 betta = 100; + EB_U32 betta = 100; - if (contextPtr->cuPtr->orgDeltaQp> 0) - { - betta = BETA_P * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); - } - else if (contextPtr->cuPtr->orgDeltaQp < 0) - { - betta = BETA_N * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); - } + if (contextPtr->cuPtr->orgDeltaQp> 0) + { + betta = BETA_P * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); + } + else if (contextPtr->cuPtr->orgDeltaQp < 0) + { + betta = BETA_N * 100 * ABS(contextPtr->cuPtr->orgDeltaQp); + } // Use a more agressive set for 50/60 fps clips if ((sequenceControlSetPtr->staticConfig.frameRate >> 16) > 30) @@ -2278,7 +2278,7 @@ void PerformTwoStagePm( *yCountNonZeroCoeffs = 0; // Do the Quantization to avoid extra compute for areas without non zero coefficient - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, quantCoeff, @@ -2301,7 +2301,7 @@ void PerformTwoStagePm( for (colBlkIter = 0; colBlkIter < activeAreaSize / 4; ++colBlkIter) { blkOffset = colBlkIter * 4 + (rowBlkIter * 4 * coeffStride); - if ( CheckNZero4x4(&quantCoeff[blkOffset], coeffStride) ) + if ( CheckNZero4x4(&quantCoeff[blkOffset], coeffStride) ) { //Fill the PM candidates @@ -2311,198 +2311,198 @@ void PerformTwoStagePm( EB_U32 alpha = ALPHA_1000; EB_U32 matrixBlkOffset = colBlkIter * 4 + (rowBlkIter * 4 * areaSize); - if (contextPtr->pmMode == PM_MODE_0){ // 4K - MaskingMap4x4Ptr[0] = &MaskingMatrixSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - MaskingMap4x4Ptr[1] = &MaskingMatrixSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - MaskingMap4x4Ptr[2] = &maskingMatrixPtr[matrixBlkOffset]; - - pmCandBuffer[candCount++].maskingLevel = 0; - pmCandBuffer[candCount++].maskingLevel = 1; - pmCandBuffer[candCount++].maskingLevel = 2; - - switch (pmpMaskingLevelEncDec){ - case 1: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 2: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0300; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 3: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0300; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - - case 4: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 5: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 6: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - case 7: - - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0500; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_1000; - } - break; - default: - break; - } - - } - else{ // PM_MODE_1 Sub 4K - - MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - - pmCandBuffer[candCount].maskingLevel = candCount; - candCount++; - MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; - pmCandBuffer[candCount].maskingLevel = candCount; - candCount++; - - switch (pmpMaskingLevelEncDec){ - case 1: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0000; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0000; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0000; - } - break; - case 2: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 3: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0050; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - - case 4: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0050; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 5: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0200; - } - break; - case 6: - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0100; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0050; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0100; - } - break; - case 7: - - if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld1){ - alpha = ALPHA_0200; - } - else if (colBlkIter + rowBlkIter < regionThrshld2){ - alpha = ALPHA_0200; - } - break; - default: - break; - } - } - - //to simulate chroma rate estimation bug. To embedd with above alpha setting later. - if (componentType != COMPONENT_LUMA) - alpha = alpha * 2; + if (contextPtr->pmMode == PM_MODE_0){ // 4K + MaskingMap4x4Ptr[0] = &MaskingMatrixSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + MaskingMap4x4Ptr[1] = &MaskingMatrixSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + MaskingMap4x4Ptr[2] = &maskingMatrixPtr[matrixBlkOffset]; + + pmCandBuffer[candCount++].maskingLevel = 0; + pmCandBuffer[candCount++].maskingLevel = 1; + pmCandBuffer[candCount++].maskingLevel = 2; + + switch (pmpMaskingLevelEncDec){ + case 1: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 2: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0300; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 3: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0300; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + + case 4: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 5: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 6: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + case 7: + + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0500; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_1000; + } + break; + default: + break; + } + + } + else{ // PM_MODE_1 Sub 4K + + MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet1[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + + pmCandBuffer[candCount].maskingLevel = candCount; + candCount++; + MaskingMap4x4Ptr[candCount] = &MaskingMatrix1080PSet0[pmpMaskingLevelEncDec][depthIndex][matrixBlkOffset]; + pmCandBuffer[candCount].maskingLevel = candCount; + candCount++; + + switch (pmpMaskingLevelEncDec){ + case 1: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0000; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0000; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0000; + } + break; + case 2: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 3: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0050; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + + case 4: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0050; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 5: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0200; + } + break; + case 6: + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0100; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0050; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0100; + } + break; + case 7: + + if (colBlkIter + rowBlkIter < regionThrshld0 || colBlkIter + rowBlkIter == 0){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld1){ + alpha = ALPHA_0200; + } + else if (colBlkIter + rowBlkIter < regionThrshld2){ + alpha = ALPHA_0200; + } + break; + default: + break; + } + } + + //to simulate chroma rate estimation bug. To embedd with above alpha setting later. + if (componentType != COMPONENT_LUMA) + alpha = alpha * 2; // Loop over candidates for (canDi = 0; canDi < candCount; canDi++) @@ -2510,26 +2510,26 @@ void PerformTwoStagePm( EbPMCand_t *pmCand = &pmCandBuffer[canDi]; - //There is Mismatch between ASM vs C ! - MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - &coeff[blkOffset], - coeffStride, - pmCand->trCoeff, - PM_STRIDE, - &MaskingMap4x4Ptr[pmCand->maskingLevel][0], - areaSize, - blkAreaSize, - (PMP_MAX >> 1), - PMP_PRECISION, - &pmCand->nzCoeff); - - // Bypass masking DC value, if it is greater than DC_TRSHLD1 - if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ - pmCand->trCoeff[0] = coeff[0]; - } - - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( + //There is Mismatch between ASM vs C ! + MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + &coeff[blkOffset], + coeffStride, + pmCand->trCoeff, + PM_STRIDE, + &MaskingMap4x4Ptr[pmCand->maskingLevel][0], + areaSize, + blkAreaSize, + (PMP_MAX >> 1), + PMP_PRECISION, + &pmCand->nzCoeff); + + // Bypass masking DC value, if it is greater than DC_TRSHLD1 + if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ + pmCand->trCoeff[0] = coeff[0]; + } + + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( pmCand->trCoeff, PM_STRIDE, pmCand->quCoeff, @@ -2544,10 +2544,10 @@ void PerformTwoStagePm( &pmCand->nzCoeff); //Cost calculation - EB_U64 sse[2]; + EB_U64 sse[2]; EB_U64 coeffBits = 0; - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( &coeff[blkOffset], coeffStride, pmCand->iqCoeff, @@ -2560,24 +2560,24 @@ void PerformTwoStagePm( EB_U32 shift = 2 * (7 - Log2f(areaSize)); sse[DIST_CALC_RESIDUAL] = (sse[DIST_CALC_RESIDUAL] + (EB_U64)(1 << (shift - 1))) >> shift; - if (pmCand->nzCoeff) - CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( - pictureControlSetPtr->cabacCost, - NULL, - 4, - type, - 0, - 0, - pmCand->quCoeff, - PM_STRIDE, - componentType, - pmCand->nzCoeff, - &coeffBits - ); + if (pmCand->nzCoeff) + CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( + pictureControlSetPtr->cabacCost, + NULL, + 4, + type, + 0, + 0, + pmCand->quCoeff, + PM_STRIDE, + componentType, + pmCand->nzCoeff, + &coeffBits + ); pmCand->cost = EbHevcGetPMCost( - (EB_U64)contextPtr->fullLambda*alpha*betta / 100 / 100, + (EB_U64)contextPtr->fullLambda*alpha*betta / 100 / 100, sse[DIST_CALC_RESIDUAL], coeffBits @@ -2603,38 +2603,38 @@ void PerformTwoStagePm( } void DecoupledQuantizeInvQuantizeLoops( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 componentType, - EB_U8 temporalLayerIndex, - EB_BOOL isUsedAsReferenceFlag, - EB_U8 chromaLambda, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 componentType, + EB_U8 temporalLayerIndex, + EB_BOOL isUsedAsReferenceFlag, + EB_U8 chromaLambda, EB_U16 qp, EB_U32 bitDepth, - CabacCost_t *CabacCost, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, + CabacCost_t *CabacCost, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, EB_RDOQ_PMCORE_TYPE useRdoType) { - EB_U32 coeffLocation = 0; - EB_U32 rowIndex, colIndex; + EB_U32 coeffLocation = 0; + EB_U32 rowIndex, colIndex; - EB_U32 adptive_qp_offset = q_offset; + EB_U32 adptive_qp_offset = q_offset; (void)chromaLambda; *nonzerocoeff = 0; @@ -2645,11 +2645,11 @@ void DecoupledQuantizeInvQuantizeLoops( #define RDCOST_ITERATION 3 - adptive_qp_offset = q_offset; - coeffLocation = 0; - *nonzerocoeff = 0; - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( - coeff, + adptive_qp_offset = q_offset; + coeffLocation = 0; + *nonzerocoeff = 0; + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][areaSize >> 3]( + coeff, coeffStride, quantCoeff, reconCoeff, @@ -2665,8 +2665,8 @@ void DecoupledQuantizeInvQuantizeLoops( EB_U64 coeffBitsLong = 0; EB_S32 rCoeffTmp, coeffTemp2; - EB_U64 rdoqBits_start = 0; - EB_BOOL first_non_zero_coef_done = EB_FALSE; + EB_U64 rdoqBits_start = 0; + EB_BOOL first_non_zero_coef_done = EB_FALSE; if (useRdoType == EB_RDOQ || useRdoType == EB_LIGHT) { @@ -2709,48 +2709,48 @@ void DecoupledQuantizeInvQuantizeLoops( coeffBitsLong = 0; - if (useRdoType == EB_LIGHT) { - if (*nonzerocoeff) { - if (!first_non_zero_coef_done) { - first_non_zero_coef_done = EB_TRUE; - - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - areaSize, - type, - intraLumaMode, - intraChromaMode, - quantCoeff, - coeffStride, - componentType, - *nonzerocoeff, - &coeffBitsLong); - rdoqBits_start = coeffBitsLong; - } - else { - coeffBitsLong = rdoqBits_start + ((rdoqBits_start * iteration * 4) / 1000); - } - } - rdoqBits[iteration] = coeffBitsLong; - } - else { - if (*nonzerocoeff) { - EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( - CabacCost, - cabacEncodeCtxPtr, - areaSize, - type, - intraLumaMode, - intraChromaMode, - quantCoeff, - coeffStride, - componentType, - *nonzerocoeff, - &coeffBitsLong); - } - rdoqBits[iteration] = coeffBitsLong; - } + if (useRdoType == EB_LIGHT) { + if (*nonzerocoeff) { + if (!first_non_zero_coef_done) { + first_non_zero_coef_done = EB_TRUE; + + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + areaSize, + type, + intraLumaMode, + intraChromaMode, + quantCoeff, + coeffStride, + componentType, + *nonzerocoeff, + &coeffBitsLong); + rdoqBits_start = coeffBitsLong; + } + else { + coeffBitsLong = rdoqBits_start + ((rdoqBits_start * iteration * 4) / 1000); + } + } + rdoqBits[iteration] = coeffBitsLong; + } + else { + if (*nonzerocoeff) { + EstimateQuantizedCoefficients[1][!!(ASM_TYPES & PREAVX2_MASK)]( + CabacCost, + cabacEncodeCtxPtr, + areaSize, + type, + intraLumaMode, + intraChromaMode, + quantCoeff, + coeffStride, + componentType, + *nonzerocoeff, + &coeffBitsLong); + } + rdoqBits[iteration] = coeffBitsLong; + } EB_U32 shift = 2 * (7 - Log2f(areaSize)); @@ -2797,175 +2797,175 @@ void DecoupledQuantizeInvQuantizeLoops( } else - if (useRdoType == EB_PMCORE){ - if (*nonzerocoeff && (componentType == COMPONENT_LUMA)){ + if (useRdoType == EB_PMCORE){ + if (*nonzerocoeff && (componentType == COMPONENT_LUMA)){ #define NUM_PM_CANDIDATE 3 - EB_U8 canDi; - EB_U8 candCount = 0; - EB_U64 bestCost = MAX_CU_COST; - EB_U32 bestCand = 0; - EB_U32 blkAreaSize = 4; - EB_U8 sampleIndex; - EB_U32 activeAreaSize = areaSize; - - EB_U32 depthIndex = LOG2F(areaSize) - 2; - depthIndex = depthIndex < 4 ? depthIndex : 0; - - // Initialize maskingMatrixPtr - const EB_U16 *MaskingMap4x4Ptr[NUM_PM_CANDIDATE]; - EbPMCand_t pmCandBuffer[NUM_PM_CANDIDATE]; - - - EB_U32 colBlkIter, rowBlkIter, blkOffset; - - *nonzerocoeff = 0; - // Loop over 4x4 blocks within each TU - for (rowBlkIter = 0; rowBlkIter < activeAreaSize / 4; ++rowBlkIter) { - for (colBlkIter = 0; colBlkIter < activeAreaSize / 4; ++colBlkIter) { - blkOffset = colBlkIter * 4 + (rowBlkIter * 4 * coeffStride); - - if (CheckNZero4x4(&quantCoeff[blkOffset], coeffStride)) - - { - //Fill the PM candidates - candCount = 0; - bestCost = MAX_CU_COST; - bestCand = 0; - - MaskingMap4x4Ptr[0] = &MaskingMatrix4x4_100[0]; - MaskingMap4x4Ptr[1] = &MaskingMatrix4x4_70[0]; - MaskingMap4x4Ptr[2] = &MaskingMatrix4x4_50[0]; - - pmCandBuffer[candCount++].maskingLevel = 0; - pmCandBuffer[candCount++].maskingLevel = 1; - pmCandBuffer[candCount++].maskingLevel = 2; - - - - // Loop over candidates - for (canDi = 0; canDi < candCount; canDi++) - { - - EbPMCand_t *pmCand = &pmCandBuffer[canDi]; - - //There is Mismatch between ASM vs C ! - MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( - &coeff[blkOffset], - coeffStride, - pmCand->trCoeff, - PM_STRIDE, - &MaskingMap4x4Ptr[pmCand->maskingLevel][0], - PM_STRIDE, - blkAreaSize, - (PMP_MAX >> 1), - PMP_PRECISION, - &pmCand->nzCoeff); - - // Bypass masking DC value, if it is greater than DC_TRSHLD1 - if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ - pmCand->trCoeff[0] = coeff[0]; - } - - - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( - pmCand->trCoeff, - PM_STRIDE, - pmCand->quCoeff, - pmCand->iqCoeff, - qFunc, - adptive_qp_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - blkAreaSize, - &pmCand->nzCoeff); - - //Cost calculation - EB_U64 sse[2]; - EB_U64 coeffBits = 0; - - FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( - &coeff[blkOffset], - coeffStride, - pmCand->iqCoeff, - PM_STRIDE, - sse, - blkAreaSize, - blkAreaSize); - - - EB_U32 shift = 2 * (7 - Log2f(areaSize)); - sse[DIST_CALC_RESIDUAL] = (sse[DIST_CALC_RESIDUAL] + (EB_U64)(1 << (shift - 1))) >> shift; - - if (pmCand->nzCoeff) - CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( - CabacCost, - NULL, - 4, - type, - 0, - 0, - pmCand->quCoeff, - PM_STRIDE, - componentType, - pmCand->nzCoeff, - &coeffBits - ); - - if (componentType == COMPONENT_CHROMA){ - - if (temporalLayerIndex == 0) { - sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else if (isUsedAsReferenceFlag) { - sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - else { - sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); - } - - pmCand->cost = sse[DIST_CALC_RESIDUAL] + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); - } else { - pmCand->cost = (sse[DIST_CALC_RESIDUAL] << COST_PRECISION) + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); - } - - - //determine best cost - if (pmCand->cost < bestCost){ - bestCost = pmCand->cost; - bestCand = canDi; - } - } - //overwrite regular path with best - EbPMCand_t *pmBestCand = &pmCandBuffer[bestCand]; - for (sampleIndex = 0; sampleIndex < blkAreaSize; sampleIndex++){ - EB_MEMCPY(&quantCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->quCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); - EB_MEMCPY(&reconCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->iqCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); - } - *nonzerocoeff += pmBestCand->nzCoeff; - } - } - } - } + EB_U8 canDi; + EB_U8 candCount = 0; + EB_U64 bestCost = MAX_CU_COST; + EB_U32 bestCand = 0; + EB_U32 blkAreaSize = 4; + EB_U8 sampleIndex; + EB_U32 activeAreaSize = areaSize; + + EB_U32 depthIndex = LOG2F(areaSize) - 2; + depthIndex = depthIndex < 4 ? depthIndex : 0; + + // Initialize maskingMatrixPtr + const EB_U16 *MaskingMap4x4Ptr[NUM_PM_CANDIDATE]; + EbPMCand_t pmCandBuffer[NUM_PM_CANDIDATE]; + + + EB_U32 colBlkIter, rowBlkIter, blkOffset; + + *nonzerocoeff = 0; + // Loop over 4x4 blocks within each TU + for (rowBlkIter = 0; rowBlkIter < activeAreaSize / 4; ++rowBlkIter) { + for (colBlkIter = 0; colBlkIter < activeAreaSize / 4; ++colBlkIter) { + blkOffset = colBlkIter * 4 + (rowBlkIter * 4 * coeffStride); + + if (CheckNZero4x4(&quantCoeff[blkOffset], coeffStride)) + + { + //Fill the PM candidates + candCount = 0; + bestCost = MAX_CU_COST; + bestCand = 0; + + MaskingMap4x4Ptr[0] = &MaskingMatrix4x4_100[0]; + MaskingMap4x4Ptr[1] = &MaskingMatrix4x4_70[0]; + MaskingMap4x4Ptr[2] = &MaskingMatrix4x4_50[0]; + + pmCandBuffer[candCount++].maskingLevel = 0; + pmCandBuffer[candCount++].maskingLevel = 1; + pmCandBuffer[candCount++].maskingLevel = 2; + + + + // Loop over candidates + for (canDi = 0; canDi < candCount; canDi++) + { + + EbPMCand_t *pmCand = &pmCandBuffer[canDi]; + + //There is Mismatch between ASM vs C ! + MatMulOut_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + &coeff[blkOffset], + coeffStride, + pmCand->trCoeff, + PM_STRIDE, + &MaskingMap4x4Ptr[pmCand->maskingLevel][0], + PM_STRIDE, + blkAreaSize, + (PMP_MAX >> 1), + PMP_PRECISION, + &pmCand->nzCoeff); + + // Bypass masking DC value, if it is greater than DC_TRSHLD1 + if (colBlkIter + rowBlkIter == 0 && ABS(quantCoeff[0]) > PM_DC_TRSHLD1){ + pmCand->trCoeff[0] = coeff[0]; + } + + + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][blkAreaSize >> 3]( + pmCand->trCoeff, + PM_STRIDE, + pmCand->quCoeff, + pmCand->iqCoeff, + qFunc, + adptive_qp_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + blkAreaSize, + &pmCand->nzCoeff); + + //Cost calculation + EB_U64 sse[2]; + EB_U64 coeffBits = 0; + + FullDistortionIntrinsic_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][pmCand->nzCoeff != 0][1][blkAreaSize >> 3]( + &coeff[blkOffset], + coeffStride, + pmCand->iqCoeff, + PM_STRIDE, + sse, + blkAreaSize, + blkAreaSize); + + + EB_U32 shift = 2 * (7 - Log2f(areaSize)); + sse[DIST_CALC_RESIDUAL] = (sse[DIST_CALC_RESIDUAL] + (EB_U64)(1 << (shift - 1))) >> shift; + + if (pmCand->nzCoeff) + CoeffRateEst4x4_funcPtrArray[!!(ASM_TYPES & PREAVX2_MASK)][componentType != COMPONENT_LUMA]( + CabacCost, + NULL, + 4, + type, + 0, + 0, + pmCand->quCoeff, + PM_STRIDE, + componentType, + pmCand->nzCoeff, + &coeffBits + ); + + if (componentType == COMPONENT_CHROMA){ + + if (temporalLayerIndex == 0) { + sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else if (isUsedAsReferenceFlag) { + sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaRefNonBase[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + else { + sse[DIST_CALC_RESIDUAL] = (((sse[DIST_CALC_RESIDUAL] * ChromaWeightFactorRaNonRef[qp]) + CHROMA_WEIGHT_OFFSET) >> CHROMA_WEIGHT_SHIFT); + } + + pmCand->cost = sse[DIST_CALC_RESIDUAL] + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); + } else { + pmCand->cost = (sse[DIST_CALC_RESIDUAL] << COST_PRECISION) + (((lambda * coeffBits) + MD_OFFSET) >> MD_SHIFT); + } + + + //determine best cost + if (pmCand->cost < bestCost){ + bestCost = pmCand->cost; + bestCand = canDi; + } + } + //overwrite regular path with best + EbPMCand_t *pmBestCand = &pmCandBuffer[bestCand]; + for (sampleIndex = 0; sampleIndex < blkAreaSize; sampleIndex++){ + EB_MEMCPY(&quantCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->quCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); + EB_MEMCPY(&reconCoeff[blkOffset + sampleIndex*coeffStride], &pmBestCand->iqCoeff[sampleIndex * PM_STRIDE], blkAreaSize*sizeof(EB_S16)); + } + *nonzerocoeff += pmBestCand->nzCoeff; + } + } + } + } } - coeffLocation = 0; - for (rowIndex = 0; rowIndex < areaSize; ++rowIndex) { - for (colIndex = 0; colIndex < areaSize; ++colIndex) { + coeffLocation = 0; + for (rowIndex = 0; rowIndex < areaSize; ++rowIndex) { + for (colIndex = 0; colIndex < areaSize; ++colIndex) { - //iQ - //coeffTemp = ( (CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, quantCoeff[quantLocation]) * shiftedFFunc) + iq_offset) >> shiftNum; - coeffTemp2 = ((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; - rCoeffTmp = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp2); - reconCoeff[coeffLocation] = (EB_S16)rCoeffTmp; + //iQ + //coeffTemp = ( (CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, quantCoeff[quantLocation]) * shiftedFFunc) + iq_offset) >> shiftNum; + coeffTemp2 = ((quantCoeff[coeffLocation] * shiftedFFunc) + iq_offset) >> shiftNum; + rCoeffTmp = (EB_S16)CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM, coeffTemp2); + reconCoeff[coeffLocation] = (EB_S16)rCoeffTmp; - ++coeffLocation; - } - coeffLocation += coeffStride - areaSize; - } + ++coeffLocation; + } + coeffLocation += coeffStride - areaSize; + } } @@ -2976,83 +2976,83 @@ void DecoupledQuantizeInvQuantizeLoops( * Unified Quant +iQuant *********************************************************************/ void UnifiedQuantizeInvQuantize( - EncDecContext_t *contextPtr, - PictureControlSet_t *pictureControlSetPtr, - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 bitDepth, - EB_U32 areaSize, - EB_PICTURE sliceType, - EB_U32 *yCountNonZeroCoeffs, - EB_U8 transCoeffShape, - EB_U8 cleanSparseCeoffPfEncDec, - EB_U8 pmpMaskingLevelEncDec, - EB_MODETYPE type, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag, - EB_U32 componentType, - EB_U32 temporalLayerIndex, - EB_U32 dZoffset, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost) + EncDecContext_t *contextPtr, + PictureControlSet_t *pictureControlSetPtr, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 bitDepth, + EB_U32 areaSize, + EB_PICTURE sliceType, + EB_U32 *yCountNonZeroCoeffs, + EB_U8 transCoeffShape, + EB_U8 cleanSparseCeoffPfEncDec, + EB_U8 pmpMaskingLevelEncDec, + EB_MODETYPE type, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag, + EB_U32 componentType, + EB_U32 temporalLayerIndex, + EB_U32 dZoffset, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost) { SequenceControlSet_t *sequenceControlSetPtr = (SequenceControlSet_t*)pictureControlSetPtr->ParentPcsPtr->sequenceControlSetWrapperPtr->objectPtr; - if (contextPtr->mdContext->rdoqPmCoreMethod){ - - //for the Quant - const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 - const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) - const EB_U32 qFunc = QFunc[qpRem]; // 15 bits - - const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit - - const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); - const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; - const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); - - //for the iQuant - const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT - const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; - const EB_S32 iq_offset = 1 << (shiftNum - 1); - - DecoupledQuantizeInvQuantizeLoops( - coeff, - coeffStride, - quantCoeff, - reconCoeff, - cabacEncodeCtxPtr, - lambda, - type, - intraLumaMode, - intraChromaMode, - componentType, - pictureControlSetPtr->temporalLayerIndex, - pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, + if (contextPtr->mdContext->rdoqPmCoreMethod){ + + //for the Quant + const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 + const EB_S32 qpPer = (EB_S32)QpDivSix[qp] + TRANS_BIT_INCREMENT; //the output is between 0 and 8+TRANS_BIT_INCREMENT (CHKN TRANS_BIT_INCREMENT = 0) + const EB_U32 qFunc = QFunc[qpRem]; // 15 bits + + const EB_U32 internalBitDepth = (EB_U32)bitDepth + TRANS_BIT_INCREMENT; //CHKN always 8 for 8 bit + + const EB_U32 transformShiftNum = MAX_TR_DYNAMIC_RANGE - internalBitDepth - Log2f(areaSize); + const EB_S32 shiftedQBits = QUANT_SHIFT + qpPer + transformShiftNum; + const EB_U32 q_offset = ((sliceType == EB_I_PICTURE || sliceType == EB_IDR_PICTURE) ? QUANT_OFFSET_I : QUANT_OFFSET_P) << (shiftedQBits - 9); + + //for the iQuant + const EB_S32 shiftedFFunc = (qpPer > 8) ? (EB_S32)FFunc[qpRem] << (qpPer - 2) : (EB_S32)FFunc[qpRem] << qpPer; // this is 6+8+TRANS_BIT_INCREMENT + const EB_S32 shiftNum = (qpPer > 8) ? QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum - 2 : QUANT_IQUANT_SHIFT - QUANT_SHIFT - transformShiftNum; + const EB_S32 iq_offset = 1 << (shiftNum - 1); + + DecoupledQuantizeInvQuantizeLoops( + coeff, + coeffStride, + quantCoeff, + reconCoeff, + cabacEncodeCtxPtr, + lambda, + type, + intraLumaMode, + intraChromaMode, + componentType, + pictureControlSetPtr->temporalLayerIndex, + pictureControlSetPtr->ParentPcsPtr->isUsedAsReferenceFlag, (EB_U8)contextPtr->fullChromaLambda, - (EB_U16)qp, + (EB_U16)qp, bitDepth, - CabacCost, - qFunc, - q_offset, - shiftedQBits, - shiftedFFunc, - iq_offset, - shiftNum, - areaSize, - &(*yCountNonZeroCoeffs), + CabacCost, + qFunc, + q_offset, + shiftedQBits, + shiftedFFunc, + iq_offset, + shiftNum, + areaSize, + &(*yCountNonZeroCoeffs), contextPtr->mdContext->rdoqPmCoreMethod); - } - else if (transCoeffShape == ONLY_DC_SHAPE) { + } + else if (transCoeffShape == ONLY_DC_SHAPE) { // Quant const EB_S32 qpRem = (EB_S32)QpModSix[qp]; //the output is between 0-5 @@ -3121,7 +3121,7 @@ void UnifiedQuantizeInvQuantize( EB_U32 activeAreaSize = areaSize >> transCoeffShape; - if (contextPtr->pmMethod && componentType != COMPONENT_LUMA) { + if (contextPtr->pmMethod && componentType != COMPONENT_LUMA) { if (pmpMaskingLevelEncDec) { @@ -3136,7 +3136,7 @@ void UnifiedQuantizeInvQuantize( } //QiQ SSSE3 is hardcoded //QiQ Use this for SW - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, quantCoeff, @@ -3177,7 +3177,7 @@ void UnifiedQuantizeInvQuantize( } else { - QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( + QiQ_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)][activeAreaSize >> 3]( coeff, coeffStride, quantCoeff, @@ -3257,7 +3257,7 @@ void UnifiedQuantizeInvQuantize( enableCbflag, enableContouringQCUpdateFlag); } - } + } } /********************************************************************* @@ -3282,7 +3282,7 @@ EB_ERRORTYPE EstimateTransform( EB_U32 transformSizeFlag = Log2f(TRANSFORM_MAX_SIZE) - Log2f(transformSize); if (transCoeffShape == DEFAULT_SHAPE) { - (*transformFunctionTableEstimate[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( + (*transformFunctionTableEstimate[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( residualBuffer, residualStride, coeffBuffer, @@ -3294,7 +3294,7 @@ EB_ERRORTYPE EstimateTransform( else if (transCoeffShape == N2_SHAPE) { - (*PfreqN2TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( + (*PfreqN2TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( residualBuffer, residualStride, coeffBuffer, @@ -3305,7 +3305,7 @@ EB_ERRORTYPE EstimateTransform( else if (transCoeffShape == N4_SHAPE) { - (*PfreqN4TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( + (*PfreqN4TransformTable0[!!(ASM_TYPES & AVX2_MASK)][transformSizeFlag + dstTansformFlag])( residualBuffer, residualStride, coeffBuffer, @@ -3317,7 +3317,7 @@ EB_ERRORTYPE EstimateTransform( EB_S32 sumResidual; - sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( residualBuffer, transformSize, residualStride); @@ -3426,7 +3426,7 @@ EB_ERRORTYPE EncodeTransform( EB_S32 sumResidual; - sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + sumResidual = SumResidual_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( residualBuffer, transformSize, residualStride); @@ -3472,7 +3472,7 @@ EB_ERRORTYPE EstimateInvTransform( // but in order to avoid extra copying, it is overwritten in place. The // input(residualBuffer) is the LCU residual buffer if (partialFrequencyN2Flag == EB_FALSE) { - (*invTransformFunctionTableEstimate[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( + (*invTransformFunctionTableEstimate[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( coeffBuffer, coeffStride, reconBuffer, @@ -3528,7 +3528,7 @@ EB_ERRORTYPE EncodeInvTransform( invTranformedDcCoef = (EB_S16) CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM,((64 * dcCoef + offset1st) >> shift1st)); invTranformedDcCoef = (EB_S16) CLIP3(MIN_NEG_16BIT_NUM, MAX_POS_16BIT_NUM,((64 * invTranformedDcCoef + offset2nd) >> shift2nd)); - memset16bitBlock_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( + memset16bitBlock_funcPtrArray[!!(ASM_TYPES & AVX2_MASK)]( reconBuffer, reconStride, transformSize, @@ -3542,7 +3542,7 @@ EB_ERRORTYPE EncodeInvTransform( // The input of this function is the quantized_inversequantized transformed residual // but in order to avoid extra copying, it is overwritten in place. The // input(residualBuffer) is the LCU residual buffer - (*invTransformFunctionTableEncode[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( + (*invTransformFunctionTableEncode[!!(ASM_TYPES & PREAVX2_MASK)][transformSizeFlag + dstTransformFlag])( coeffBuffer, coeffStride, reconBuffer, diff --git a/Source/Lib/Codec/EbTransforms.h b/Source/Lib/Codec/EbTransforms.h index eb30f4747..aebb3ad53 100644 --- a/Source/Lib/Codec/EbTransforms.h +++ b/Source/Lib/Codec/EbTransforms.h @@ -23,35 +23,35 @@ extern "C" { #endif -static const EB_U32 QFunc[] = {26214,23302,20560,18396,16384,14564}; +static const EB_U32 QFunc[] = {26214,23302,20560,18396,16384,14564}; static const EB_U32 FFunc[] = {40,45,51,57,64,72}; //QP in [0..63] static const EB_U8 QpModSix[]= { - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, - 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, + 0, 1, 2, 3, 4, 5, 0, 1, 2, 3 }; static const EB_U8 QpDivSix[]= { - 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, + 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10,10 @@ -87,34 +87,34 @@ extern EB_ERRORTYPE InvQuantize( extern void UnifiedQuantizeInvQuantize( - EncDecContext_t *contextPtr, - - PictureControlSet_t *pictureControlSetPtr, - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - EB_U32 qp, - EB_U32 bitDepth, - EB_U32 areaSize, - EB_PICTURE sliceType, - EB_U32 *yCountNonZeroCoeffs, - EB_TRANS_COEFF_SHAPE transCoeffShape, - - EB_U8 cleanSparseCeoffPfEncDec, - EB_U8 pmpMaskingLevelEncDec, - EB_MODETYPE type, - EB_U32 enableCbflag, - EB_U8 enableContouringQCUpdateFlag, - EB_U32 componentType, - EB_U32 temporalLayerIndex, - EB_U32 dZoffset, - - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - CabacCost_t *CabacCost); + EncDecContext_t *contextPtr, + + PictureControlSet_t *pictureControlSetPtr, + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + EB_U32 qp, + EB_U32 bitDepth, + EB_U32 areaSize, + EB_PICTURE sliceType, + EB_U32 *yCountNonZeroCoeffs, + EB_TRANS_COEFF_SHAPE transCoeffShape, + + EB_U8 cleanSparseCeoffPfEncDec, + EB_U8 pmpMaskingLevelEncDec, + EB_MODETYPE type, + EB_U32 enableCbflag, + EB_U8 enableContouringQCUpdateFlag, + EB_U32 componentType, + EB_U32 temporalLayerIndex, + EB_U32 dZoffset, + + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + CabacCost_t *CabacCost); extern EB_ERRORTYPE EncodeTransform( @@ -129,14 +129,14 @@ extern EB_ERRORTYPE EncodeTransform( EB_TRANS_COEFF_SHAPE transCoeffShape); extern EB_ERRORTYPE EstimateTransform( - EB_S16 *residualBuffer, - EB_U32 residualStride, - EB_S16 *coeffBuffer, - EB_U32 coeffStride, - EB_U32 transformSize, - EB_S16 *transformInnerArrayPtr, - EB_U32 bitIncrement, - EB_BOOL dstTansformFlag, + EB_S16 *residualBuffer, + EB_U32 residualStride, + EB_S16 *coeffBuffer, + EB_U32 coeffStride, + EB_U32 transformSize, + EB_S16 *transformInnerArrayPtr, + EB_U32 bitIncrement, + EB_BOOL dstTansformFlag, EB_TRANS_COEFF_SHAPE transCoeffShape); @@ -152,7 +152,7 @@ extern EB_ERRORTYPE EstimateInvTransform( EB_U32 partialFrequencyN2Flag); extern EB_ERRORTYPE EncodeInvTransform( - EB_BOOL isOnlyDc, + EB_BOOL isOnlyDc, EB_S16 *coeffBuffer, EB_U32 coeffStride, EB_S16 *reconBuffer, @@ -169,36 +169,36 @@ extern EB_ERRORTYPE CalculateCbf( EB_U32 transformSize, EB_U32 *cbfBuffer); extern EB_U8 MapChromaQp( - EB_U8 qp - ); + EB_U8 qp + ); extern void DecoupledQuantizeInvQuantizeLoops( EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16 *quantCoeff, - EB_S16 *reconCoeff, - CabacEncodeContext_t *cabacEncodeCtxPtr, - EB_U64 lambda, - EB_MODETYPE type, // Input: CU type (INTRA, INTER) - EB_U32 intraLumaMode, - EB_U32 intraChromaMode, - EB_U32 componentType, - EB_U8 temporalLayerIndex, - EB_BOOL isUsedAsReferenceFlag, - EB_U8 chromaLambda, + const EB_U32 coeffStride, + EB_S16 *quantCoeff, + EB_S16 *reconCoeff, + CabacEncodeContext_t *cabacEncodeCtxPtr, + EB_U64 lambda, + EB_MODETYPE type, // Input: CU type (INTRA, INTER) + EB_U32 intraLumaMode, + EB_U32 intraChromaMode, + EB_U32 componentType, + EB_U8 temporalLayerIndex, + EB_BOOL isUsedAsReferenceFlag, + EB_U8 chromaLambda, EB_U16 qp, EB_U32 bitDepth, - CabacCost_t *CabacCost, - const EB_U32 qFunc, - const EB_U32 q_offset, - const EB_S32 shiftedQBits, - const EB_S32 shiftedFFunc, - const EB_S32 iq_offset, - const EB_S32 shiftNum, - const EB_U32 areaSize, - EB_U32 *nonzerocoeff, + CabacCost_t *CabacCost, + const EB_U32 qFunc, + const EB_U32 q_offset, + const EB_S32 shiftedQBits, + const EB_S32 shiftedFFunc, + const EB_S32 iq_offset, + const EB_S32 shiftNum, + const EB_U32 areaSize, + EB_U32 *nonzerocoeff, EB_RDOQ_PMCORE_TYPE rdoType); @@ -222,7 +222,7 @@ typedef void(*EB_QIQ_TYPE)( const EB_S32 iq_offset, const EB_S32 shiftNum, const EB_U32 areaSize, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); typedef void(*EB_MAT_MUL_TYPE)( EB_S16 *coeff, @@ -232,7 +232,7 @@ typedef void(*EB_MAT_MUL_TYPE)( const EB_U32 computeSize, const EB_S32 offset, const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); extern void MatMult( EB_S16 *coeff, @@ -242,36 +242,36 @@ extern void MatMult( const EB_U32 computeSize, const EB_S32 offset, const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_U32 *nonzerocoeff); typedef void(*EB_MAT_OUT_MUL_TYPE)( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32 *nonzerocoeff); void MatMultOut( - EB_S16 *coeff, - const EB_U32 coeffStride, - EB_S16* coeffOut, - const EB_U32 coeffOutStride, - const EB_U16 *maskingMatrix, - const EB_U32 maskingMatrixStride, - const EB_U32 computeSize, - const EB_S32 offset, - const EB_S32 shiftNum, - EB_U32 *nonzerocoeff); + EB_S16 *coeff, + const EB_U32 coeffStride, + EB_S16* coeffOut, + const EB_U32 coeffOutStride, + const EB_U16 *maskingMatrix, + const EB_U32 maskingMatrixStride, + const EB_U32 computeSize, + const EB_S32 offset, + const EB_S32 shiftNum, + EB_U32 *nonzerocoeff); static EB_MAT_OUT_MUL_TYPE FUNC_TABLE MatMulOut_funcPtrArray[EB_ASM_TYPE_TOTAL] = { - MatMultOut, - MatMult4x4_OutBuff_AVX2_INTRIN, + MatMultOut, + MatMult4x4_OutBuff_AVX2_INTRIN, }; @@ -296,23 +296,23 @@ typedef void(*EB_INVTRANSFORM_FUNC)( * Function Tables *****************************/ static EB_QIQ_TYPE FUNC_TABLE QiQ_funcPtrArray[EB_ASM_TYPE_TOTAL][5] = { - // C_DEFAULT - { + // C_DEFAULT + { /*0 4x4 */ QuantizeInvQuantize, /*1 8x8 */ QuantizeInvQuantize, /*2 16x16 */ QuantizeInvQuantize, /*3 */ (EB_QIQ_TYPE)QiQVoidFunc, /*4 32x32 */ QuantizeInvQuantize - }, - // AVX2 - { - /*0 4x4 */ QuantizeInvQuantize4x4_SSE3, - /*1 8x8 */ QuantizeInvQuantize8x8_AVX2_INTRIN, - /*2 16x16 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, - /*3 */ (EB_QIQ_TYPE)QiQVoidFunc, - /*4 32x32 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, - - }, + }, + // AVX2 + { + /*0 4x4 */ QuantizeInvQuantize4x4_SSE3, + /*1 8x8 */ QuantizeInvQuantize8x8_AVX2_INTRIN, + /*2 16x16 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, + /*3 */ (EB_QIQ_TYPE)QiQVoidFunc, + /*4 32x32 */ QuantizeInvQuantizeNxN_AVX2_INTRIN, + + }, }; static EB_MAT_MUL_TYPE FUNC_TABLE MatMul_funcPtrArray[EB_ASM_TYPE_TOTAL][5] = { @@ -339,8 +339,8 @@ static EB_MAT_MUL_TYPE FUNC_TABLE MatMul_funcPtrArray[EB_ASM_TYPE_TOTAL][5] = { static const EB_TRANSFORM_FUNC transformFunctionTableEstimate[EB_ASM_TYPE_TOTAL][5] = { // C_DEFAULT { - Transform32x32Estimate, - Transform16x16Estimate, + Transform32x32Estimate, + Transform16x16Estimate, Transform8x8, Transform4x4, DstTransform4x4 diff --git a/Source/Lib/Codec/EbUtility.c b/Source/Lib/Codec/EbUtility.c index 95b903289..b0c822844 100644 --- a/Source/Lib/Codec/EbUtility.c +++ b/Source/Lib/Codec/EbUtility.c @@ -236,35 +236,35 @@ const CodedUnitStats_t* GetCodedUnitStats(const EB_U32 cuIdx) } static const TransformUnitStats_t TransformUnitStatsArray[] = { - // - // depth - // / - // / offsetX (units of the current depth) - // / / - // / / offsetY (units of the current depth) - // / / / - {0, 0, 0}, // 0 - {1, 0, 0}, // 1 - {1, 2, 0}, // 2 - {1, 0, 2}, // 3 - {1, 2, 2}, // 4 - {2, 0, 0}, // 5 - {2, 1, 0}, // 6 - {2, 0, 1}, // 7 - {2, 1, 1}, // 8 - {2, 2, 0}, // 9 - {2, 3, 0}, // 10 - {2, 2, 1}, // 11 - {2, 3, 1}, // 12 - { 2, 0, 2}, // 13 - { 2, 1, 2}, // 14 - { 2, 0, 3}, // 15 - { 2, 1, 3}, // 16 - { 2, 2, 2}, // 17 - { 2, 3, 2}, // 18 - { 2, 2, 3}, // 19 - { 2, 3, 3}, // 20 - {0xFF, 0xFF, 0xFF} // Invalid + // + // depth + // / + // / offsetX (units of the current depth) + // / / + // / / offsetY (units of the current depth) + // / / / + {0, 0, 0}, // 0 + {1, 0, 0}, // 1 + {1, 2, 0}, // 2 + {1, 0, 2}, // 3 + {1, 2, 2}, // 4 + {2, 0, 0}, // 5 + {2, 1, 0}, // 6 + {2, 0, 1}, // 7 + {2, 1, 1}, // 8 + {2, 2, 0}, // 9 + {2, 3, 0}, // 10 + {2, 2, 1}, // 11 + {2, 3, 1}, // 12 + { 2, 0, 2}, // 13 + { 2, 1, 2}, // 14 + { 2, 0, 3}, // 15 + { 2, 1, 3}, // 16 + { 2, 2, 2}, // 17 + { 2, 3, 2}, // 18 + { 2, 2, 3}, // 19 + { 2, 3, 3}, // 20 + {0xFF, 0xFF, 0xFF} // Invalid }; /************************************************************** @@ -352,22 +352,22 @@ EB_U64 Log2fHighPrecision(EB_U64 x, EB_U8 precision) static const MiniGopStats_t MiniGopStatsArray[] = { - // HierarchicalLevels StartIndex EndIndex Lenght miniGopIndex - { 5, 0, 31, 32 }, // 0 - { 4, 0, 15, 16 }, // 1 - { 3, 0, 7, 8 }, // 2 - { 2, 0, 3, 4 }, // 3 - { 2, 4, 7, 4 }, // 4 - { 3, 8, 15, 8 }, // 5 - { 2, 8, 11, 4 }, // 6 - { 2, 12, 15, 4 }, // 7 - { 4, 16, 31, 16 }, // 8 - { 3, 16, 23, 8 }, // 9 - { 2, 16, 19, 4 }, // 10 - { 2, 20, 23, 4 }, // 11 - { 3, 24, 31, 8 }, // 12 - { 2, 24, 27, 4 }, // 13 - { 2, 28, 31, 4 } // 14 + // HierarchicalLevels StartIndex EndIndex Lenght miniGopIndex + { 5, 0, 31, 32 }, // 0 + { 4, 0, 15, 16 }, // 1 + { 3, 0, 7, 8 }, // 2 + { 2, 0, 3, 4 }, // 3 + { 2, 4, 7, 4 }, // 4 + { 3, 8, 15, 8 }, // 5 + { 2, 8, 11, 4 }, // 6 + { 2, 12, 15, 4 }, // 7 + { 4, 16, 31, 16 }, // 8 + { 3, 16, 23, 8 }, // 9 + { 2, 16, 19, 4 }, // 10 + { 2, 20, 23, 4 }, // 11 + { 3, 24, 31, 8 }, // 12 + { 2, 24, 27, 4 }, // 13 + { 2, 28, 31, 4 } // 14 }; /************************************************************** diff --git a/Source/Lib/Codec/EbUtility.h b/Source/Lib/Codec/EbUtility.h index d21e45f73..eb2a2f9b3 100644 --- a/Source/Lib/Codec/EbUtility.h +++ b/Source/Lib/Codec/EbUtility.h @@ -75,10 +75,10 @@ extern EB_U32 EndianSwap(EB_U32 ui); #ifdef _MSC_VER #define MULTI_LINE_MACRO_BEGIN do { #define MULTI_LINE_MACRO_END \ - __pragma(warning(push)) \ - __pragma(warning(disable:4127)) \ - } while(0) \ - __pragma(warning(pop)) + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + } while(0) \ + __pragma(warning(pop)) #else #define MULTI_LINE_MACRO_BEGIN do { #define MULTI_LINE_MACRO_END } while(0) @@ -112,7 +112,7 @@ extern EB_U32 EndianSwap(EB_U32 ui); // rounds down to the next power of two #define FLOOR_POW2(x) \ MULTI_LINE_MACRO_BEGIN \ - (x) |= ((x) >> 1); \ + (x) |= ((x) >> 1); \ (x) |= ((x) >> 2); \ (x) |= ((x) >> 4); \ (x) |= ((x) >> 8); \ @@ -123,7 +123,7 @@ extern EB_U32 EndianSwap(EB_U32 ui); // rounds up to the next power of two #define CEIL_POW2(x) \ MULTI_LINE_MACRO_BEGIN \ - (x) -= 1; \ + (x) -= 1; \ (x) |= ((x) >> 1); \ (x) |= ((x) >> 2); \ (x) |= ((x) >> 4); \ @@ -166,37 +166,37 @@ extern EB_U32 EndianSwap(EB_U32 ui); #define MAX_UNSIGNED_VALUE ~0u #define MIN_SIGNED_VALUE ~0 - ((signed) (~0u >> 1)) #define MAX_SIGNED_VALUE ((signed) (~0u >> 1)) -#define MINI_GOP_MAX_COUNT 15 -#define MINI_GOP_WINDOW_MAX_COUNT 8 // widow subdivision: 8 x 3L +#define MINI_GOP_MAX_COUNT 15 +#define MINI_GOP_WINDOW_MAX_COUNT 8 // widow subdivision: 8 x 3L -#define MIN_HIERARCHICAL_LEVEL 2 +#define MIN_HIERARCHICAL_LEVEL 2 static const EB_U32 MiniGopOffset[4] = { 1, 3, 7, 31 }; typedef struct MiniGopStats_s { - EB_U32 hierarchicalLevels; - EB_U32 startIndex; - EB_U32 endIndex; - EB_U32 lenght; + EB_U32 hierarchicalLevels; + EB_U32 startIndex; + EB_U32 endIndex; + EB_U32 lenght; } MiniGopStats_t; extern const MiniGopStats_t* GetMiniGopStats(const EB_U32 miniGopIndex); typedef enum MINI_GOP_INDEX { - L6_INDEX = 0, - L5_0_INDEX = 1, - L4_0_INDEX = 2, - L3_0_INDEX = 3, - L3_1_INDEX = 4, - L4_1_INDEX = 5, - L3_2_INDEX = 6, - L3_3_INDEX = 7, - L5_1_INDEX = 8, - L4_2_INDEX = 9, - L3_4_INDEX = 10, - L3_5_INDEX = 11, - L4_3_INDEX = 12, - L3_6_INDEX = 13, - L3_7_INDEX = 14 + L6_INDEX = 0, + L5_0_INDEX = 1, + L4_0_INDEX = 2, + L3_0_INDEX = 3, + L3_1_INDEX = 4, + L4_1_INDEX = 5, + L3_2_INDEX = 6, + L3_3_INDEX = 7, + L5_1_INDEX = 8, + L4_2_INDEX = 9, + L3_4_INDEX = 10, + L3_5_INDEX = 11, + L4_3_INDEX = 12, + L3_6_INDEX = 13, + L3_7_INDEX = 14 } MINI_GOP_INDEX; void EbHevcStartTime(EB_U64 *Startseconds, EB_U64 *Startuseconds);